1/* ANTLR Translator Generator 2 * Project led by Terence Parr at http://www.jGuru.com 3 * Software rights: http://www.antlr.org/license.html 4 * 5 * $Id: //depot/code/org.antlr/release/antlr-2.7.7/lib/cpp/src/Parser.cpp#2 $ 6 */ 7 8#include "antlr/Parser.hpp" 9 10#include <stdio.h> 11 12#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 13namespace antlr { 14#endif 15 16/** A generic ANTLR parser (LL(k) for k>=1) containing a bunch of 17 * utility routines useful at any lookahead depth. We distinguish between 18 * the LL(1) and LL(k) parsers because of efficiency. This may not be 19 * necessary in the near future. 20 * 21 * Each parser object contains the state of the parse including a lookahead 22 * cache (the form of which is determined by the subclass), whether or 23 * not the parser is in guess mode, where tokens come from, etc... 24 * 25 * <p> 26 * During <b>guess</b> mode, the current lookahead token(s) and token type(s) 27 * cache must be saved because the token stream may not have been informed 28 * to save the token (via <tt>mark</tt>) before the <tt>try</tt> block. 29 * Guessing is started by: 30 * <ol> 31 * <li>saving the lookahead cache. 32 * <li>marking the current position in the TokenBuffer. 33 * <li>increasing the guessing level. 34 * </ol> 35 * 36 * After guessing, the parser state is restored by: 37 * <ol> 38 * <li>restoring the lookahead cache. 39 * <li>rewinding the TokenBuffer. 40 * <li>decreasing the guessing level. 41 * </ol> 42 * 43 * @see antlr.Token 44 * @see antlr.TokenBuffer 45 * @see antlr.TokenStream 46 * @see antlr.LL1Parser 47 * @see antlr.LLkParser 48 */ 49 50bool DEBUG_PARSER = false; 51 52/** Parser error-reporting function can be overridden in subclass */ 53void Parser::reportError(const RecognitionException& ex) 54{ 55 fprintf(stderr, "%s", (ex.toString() + "\n").c_str()); 56} 57 58/** Parser error-reporting function can be overridden in subclass */ 59void Parser::reportError(const ANTLR_USE_NAMESPACE(std)string& s) 60{ 61 if ( getFilename()=="" ) 62 fprintf(stderr, "%s", ("error: " + s + "\n").c_str()); 63 else 64 fprintf(stderr, "%s", (getFilename() + ": error: " + s + "\n").c_str()); 65} 66 67/** Parser warning-reporting function can be overridden in subclass */ 68void Parser::reportWarning(const ANTLR_USE_NAMESPACE(std)string& s) 69{ 70 if ( getFilename()=="" ) 71 fprintf(stderr, "%s", ("warning: " + s + "\n").c_str()); 72 else 73 fprintf(stderr, "%s", (getFilename() + ": warning: " + s + "\n").c_str()); 74} 75 76/** Set or change the input token buffer */ 77// void setTokenBuffer(TokenBuffer<Token>* t); 78 79void Parser::traceIndent() 80{ 81 for( int i = 0; i < traceDepth; i++ ) 82 printf(" "); 83} 84 85void Parser::traceIn(const char* rname) 86{ 87 traceDepth++; 88 89 for( int i = 0; i < traceDepth; i++ ) 90 printf(" ");; 91 92 printf("%s",((ANTLR_USE_NAMESPACE(std)string)"> " + rname 93 + "; LA(1)==" + LT(1)->getText() 94 + ((inputState->guessing>0)?" [guessing]":"") 95 + "\n").c_str()); 96} 97 98void Parser::traceOut(const char* rname) 99{ 100 for( int i = 0; i < traceDepth; i++ ) 101 printf(" ");; 102 103 printf("%s",((ANTLR_USE_NAMESPACE(std)string)"< " + rname 104 + "; LA(1)==" + LT(1)->getText() 105 + ((inputState->guessing>0)?" [guessing]":"") 106 + "\n").c_str()); 107 108 traceDepth--; 109} 110 111#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 112} 113#endif 114