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

编译器/解释器

开发平台:

Others

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