Advertisement
Guest User

Untitled

a guest
Nov 12th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. lexer grammar CoolLexer;
  2.  
  3. tokens { ERROR }
  4.  
  5. @members{
  6. private void raiseError(String msg) {
  7. setText(msg);
  8. setType(ERROR);
  9. }
  10.  
  11. private void raiseUnmatchedChar(String other) {
  12. raiseError("Invalid character: " + other);
  13. }
  14.  
  15. private void processString(String msg) {
  16. String value = msg.substring(1, msg.length()-1);
  17.  
  18. value = value.replace("\\n", "\n");
  19. value = value.replace("\\t", "\t");
  20. value = value.replace("\\b", "\b");
  21. value = value.replace("\\f", "\f");
  22.  
  23. for (int i = 0; i < value.length(); i++) {
  24.  
  25. if (value.charAt(i) == '\\' && value.charAt(i+1) != '\\') {
  26. value = value.substring(0, i) + value.substring(i+1);
  27. }
  28.  
  29. // if (value.charAt(i) == '\n') {
  30. // raiseError("Unterminated string constant");
  31. // return;
  32. // }
  33.  
  34. if (value.charAt(i) == '\u0000') {
  35. raiseError("String contains null character");
  36. return;
  37. }
  38. }
  39.  
  40. if (value.length() > 1024) {
  41. raiseError("String constant too long");
  42.  
  43. } else {
  44. setText(value);
  45. }
  46. }
  47. }
  48.  
  49. CLASS: 'class';
  50. INHERITS: 'inherits';
  51. IF: 'if';
  52. THEN: 'then';
  53. ELSE: 'else';
  54. FI: 'fi';
  55. WHILE: 'while';
  56. LOOP: 'loop';
  57. POOL: 'pool';
  58. LET: 'let';
  59. IN: 'in';
  60. CASE: 'case';
  61. OF: 'of';
  62. ESAC: 'esac';
  63. NEW: 'new';
  64. ISVOID: 'isvoid';
  65. TRUE: 'true';
  66. FALSE: 'false';
  67. NOT: 'not';
  68.  
  69. AT : '@';
  70. SC: ';';
  71. COLON: ':';
  72. COMMA: ',';
  73. GETS: '<-';
  74.  
  75. MUL : '*' ; // assigns token name to '*' used above in grammar
  76. DIV : '/' ;
  77. MOD : '%' ;
  78. ADD : '+' ;
  79. SUB : '-' ;
  80.  
  81. TILD: '~';
  82. LESSEQ: '<=';
  83. LESS: '<';
  84. EQUAL: '=';
  85.  
  86. RES: '=>';
  87. DOT: '.';
  88. OPENBR: '(';
  89. CLOSEDBR: ')';
  90. OPENCBR: '{';
  91. CLOSEDCBR: '}';
  92.  
  93. fragment LOWERCASE_LETTER: [a-z];
  94. fragment UPPERCASE_LETTER: [A-Z];
  95. TYPE : UPPERCASE_LETTER (LOWERCASE_LETTER | UPPERCASE_LETTER | DIGIT)* | 'SELF_TYPE';
  96.  
  97. fragment LETTER: LOWERCASE_LETTER | UPPERCASE_LETTER;
  98. fragment DIGIT : [0-9];
  99. fragment NZDIGIT : [1-9];
  100. ID : (LETTER | '_') (LETTER | DIGIT | '_')*;
  101.  
  102. INTEGER : '0' | NZDIGIT (DIGIT)*;
  103.  
  104. STRING : '"' ('\\"' |.)*?
  105. ('"' {processString(getText());}
  106. | EOF {raiseError("EOF in string constant");}
  107. | '\u0000' {raiseError("EOF in string constant");});
  108.  
  109. WS
  110. : [ \n\f\r\t]+ -> skip
  111. ;
  112.  
  113. BLOCK_COMMENT
  114. : '(*' (BLOCK_COMMENT|.)*? ('*)' {setType(SKIP);}| EOF {raiseError("EOF in comment");});
  115.  
  116. SINGLECOMM: '--'(.)*?'\n' -> skip;
  117.  
  118. ERRORCOMM: '*)' {raiseError("Unmatched *)");};
  119. OTHER: .{raiseUnmatchedChar(getText());};
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement