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

编译器/解释器

开发平台:

Others

  1. options {
  2. language=Cpp;
  3. }
  4. class CalcParser extends Parser;
  5. options {
  6. buildAST = true; // uses CommonAST by default
  7. // ASTLabelType = "antlr.CommonAST";
  8. }
  9. expr
  10. : mexpr (PLUS^ mexpr)* SEMI!
  11. ;
  12. mexpr
  13. : atom (STAR^ atom)*
  14. ;
  15. atom: INT
  16. ;
  17. class CalcLexer extends Lexer;
  18. WS_ : (' '
  19. | 't'
  20. | 'n'
  21. | 'r')
  22. { _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP; }
  23. ;
  24. LPAREN: '('
  25. ;
  26. RPAREN: ')'
  27. ;
  28. STAR: '*'
  29. ;
  30. PLUS: '+'
  31. ;
  32. SEMI: ';'
  33. ;
  34. protected
  35. DIGIT
  36. : '0'..'9'
  37. ;
  38. INT : (DIGIT)+
  39. ;
  40. class CalcTreeWalker extends TreeParser;
  41. options {
  42. buildAST = true;
  43. // ASTLabelType = "antlr.CommonAST";
  44. }
  45. expr:! #(PLUS left:expr right:expr)
  46. {
  47. if ( #right->getType()==INT &&
  48.  atoi(#right->getText().c_str())==0 ) // x+0
  49. {
  50. #expr = #left;
  51. }
  52. else if ( #left->getType()==INT &&
  53.   atoi(#left->getText().c_str())==0 ) // 0+x
  54. {
  55. #expr = #right;
  56. }
  57. else { // x+y
  58. #expr = #(PLUS, left, right);
  59. }
  60. }
  61. | #(STAR expr expr)
  62. | i:INT
  63. ;