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

编译器/解释器

开发平台:

Others

  1. options {
  2. language = "Sather";
  3. }
  4. class INSTR_PARSER extends Parser;
  5. options {
  6. buildAST = true;
  7. k=2;
  8. }
  9. tokens {
  10. CALL; // define imaginary token CALL
  11. }
  12. slist
  13. : ( stat )+
  14. ;
  15. stat: LBRACE^ (stat)+ RBRACE
  16. | "if"^ expr "then" stat ("else" stat)?
  17. | ID ASSIGN^ expr SEMI
  18. | call
  19. ;
  20. expr
  21. : mexpr (PLUS^ mexpr)*
  22. ;
  23. mexpr
  24. : atom (STAR^ atom)*
  25. ;
  26. atom: INT
  27. | ID
  28. ;
  29. call: ID LPAREN (expr)? RPAREN SEMI
  30. {@call := @(@[CALL,"CALL"], @call);}
  31. ;
  32. class INSTR_LEXER extends Lexer;
  33. options {
  34. charVocabulary = '3'..'377';
  35. }
  36. WS : (' '
  37. | 't'
  38. | ('n'|'r'('n')?) {newline;}
  39. )+
  40. ;
  41. // Single-line comments
  42. SL_COMMENT
  43. : "//"
  44. (~('n'|'r'))* ('n'|'r'('n')?)
  45. {newline;}
  46. ;
  47. LBRACE: '{'
  48. ;
  49. RBRACE: '}'
  50. ;
  51. LPAREN: '('
  52. ;
  53. RPAREN: ')'
  54. ;
  55. STAR: '*'
  56. ;
  57. PLUS: '+'
  58. ;
  59. SEMI: ';'
  60. ;
  61. ASSIGN
  62. : '='
  63. ;
  64. protected
  65. DIGIT
  66. : '0'..'9'
  67. ;
  68. INT : (DIGIT)+
  69. ;
  70. ID : ('a'..'z')+
  71. ;
  72. class INSTR_TREE_WALKER extends TreeParser;
  73. {
  74.        -- MAIN does not do well with a shared attribute, it seems, so
  75.        -- I put it here.
  76.        private attr filter : ANTLR_TOKEN_STREAM_HIDDEN_TOKEN_FILTER;
  77.         create ( f : ANTLR_TOKEN_STREAM_HIDDEN_TOKEN_FILTER ) : SAME is
  78.           res ::= SAME::create;
  79.           res.filter := f;
  80.           return res;
  81.         end;
  82.         print ( s : STR ) is
  83.           OUT::create + s;
  84.         end;
  85. -- walk list of hidden tokens in order, printing them out 
  86. dump_hidden( t : ANTLR_COMMON_HIDDEN_STREAM_TOKEN ) is
  87.   loop while!( ~void(t) );
  88.     print(t.text);
  89.             t := filter.hidden_after(t);
  90.           end;
  91. end;
  92. pr( p : ANTLR_COMMON_AST_WITH_HIDDEN_TOKENS ) is
  93.    print( p.text );
  94.       dump_hidden( p.hidden_after );
  95.         end;
  96. }
  97. slist
  98. : {dump_hidden( filter.first_hidden_token );}
  99. (stat)+
  100. ;
  101. stat: #(LBRACE {pr(@LBRACE);} (stat)+ RBRACE {pr(@RBRACE);})
  102. | #(i:"if" {pr(i);} expr t:"then" {pr(t);} stat (e:"else" {pr(e);} stat)?)
  103. | #(ASSIGN ID {pr(@ID); pr(@ASSIGN);} expr SEMI {pr(@SEMI);} )
  104. | call
  105. ;
  106. expr
  107. : #(PLUS expr {pr(@PLUS);} expr)
  108. | #(STAR expr {pr(@STAR);} expr)
  109. | INT {pr(@INT);}
  110. | ID  {pr(@ID);}
  111. ;
  112. call: {
  113. -- add instrumentation about call; manually call rule
  114. callDumpInstrumentation(@call);
  115. }
  116. #(CALL ID {pr(@ID);}
  117.   LPAREN {pr(@LPAREN);} (expr)? RPAREN {pr(@RPAREN);}
  118.   SEMI
  119.   {
  120.   -- print SEMI manually; need '}' between it and whitespace
  121.   print(@SEMI.text);
  122.   print("}"); -- close {...} of instrumentation
  123.   dump_hidden( (@SEMI).hidden_after );
  124.   }
  125. )
  126. ;
  127. /* Dump instrumentation for a call statement.
  128.  *  The reference to rule expr prints out the arg
  129.  *  and then at the end of this rule, we close the
  130.  *  generated called to dbg.invoke().
  131.  */
  132. callDumpInstrumentation
  133. : #(CALL id:ID
  134.   { print("{dbg.invoke("" + id.text + "", "" ); }
  135.   LPAREN (e:expr)? RPAREN SEMI
  136.   { print(""); "); }
  137. )
  138. ;