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

编译器/解释器

开发平台:

Others

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