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

编译器/解释器

开发平台:

Others

  1. header {
  2. #include <iostream>
  3. }
  4. options {
  5. language=Cpp;
  6. }
  7. class LangParser extends Parser;
  8. options {
  9. buildAST=true;
  10. }
  11. tokens {
  12. BLOCK; // imaginary token
  13. }
  14. block
  15. : LCURLY! ( statement )* RCURLY!
  16. // add imaginary BLOCK node on top of statement list
  17. {#block = #([BLOCK, "BLOCK"], #block);}
  18. ;
  19. statement
  20. : ID ASSIGN^ expr SEMI!
  21. | "if"^ LPAREN! expr RPAREN! statement
  22. ( "else"! statement )?
  23. | "while"^ LPAREN! expr RPAREN! statement
  24. |! b:block { statement_AST = #b; }
  25. // do some manual tree returning
  26. ;
  27. // add an EXPR node on top of an expression
  28. // note that the two alternatives behave exactly
  29. // the same way.
  30. expr:! id:ID {#expr = #([EXPR,"EXPR"],#id);}
  31. | INT {#expr = #([EXPR,"EXPR"],#expr);}
  32. ;
  33. class LangWalker extends TreeParser;
  34. block : #( BLOCK ( stat )+ )
  35. ;
  36. stat: #("if" expr stat (stat)?)
  37. | #("while" expr stat)
  38. | expr
  39. | block
  40. | #( ASSIGN ID expr )
  41. ;
  42. expr: #( EXPR
  43. ( a:ID {std::cout << "found ID "<<a->getText() << std::endl;}
  44. | b:INT {std::cout << "found INT "<<b->getText() << std::endl;}
  45. )
  46.  )
  47. ;
  48. class LangLexer extends Lexer;
  49. WS_ : (' '
  50. | 't'
  51. | 'n'
  52. | 'r')
  53. { _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP; }
  54. ;
  55. LPAREN: '('
  56. ;
  57. RPAREN: ')'
  58. ;
  59. LCURLY: '{'
  60. ;
  61. RCURLY: '}'
  62. ;
  63. ASSIGN
  64. : '='
  65. ;
  66. SEMI: ';'
  67. ;
  68. protected
  69. DIGIT
  70. : '0'..'9'
  71. ;
  72. INT : (DIGIT)+
  73. ;
  74. ID
  75. options {
  76. testLiterals = true;
  77. }
  78. : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|DIGIT)*
  79. ;