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

编译器/解释器

开发平台:

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/LLkParser.hpp"
  33. #include <iostream>
  34. ANTLR_BEGIN_NAMESPACE(antlr)
  35. /**An LL(k) parser.
  36.  *
  37.  * @see antlr.Token
  38.  * @see antlr.TokenBuffer
  39.  * @see antlr.LL1Parser
  40.  */
  41. // LLkParser(int k_);
  42. LLkParser::LLkParser(const ParserSharedInputState& state, int k_)
  43. : Parser(state)
  44. { k=k_; }
  45. LLkParser::LLkParser(TokenBuffer& tokenBuf, int k_)
  46. : Parser(tokenBuf)
  47. { k=k_; }
  48. LLkParser::LLkParser(TokenStream& lexer, int k_)
  49. : Parser(new TokenBuffer(lexer))
  50. { k=k_; }
  51. /**Consume another token from the input stream.  Can only write sequentially!
  52.  * If you need 3 tokens ahead, you must consume() 3 times.
  53.  * <p>
  54.  * Note that it is possible to overwrite tokens that have not been matched.
  55.  * For example, calling consume() 3 times when k=2, means that the first token
  56.  * consumed will be overwritten with the 3rd.
  57.  */
  58. void LLkParser::consume()
  59. { inputState->getInput().consume(); }
  60. int LLkParser::LA(int i)
  61. { return inputState->getInput().LA(i); }
  62. RefToken LLkParser::LT(int i)
  63. { return inputState->getInput().LT(i); }
  64. void LLkParser::trace(const ANTLR_USE_NAMESPACE(std)string& ee, const ANTLR_USE_NAMESPACE(std)string& rname)
  65. {
  66. ANTLR_USE_NAMESPACE(std)cout << ee.c_str() << rname.c_str() << ((inputState->guessing>0)?"; [guessing]":"; ");
  67. for (int i = 1; i <= k; i++)
  68. {
  69. if (i != 1) {
  70. ANTLR_USE_NAMESPACE(std)cout << ", ";
  71. }
  72. ANTLR_USE_NAMESPACE(std)cout << "LA(" << i << ")==" << LT(i)->getText().c_str();
  73. }
  74. ANTLR_USE_NAMESPACE(std)cout << ANTLR_USE_NAMESPACE(std)endl;
  75. }
  76. void LLkParser::traceIn(const ANTLR_USE_NAMESPACE(std)string& rname)
  77. { trace("enter ",rname); }
  78. void LLkParser::traceOut(const ANTLR_USE_NAMESPACE(std)string& rname)
  79. { trace("exit ",rname); }
  80. ANTLR_END_NAMESPACE