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

编译器/解释器

开发平台:

Others

  1. header {
  2. #include "Main.hpp"
  3. #include <string>
  4. #include <iostream>
  5. }
  6. options {
  7. language = Cpp;
  8. }
  9. class PParser extends Parser;
  10. {
  11. public:
  12. void traceOut(ANTLR_USE_NAMESPACE(std)string rname) /*throws TokenStreamException*/  {
  13. ANTLR_USE_NAMESPACE(std)cout << "exit " << rname << "; LT(1)=" << LT(1) << ANTLR_USE_NAMESPACE(std)endl;
  14. }
  15. void traceIn(ANTLR_USE_NAMESPACE(std)string rname) /*throws TokenStreamException*/  {
  16. ANTLR_USE_NAMESPACE(std)cout << "enter " << rname << "; LT(1)=" << LT(1) << ANTLR_USE_NAMESPACE(std)endl;
  17. }
  18. /*
  19. public void consume() throws IOException {
  20. try {
  21. System.out.println(LT(1));
  22. }
  23. catch (IOException ignore) {}
  24. super.consume();
  25. }
  26. */
  27. }
  28. startRule
  29. : ( decl )+
  30. ;
  31. decl: INT a:ID {ANTLR_USE_NAMESPACE(std)cout << "decl " << a->getText() << ANTLR_USE_NAMESPACE(std)endl;}
  32. ( COMMA b:ID {ANTLR_USE_NAMESPACE(std)cout << "decl " << b->getText() << ANTLR_USE_NAMESPACE(std)endl;} )*
  33. SEMI
  34. ;
  35. {
  36. #include <fstream>
  37. #include "PParser.hpp"
  38. }
  39. class PLexer extends Lexer;
  40. options {
  41. charVocabulary = '3'..'377';
  42. k=2;
  43. }
  44. tokens {
  45. INT="int";
  46. }
  47. {
  48. public:
  49. void uponEOF() /*throws TokenStreamException, CharStreamException*/ {
  50. if ( selector.getCurrentStream() != mainLexer ) {
  51. // don't allow EOF until main lexer.  Force the
  52. // selector to retry for another token.
  53. selector.pop(); // return to old lexer/stream
  54. selector.retry();
  55. }
  56. else {
  57. ANTLR_USE_NAMESPACE(std)cout << "Hit EOF of main file" << ANTLR_USE_NAMESPACE(std)endl;
  58. }
  59. }
  60. }
  61. SEMI: ';'
  62. ;
  63. COMMA
  64. : ','
  65. ;
  66. ID
  67. : ('a'..'z')+
  68. ;
  69. INCLUDE
  70. : "#include" (WS_)? f:STRING
  71. {
  72. ANTLR_USING_NAMESPACE(std)
  73. // create lexer to handle include
  74. string name = f->getText();
  75. ifstream* input = new ifstream(name.c_str());
  76. if (!*input) {
  77. cerr << "cannot find file " << name << endl;
  78. }
  79. PLexer* sublexer = new PLexer(*input);
  80. // make sure errors are reported in right file
  81. sublexer->setFilename(name);
  82. parser->setFilename(name);
  83. // you can't just call nextToken of sublexer
  84. // because you need a stream of tokens to
  85. // head to the parser.  The only way is
  86. // to blast out of this lexer and reenter
  87. // the nextToken of the sublexer instance
  88. // of this class.
  89. selector.push(sublexer);
  90. // ignore this as whitespace; ask selector to try
  91. // to get another token.  It will call nextToken()
  92. // of the new instance of this lexer.
  93. selector.retry(); // throws TokenStreamRetryException
  94. }
  95. ;
  96. STRING
  97. : '"'! ( ~'"' )* '"'!
  98. ;
  99. WS_ : ( ' '
  100. | 't'
  101. | 'f'
  102. // handle newlines
  103. | ( options {generateAmbigWarnings=false;}
  104. : "rn"  // Evil DOS
  105. | 'r'    // Macintosh
  106. | 'n'    // Unix (the right way)
  107. )
  108. { newline(); }
  109. )+
  110. { $setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP); }
  111. ;