Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.41 KB | None | 0 0
  1. /* JFlex example: part of Java language lexer specification */
  2. package it.unisa.compilatori.jflex;
  3. import java_cup.runtime.*;
  4. import it.unisa.compilatori.jflex.*;
  5. import java.lang.*;
  6. import java.util.Arrays;
  7. import java.util.HashMap;
  8. import java.util.Set;
  9. import java.util.HashSet;
  10.  
  11.  
  12. %%
  13.  
  14. %class Lexer
  15. %unicode
  16. %cupsym Sym
  17. %cup
  18. %line
  19. %column
  20.  
  21. %{
  22. HashMap<String,SymbolCustom> symbolTable = new HashMap<>();
  23. Set<Character> SEPARATORS;
  24.  
  25. StringBuffer string = new StringBuffer();
  26. private SymbolCustom symbol(int type, String name) {
  27. return new SymbolCustom(type, name, yyline, yycolumn);
  28. }
  29. private SymbolCustom symbol(int type, String name, Object value) {
  30. return new SymbolCustom(type, name, yyline, yycolumn, value);
  31. }
  32.  
  33. private void populateKeyWord(){
  34. symbolTable.put("if", symbol(Sym.IF_KEYWORD,"if"));
  35. symbolTable.put("then", symbol(Sym.THEN_KEYWORD,"then"));
  36. symbolTable.put("else", symbol(Sym.ELSE_KEYWORD,"else"));
  37. symbolTable.put("while", symbol(Sym.WHILE_KEYWORD,"while"));
  38. symbolTable.put("int", symbol(Sym.INT_KEYWORD,"int"));
  39. symbolTable.put("float",symbol(Sym.FLOAT_KEYWORD,"float"));
  40. symbolTable.put("function",symbol(Sym.FUNCTION_KEYWORD,"function"));
  41. symbolTable.put("main",symbol(Sym.MAIN_KEYWORD,"main"));
  42. symbolTable.put("end",symbol(Sym.END_KEYWORD,"end"));
  43. symbolTable.put("do",symbol(Sym.DO_KEYWORD,"do"));
  44. symbolTable.put("local",symbol(Sym.LOCAL_KEYWORD,"local"));
  45. symbolTable.put("return",symbol(Sym.RETURN_KEYWORD,"return"));
  46. symbolTable.put("for",symbol(Sym.FOR_KEYWORD,"for"));
  47. symbolTable.put("nil",symbol(Sym.NIL_CONST,"nil"));
  48. symbolTable.put("bool",symbol(Sym.BOOL_KEYWORD,"bool"));
  49. symbolTable.put("string",symbol(Sym.STRING_KEYWORD,"string"));
  50. symbolTable.put("nop",symbol(Sym.NOP_CONST,"nop"));
  51. symbolTable.put("true",symbol(Sym.TRUE_KEYWORD,"true"));
  52. symbolTable.put("false",symbol(Sym.FALSE_KEYWORD,"false"));
  53. symbolTable.put("not",symbol(Sym.NOT_RELOP,"not"));
  54. symbolTable.put("global",symbol(Sym.GLOBAL_KEYWORD,"global"));
  55. symbolTable.put("and",symbol(Sym.AND_RELOP,"and"));
  56. symbolTable.put("or", symbol(Sym.OR_RELOP, "or"));
  57.  
  58. }
  59.  
  60. private void populateSeparators() {
  61. Character[] SEPARS = new Character[] {';', ',', '(', ')', '{', '}'};
  62. SEPARATORS = new HashSet<>(Arrays.asList(SEPARS));
  63. }
  64.  
  65. private void installIdentifier(String lessema){
  66. if(symbolTable.containsKey(lessema))
  67. return;
  68. symbolTable.put(lessema, symbol(Sym.IDENTIFIER,"id",lessema));
  69.  
  70. }
  71.  
  72. private void installIntegerNumber(String lessema){
  73. if (symbolTable.containsKey(lessema))
  74. return;
  75. symbolTable.put(lessema, symbol(Sym.INTEGER_CONST,"INTEGER_CONST",lessema));
  76. }
  77.  
  78. private void installFloatNumber(String lessema){
  79. if (symbolTable.containsKey(lessema))
  80. return;
  81. symbolTable.put(lessema, symbol(Sym.FLOAT_CONST,"FLOAT_CONST",lessema));
  82. }
  83.  
  84. private void installString(String lessema){
  85.  
  86. if(symbolTable.containsKey(lessema))
  87. return;
  88. symbolTable.put(lessema,symbol(Sym.STRING_CONST,"STRING_CONST",lessema));
  89. }
  90. %}
  91.  
  92. %init{
  93.  
  94. populateKeyWord();
  95. //populateSeparators();
  96.  
  97. %init}
  98.  
  99.  
  100. LineTerminator = \r|\n|\r\n
  101. //InputCharacter = [^\r\n]
  102. WhiteSpace = {LineTerminator} | [ \t\f\n]
  103.  
  104. Identifier = [:jletter:] [:jletterdigit:]*
  105. //Expo = ([eE][-+]?(0 | [1-9] [0-9]*))
  106. DecIntegerConstant = 0 | [+-]?[1-9][0-9]*
  107. DecFloatConstant = [-+]?(0 | [1-9][0-9]*)\.( [0] | [0-9]*[1-9])
  108. %state STRING_CONST
  109.  
  110. %%
  111.  
  112.  
  113. /* keywords */
  114. <YYINITIAL> "if" { return symbol(Sym.IF_KEYWORD,"IF");}
  115. <YYINITIAL> "then" { return symbol(Sym.THEN_KEYWORD,"THEN"); }
  116. <YYINITIAL> "else" { return symbol(Sym.ELSE_KEYWORD,"ELSE"); }
  117. <YYINITIAL> "while" { return symbol(Sym.WHILE_KEYWORD,"WHILE"); }
  118. <YYINITIAL> "int" { return symbol(Sym.INT_KEYWORD,"INT"); }
  119. <YYINITIAL> "float" { return symbol(Sym.FLOAT_KEYWORD,"FLOAT"); }
  120. <YYINITIAL> "function" { return symbol(Sym.FUNCTION_KEYWORD,"FUNCTION"); }
  121. <YYINITIAL> "main" { return symbol(Sym.MAIN_KEYWORD,"MAIN"); }
  122. <YYINITIAL> "end" { return symbol(Sym.END_KEYWORD,"END"); }
  123. <YYINITIAL> "do" { return symbol(Sym.DO_KEYWORD,"DO"); }
  124. <YYINITIAL> "local" { return symbol(Sym.LOCAL_KEYWORD,"LOCAL"); }
  125. <YYINITIAL> "return" { return symbol(Sym.RETURN_KEYWORD,"RETURN"); }
  126. <YYINITIAL> "for" { return symbol(Sym.FOR_KEYWORD,"FOR"); }
  127. <YYINITIAL> "nil" { return symbol(Sym.NIL_CONST,"NIL"); }
  128. <YYINITIAL> "bool" { return symbol(Sym.BOOL_KEYWORD,"BOOL"); }
  129. <YYINITIAL> "string" { return symbol(Sym.STRING_CONST,"STRING"); }
  130. <YYINITIAL> "nop" { return symbol(Sym.NOP_CONST,"NOP"); }
  131. <YYINITIAL> "true" { return symbol(Sym.TRUE_CONST,"TRUE"); }
  132. <YYINITIAL> "false" { return symbol(Sym.FALSE_CONST,"FALSE"); }
  133. <YYINITIAL> "global" { return symbol(Sym.GLOBAL_KEYWORD,"GLOBAL"); }
  134. <YYINITIAL> "!=" { return symbol(Sym.NE_OP,"NEQUAL"); }
  135.  
  136.  
  137.  
  138. <YYINITIAL> {
  139.  
  140. /* operators */
  141. "=" {return symbol(Sym.ASSIGN, "ASSIGN"); }
  142. "and" {return symbol(Sym.AND_RELOP, "AND"); }
  143. "or" {return symbol(Sym.OR_RELOP,"OR");}
  144. ">" {return symbol(Sym.GT_RELOP, "GT", ">"); }
  145. ">=" {return symbol(Sym.GE_RELOP, "GE", ">="); }
  146. "<" {return symbol(Sym.LT_RELOP, "LT", "<"); }
  147. "<=" {return symbol(Sym.LE_RELOP, "LE", "<="); }
  148. "==" {return symbol(Sym.IE_RELOP, "IE", "=="); }
  149. "not" {return symbol(Sym.NOT_RELOP, "NOT"); }
  150. "#" {return symbol(Sym.SHAR_RELOP,"SHARP");}
  151. "+" {return symbol(Sym.PLUS_OP,"PLUS");}
  152. "-" {return symbol(Sym.MINUS_OP,"MINUS");}
  153. "*" {return symbol(Sym.TIMES_OP,"TIMES");}
  154. "/" {return symbol(Sym.DIV_OP,"DIV");}
  155. "<==" {return symbol(Sym.READ,"READ");}
  156. "==>" {return symbol(Sym.WRITE,"WRITE");}
  157. "!=" {return symbol(Sym.NE_OP,"NEQUAL");}
  158.  
  159.  
  160. /* identifiers */
  161. {Identifier} {
  162. installIdentifier(yytext());
  163. return symbol(Sym.IDENTIFIER,"ID",yytext());
  164. }
  165.  
  166. /* CONSTANTS */
  167.  
  168. {DecFloatConstant} {
  169. installFloatNumber(yytext());
  170. return symbol(Sym.FLOAT_CONST, "FLOAT_CONST",yytext());
  171. }
  172.  
  173. {DecIntegerConstant} {
  174. installIntegerNumber(yytext());
  175. return symbol(Sym.INTEGER_CONST, "INTEGER_CONST",yytext());
  176. }
  177.  
  178. \" {
  179. string.setLength(0);
  180. yybegin(STRING_CONST);
  181. }
  182.  
  183.  
  184.  
  185.  
  186.  
  187. /* whitespace */
  188. {WhiteSpace} { /* ignore */ }
  189.  
  190. /* Separators */
  191. ";" {return symbol(Sym.SEMI_DEL, "SEMI", ";"); }
  192. "," {return symbol(Sym.COMMA_DEL, "COMMA", ","); }
  193. "(" {return symbol(Sym.OPEN_ROUND_BRACKET_DEL, "LPAR", "("); }
  194. ")" {return symbol(Sym.CLOSE_ROUND_BRACKET_DEL, "RPAR", ")"); }
  195. ":" {return symbol(Sym.COLON_DEL, "COLON", ":"); }
  196. "{" {return symbol(Sym.OPEN_CURLY_DEL, "BLPAR", "\u007B"); }
  197. "}" {return symbol(Sym.CLOSE_CURLY_DEL, "BRPAR", "\u007D"); }
  198. "[" {return symbol(Sym.OPEN_SQUARE_BRACKET_DEL, "SLPAR", "\u005B"); }
  199. "]" {return symbol(Sym.CLOSE_SQUARE_BRACKET_DEL, "SRPAR", "\u005D"); }
  200.  
  201.  
  202.  
  203. }
  204.  
  205.  
  206. <STRING_CONST> {
  207. \" {
  208. yybegin(YYINITIAL);
  209. installString(string.toString());
  210. return symbol(Sym.STRING_CONST,"STRING_CONST",string.toString());
  211. }
  212. [^\n\r\"\\]+ { string.append( yytext() ); }
  213. \\t { string.append('\t'); }
  214. \\n { string.append('\n'); }
  215. \\r { string.append('\r'); }
  216. \\\" { string.append('\"'); }
  217. \\ { string.append('\\'); }
  218. }
  219.  
  220. /* error fallback */
  221. [^] { throw new Error("Illegal character <"+yytext()+">,line: " + yyline + " column: " + yycolumn); }
  222. <<EOF>> {return new SymbolCustom(Sym.EOF,"EOF");}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement