expr.g
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:2k
源码类别:

编译器/解释器

开发平台:

Others

  1. options {
  2. language="Cpp";
  3. }
  4. {
  5. #include <iostream>
  6. }
  7. class ExprParser extends Parser;
  8. options {
  9. codeGenMakeSwitchThreshold = 3;
  10. codeGenBitsetTestThreshold = 4;
  11. buildAST=true;
  12. // ASTLabelType = "antlr.CommonAST"; // change default of "AST"
  13. }
  14. expr : assignExpr EOF! ;
  15. assignExpr
  16. : addExpr
  17. (
  18. ASSIGN^
  19. assignExpr 
  20. )?
  21. ;
  22. addExpr
  23. : multExpr 
  24. (
  25. pm:PLUS_MINUS^
  26. me:multExpr
  27. exception 
  28. catch [ ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex ] 
  29. std::cout << "Caught error in addExpr" << std::endl;
  30. reportError(ex.toString()); 
  31. }
  32. )*
  33. ;
  34. multExpr
  35. : postfixExpr
  36. (
  37. MULT_DIV^
  38. postfixExpr
  39. )*
  40. ;
  41. postfixExpr
  42. : (id:ID LPAREN)=>
  43. // Matches function call syntax like "id(arg,arg)" 
  44. id2:ID^
  45. (
  46.          parenArgs
  47. )?
  48. | atom
  49. ;
  50. parenArgs
  51. :
  52.       LPAREN!
  53.       (
  54.          assignExpr
  55.          (
  56.             COMMA!
  57.         assignExpr
  58.          )*
  59.       )?
  60.       RPAREN!
  61. ;
  62. atom
  63. : ID
  64. | INT
  65. | CHAR_LITERAL 
  66. | STRING_LITERAL
  67. | LPAREN! assignExpr RPAREN!
  68. ;
  69. class ExprLexer extends Lexer;
  70. WS_ : (' '
  71. | 't'
  72. | 'n'
  73. | 'r')
  74. { _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP; }
  75. ;
  76. LPAREN: '('
  77. ;
  78. RPAREN: ')'
  79. ;
  80. PLUS_MINUS: '+' | '-'
  81. ;
  82. MULT_DIV : '*' | '/'
  83.    ;
  84. ASSIGN : '='
  85. ;
  86. COMMA : ','
  87.    ;
  88.    
  89. CHAR_LITERAL
  90. : ''' (ESC|~''') '''
  91. ;
  92. STRING_LITERAL
  93. : '"' (ESC|~'"')* '"'
  94. ;
  95. protected
  96. ESC : '\'
  97. ( 'n'
  98. | 'r'
  99. | 't'
  100. | 'b'
  101. | 'f'
  102. | '"'
  103. | '''
  104. | '\'
  105. | ('0'..'3')
  106. (
  107. options {
  108. warnWhenFollowAmbig = false;
  109. }
  110. : ('0'..'9')
  111. (
  112. options {
  113. warnWhenFollowAmbig = false;
  114. }
  115. : '0'..'9'
  116. )?
  117. )?
  118. | ('4'..'7')
  119. (
  120. options {
  121. warnWhenFollowAmbig = false;
  122. }
  123. : ('0'..'9')
  124. )?
  125. )
  126. ;
  127. protected
  128. DIGIT
  129. : '0'..'9'
  130. ;
  131. INT 
  132. : (DIGIT)+
  133. ;
  134. ID
  135. options {
  136. testLiterals = true;
  137. }
  138. : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
  139. ;