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

编译器/解释器

开发平台:

Others

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