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

编译器/解释器

开发平台:

Others

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