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

编译器/解释器

开发平台:

Others

  1. /**
  2.  * <b>SOFTWARE RIGHTS</b>
  3.  * <p>
  4.  * ANTLR 2.6.0 MageLang Insitute, 1998
  5.  * <p>
  6.  * We reserve no legal rights to the ANTLR--it is fully in the
  7.  * public domain. An individual or company may do whatever
  8.  * they wish with source code distributed with ANTLR or the
  9.  * code generated by ANTLR, including the incorporation of
  10.  * ANTLR, or its output, into commerical software.
  11.  * <p>
  12.  * We encourage users to develop software with ANTLR. However,
  13.  * we do ask that credit is given to us for developing
  14.  * ANTLR. By "credit", we mean that if you use ANTLR or
  15.  * incorporate any source code into one of your programs
  16.  * (commercial product, research project, or otherwise) that
  17.  * you acknowledge this fact somewhere in the documentation,
  18.  * research report, etc... If you like ANTLR and have
  19.  * developed a nice tool with the output, please mention that
  20.  * you developed it using ANTLR. In addition, we ask that the
  21.  * headers remain intact in our source code. As long as these
  22.  * guidelines are kept, we expect to continue enhancing this
  23.  * system and expect to make other tools available as they are
  24.  * completed.
  25.  * <p>
  26.  * The ANTLR gang:
  27.  * @version ANTLR 2.6.0 MageLang Insitute, 1998
  28.  * @author Terence Parr, <a href=http://www.MageLang.com>MageLang Institute</a>
  29.  * @author <br>John Lilley, <a href=http://www.Empathy.com>Empathy Software</a>
  30.  * @author <br><a href="mailto:pete@yamuna.demon.co.uk">Pete Wells</a>
  31.  */
  32. #include "antlr/TreeParser.hpp"
  33. #include "antlr/ASTNULLType.hpp"
  34. #include "antlr/MismatchedTokenException.hpp"
  35. #include <iostream>
  36. ANTLR_BEGIN_NAMESPACE(antlr)
  37. TreeParser::TreeParser()
  38. : inputState(new TreeParserInputState())
  39. {
  40. }
  41. TreeParser::TreeParser(const TreeParserSharedInputState& state)
  42. : inputState(state)
  43. {
  44. }
  45. TreeParser::~TreeParser()
  46. {
  47. }
  48. void TreeParser::setTokenNames(const char** tokenNames_)
  49. {
  50. while (*tokenNames_) {
  51. tokenNames.push_back(*(tokenNames_++));
  52. }
  53. }
  54. /** The AST Null object; the parsing cursor is set to this when
  55.  *  it is found to be null.  This way, we can test the
  56.  *  token type of a node without having to have tests for null
  57.  *  everywhere.
  58.  */
  59. RefAST TreeParser::ASTNULL(new ASTNULLType);
  60. /** Get the AST return value squirreled away in the parser */
  61. //RefAST getAST() const {
  62. // return returnAST;
  63. //}
  64. void TreeParser::match(RefAST t, int ttype)
  65. {
  66. if (!t || t==ASTNULL || t->getType()!=ttype)
  67. throw MismatchedTokenException();
  68. }
  69. /**Make sure current lookahead symbol matches the given set
  70.  * Throw an exception upon mismatch, which is catch by either the
  71.  * error handler or by the syntactic predicate.
  72.  */
  73. void TreeParser::match(RefAST t, const BitSet& b)
  74. {
  75. if ( !t || t==ASTNULL || !b.member(t->getType()) ) {
  76. throw MismatchedTokenException();
  77. }
  78. }
  79. void TreeParser::matchNot(RefAST t, int ttype)
  80. {
  81. //ANTLR_USE_NAMESPACE(std)cout << "match(" << ttype << "); cursor is " << t.toString() << ANTLR_USE_NAMESPACE(std)endl;
  82. if ( !t || t==ASTNULL || t->getType()==ttype ) {
  83. throw MismatchedTokenException();
  84. }
  85. }
  86. void TreeParser::panic()
  87. {
  88. ANTLR_USE_NAMESPACE(std)cerr << "TreeWalker: panic" << ANTLR_USE_NAMESPACE(std)endl;
  89. exit(1);
  90. }
  91. /** Parser error-reporting function can be overridden in subclass */
  92. void TreeParser::reportError(const RecognitionException& ex)
  93. {
  94. ANTLR_USE_NAMESPACE(std)cerr << ex.toString().c_str() << ANTLR_USE_NAMESPACE(std)endl;
  95. }
  96. /** Parser error-reporting function can be overridden in subclass */
  97. void TreeParser::reportError(const ANTLR_USE_NAMESPACE(std)string& s)
  98. {
  99. ANTLR_USE_NAMESPACE(std)cerr << "error: " << s.c_str() << ANTLR_USE_NAMESPACE(std)endl;
  100. }
  101. /** Parser warning-reporting function can be overridden in subclass */
  102. void TreeParser::reportWarning(const ANTLR_USE_NAMESPACE(std)string& s)
  103. {
  104. ANTLR_USE_NAMESPACE(std)cerr << "warning: " << s.c_str() << ANTLR_USE_NAMESPACE(std)endl;
  105. }
  106. /** Specify an object with support code (shared by
  107.  *  Parser and TreeParser.  Normally, the programmer
  108.  *  does not play with this, using setASTNodeType instead.
  109.  */
  110. // void TreeParser::setASTFactory(ASTFactory f);
  111. /** Specify the type of node to create during tree building */
  112. void TreeParser::setASTNodeFactory(ASTFactory::factory_type factory)
  113. {
  114. astFactory.setASTNodeFactory(factory);
  115. }
  116. void TreeParser::traceIn(const ANTLR_USE_NAMESPACE(std)string& rname, RefAST t)
  117. {
  118. ANTLR_USE_NAMESPACE(std)cout << "enter " << rname.c_str()
  119. << "(" << (t ? t->toString().c_str() : "null") << ")"
  120. << ((inputState->guessing>0)?" [guessing]":"")
  121. << ANTLR_USE_NAMESPACE(std)endl;
  122. }
  123. void TreeParser::traceOut(const ANTLR_USE_NAMESPACE(std)string& rname, RefAST t)
  124. {
  125. ANTLR_USE_NAMESPACE(std)cout << "exit " << rname.c_str()
  126. << "(" << (t ? t->toString().c_str() : "null") << ")"
  127. << ((inputState->guessing>0)?" [guessing]":"")
  128. << ANTLR_USE_NAMESPACE(std)endl;
  129. }
  130. ANTLR_END_NAMESPACE