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

编译器/解释器

开发平台:

Others

  1. class LangParser extends Parser;
  2. options {
  3. codeGenMakeSwitchThreshold = 3;
  4. codeGenBitsetTestThreshold = 4;
  5. buildAST=true;
  6. }
  7. block
  8. : LCURLY^ ( statement )* RCURLY!
  9. ;
  10. statement
  11. : expr SEMI!
  12. | "if"^ LPAREN! expr RPAREN! statement
  13. ( "else"! statement )?
  14. | "while"^ LPAREN! expr RPAREN! statement
  15. |! b:block { statement_AST = b_AST; }
  16. // do some manual tree returning
  17. ;
  18. expr: assignExpr
  19. ;
  20. assignExpr
  21. : aexpr (ASSIGN^ assignExpr)?
  22. ;
  23. aexpr
  24. : mexpr (PLUS^ mexpr)*
  25. ;
  26. mexpr
  27. : atom (STAR^ atom)*
  28. ;
  29. atom: ID
  30. | INT
  31. ;
  32. class LangWalker extends TreeParser;
  33. block
  34. : #( LCURLY ( stat )+ )
  35. ;
  36. stat: #("if" expr stat (stat)?)
  37. | #("while" expr stat)
  38. | expr
  39. | block
  40. ;
  41. expr: #(ASSIGN expr expr) {System.out.println("found assign");}
  42. | #(PLUS expr expr) {System.out.println("found +");}
  43. | #(STAR expr expr) {System.out.println("found *");}
  44. | a:ID {System.out.println("found ID "+a.getText());}
  45. | b:INT {System.out.println("found INT "+b.getText());}
  46. ;
  47. class LangLexer extends Lexer;
  48. WS : (' '
  49. | 't'
  50. | 'n'
  51. | 'r')
  52. { _ttype = Token.SKIP; }
  53. ;
  54. LPAREN: '('
  55. ;
  56. RPAREN: ')'
  57. ;
  58. LCURLY: '{'
  59. ;
  60. RCURLY: '}'
  61. ;
  62. STAR: '*'
  63. ;
  64. PLUS: '+'
  65. ;
  66. ASSIGN
  67. : '='
  68. ;
  69. SEMI: ';'
  70. ;
  71. COMMA
  72. : ','
  73. ;
  74. protected
  75. ESC : '\'
  76. ( 'n'
  77. | 'r'
  78. | 't'
  79. | 'b'
  80. | 'f'
  81. | '"'
  82. | '''
  83. | '\'
  84. | ('0'..'3') ( DIGIT (DIGIT)? )?
  85. | ('4'..'7') (DIGIT)?
  86. )
  87. ;
  88. protected
  89. DIGIT
  90. : '0'..'9'
  91. ;
  92. INT : (DIGIT)+
  93. ;
  94. ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
  95. {
  96. Integer i = (Integer)literals.get(getText());
  97. if ( i!=null ) {
  98. _ttype =  i.intValue();
  99. }
  100. }
  101. ;