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

编译器/解释器

开发平台:

Others

  1. class InstrParser extends Parser;
  2. options {
  3. buildAST = true;
  4. k=2;
  5. }
  6. tokens {
  7. CALL; // define imaginary token CALL
  8. }
  9. slist
  10. : ( stat )+
  11. ;
  12. stat: LBRACE^ (stat)+ RBRACE
  13. | "if"^ expr "then" stat ("else" stat)?
  14. | ID ASSIGN^ expr SEMI
  15. | call
  16. ;
  17. expr
  18. : mexpr (PLUS^ mexpr)*
  19. ;
  20. mexpr
  21. : atom (STAR^ atom)*
  22. ;
  23. atom: INT
  24. | ID
  25. ;
  26. call: ID LPAREN (expr)? RPAREN SEMI
  27. {#call = #(#[CALL,"CALL"], #call);}
  28. ;
  29. class InstrLexer extends Lexer;
  30. options {
  31. charVocabulary = '3'..'377';
  32. }
  33. WS : (' '
  34. | 't'
  35. | ('n'|'r'('n')?) {newline();}
  36. )+
  37. ;
  38. // Single-line comments
  39. SL_COMMENT
  40. : "//"
  41. (~('n'|'r'))* ('n'|'r'('n')?)
  42. {newline();}
  43. ;
  44. LBRACE: '{'
  45. ;
  46. RBRACE: '}'
  47. ;
  48. LPAREN: '('
  49. ;
  50. RPAREN: ')'
  51. ;
  52. STAR: '*'
  53. ;
  54. PLUS: '+'
  55. ;
  56. SEMI: ';'
  57. ;
  58. ASSIGN
  59. : '='
  60. ;
  61. protected
  62. DIGIT
  63. : '0'..'9'
  64. ;
  65. INT : (DIGIT)+
  66. ;
  67. ID : ('a'..'z')+
  68. ;
  69. class InstrTreeWalker extends TreeParser;
  70. {
  71. /** walk list of hidden tokens in order, printing them out */
  72. public static void dumpHidden(antlr.CommonHiddenStreamToken t) {
  73.   for ( ; t!=null ; t=InstrMain.filter.getHiddenAfter(t) ) {
  74.     System.out.print(t.getText());
  75.   }
  76. }
  77. private void pr(AST p) {
  78. System.out.print(p.getText());
  79. dumpHidden(
  80. ((antlr.CommonASTWithHiddenTokens)p).getHiddenAfter()
  81. );
  82. }
  83. }
  84. slist
  85. : {dumpHidden(InstrMain.filter.getInitialHiddenToken());}
  86. (stat)+
  87. ;
  88. stat: #(LBRACE {pr(#LBRACE);} (stat)+ RBRACE {pr(#RBRACE);})
  89. | #(i:"if" {pr(i);} expr t:"then" {pr(t);} stat (e:"else" {pr(e);} stat)?)
  90. | #(ASSIGN ID {pr(#ID); pr(#ASSIGN);} expr SEMI {pr(#SEMI);} )
  91. | call
  92. ;
  93. expr
  94. : #(PLUS expr {pr(#PLUS);} expr)
  95. | #(STAR expr {pr(#STAR);} expr)
  96. | INT {pr(#INT);}
  97. | ID  {pr(#ID);}
  98. ;
  99. call: {
  100. // add instrumentation about call; manually call rule
  101. callDumpInstrumentation(#call);
  102. }
  103. #(CALL ID {pr(#ID);}
  104.   LPAREN {pr(#LPAREN);} (expr)? RPAREN {pr(#RPAREN);}
  105.   SEMI
  106.   {
  107.   // print SEMI manually; need '}' between it and whitespace
  108.   System.out.print(#SEMI.getText());
  109.   System.out.print("}"); // close {...} of instrumentation
  110.   dumpHidden(
  111. ((antlr.CommonASTWithHiddenTokens)#SEMI).getHiddenAfter()
  112.   );
  113.   }
  114. )
  115. ;
  116. /** Dump instrumentation for a call statement.
  117.  *  The reference to rule expr prints out the arg
  118.  *  and then at the end of this rule, we close the
  119.  *  generated called to dbg.invoke().
  120.  */
  121. callDumpInstrumentation
  122. : #(CALL id:ID
  123.   {System.out.print("{dbg.invoke(""+id.getText()+"", "");}
  124.   LPAREN (e:expr)? RPAREN SEMI
  125.   {System.out.print(""); ");}
  126. )
  127. ;