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

编译器/解释器

开发平台:

Others

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