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

编译器/解释器

开发平台:

Others

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