Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.22 KB | None | 0 0
  1. package me.minkizz.minlang;
  2.  
  3. import java.io.IOException;
  4. import java.nio.file.Files;
  5. import java.nio.file.Paths;
  6. import java.util.HashSet;
  7. import java.util.Set;
  8. import java.util.stream.Stream;
  9.  
  10. public class Lexer {
  11. private StringBuilder input = new StringBuilder();
  12. private Token token;
  13. private String lexema;
  14. private boolean exhausted;
  15. private String errorMessage = "";
  16. private static Set<Character> blankChars = new HashSet<Character>();
  17.  
  18. static {
  19. blankChars.add('r');
  20. blankChars.add('n');
  21. blankChars.add((char) 8);
  22. blankChars.add((char) 9);
  23. blankChars.add((char) 11);
  24. blankChars.add((char) 12);
  25. blankChars.add((char) 32);
  26. }
  27.  
  28. public Lexer(String filePath) {
  29.  
  30. try (Stream<String> st = Files.lines(Paths.get(filePath))) {
  31. st.forEach(input::append);
  32. } catch (IOException ex) {
  33. exhausted = true;
  34. errorMessage = "Could not read file: " + filePath;
  35. return;
  36. }
  37.  
  38. moveAhead();
  39. }
  40.  
  41. public void moveAhead() {
  42.  
  43. if (exhausted) {
  44. return;
  45. }
  46.  
  47. if (input.length() == 0) {
  48. exhausted = true;
  49. return;
  50. }
  51.  
  52. ignoreWhiteSpaces();
  53.  
  54. if (findNextToken()) {
  55. return;
  56. }
  57.  
  58. exhausted = true;
  59.  
  60. if (input.length() > 0) {
  61. errorMessage = "Unexpected symbol: '" + input.charAt(0) + "'";
  62. }
  63.  
  64. }
  65.  
  66. private void ignoreWhiteSpaces() {
  67. int charsToDelete = 0;
  68.  
  69. while (blankChars.contains(input.charAt(charsToDelete))) {
  70. charsToDelete++;
  71. }
  72.  
  73. if (charsToDelete > 0) {
  74. input.delete(0, charsToDelete);
  75. }
  76.  
  77. }
  78.  
  79. private boolean findNextToken() {
  80.  
  81. for (Token t : Token.values()) {
  82. int end = t.endOfMatch(input.toString());
  83.  
  84. if (end != -1) {
  85. token = t;
  86. lexema = input.substring(0, end);
  87. input.delete(0, end);
  88. return true;
  89. }
  90.  
  91. }
  92.  
  93. return false;
  94. }
  95.  
  96. public Token currentToken() {
  97. return token;
  98. }
  99.  
  100. public String currentLexema() {
  101. return lexema;
  102. }
  103.  
  104. public boolean isSuccessful() {
  105. return errorMessage.isEmpty();
  106. }
  107.  
  108. public String errorMessage() {
  109. return errorMessage;
  110. }
  111.  
  112. public boolean isExhausted() {
  113. return exhausted;
  114. }
  115.  
  116. }
  117.  
  118. package me.minkizz.minlang;
  119.  
  120. import java.util.regex.Matcher;
  121. import java.util.regex.Pattern;
  122.  
  123. public enum Token {
  124.  
  125. PRINT_KEYWORD("print\b"), PRINTLN_KEYWORD("println\b"), OPEN_PARENTHESIS("\("), CLOSE_PARENTHESIS("\)"),
  126. STRING(""[^"]+""), NUMBER("\d+(\.\d+)?");
  127.  
  128. private final Pattern pattern;
  129.  
  130. Token(String regex) {
  131. pattern = Pattern.compile("^" + regex);
  132. }
  133.  
  134. int endOfMatch(String s) {
  135. Matcher m = pattern.matcher(s);
  136.  
  137. if (m.find()) {
  138. return m.end();
  139. }
  140.  
  141. return -1;
  142. }
  143.  
  144. }
  145.  
  146. package me.minkizz.minlang;
  147.  
  148. public class Main {
  149.  
  150. public static void main(String[] args) {
  151. new Main();
  152. }
  153.  
  154. public Main() {
  155. long start = System.nanoTime();
  156. Interpreter.execute("C:\Users\leodu\OneDrive\Bureau\minlang.txt");
  157. long end = System.nanoTime();
  158. System.out
  159. .println("Program executed in " + (end - start) + "ns (" + Math.round((end - start) / 1000000) + "ms)");
  160. }
  161.  
  162. }
  163.  
  164. package me.minkizz.minlang;
  165.  
  166. public class Interpreter {
  167.  
  168. private static Token previousToken;
  169.  
  170. public static void execute(String fileName) {
  171. Lexer lexer = new Lexer(fileName);
  172.  
  173. while (!lexer.isExhausted()) {
  174. Token token = lexer.currentToken();
  175. String lexema = lexer.currentLexema();
  176.  
  177. if (previousToken != null) {
  178.  
  179. if (token == Token.STRING || token == Token.NUMBER) {
  180.  
  181. if (previousToken == Token.PRINT_KEYWORD) {
  182. System.out.print(lexema);
  183. } else if (previousToken == Token.PRINTLN_KEYWORD) {
  184. System.out.println(lexema);
  185. }
  186.  
  187. }
  188.  
  189. }
  190.  
  191. previousToken = token;
  192.  
  193. lexer.moveAhead();
  194. }
  195.  
  196. }
  197.  
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement