161 lines
5.3 KiB
C++
161 lines
5.3 KiB
C++
// Notes: The parser is embodied/encapsulated in the class YYPARSER. Given a
|
|
// <grammar>.y the C++ YACC generates a YYPARSER object along with the needed
|
|
// parse tables as static data members. To create a parser object is as simple
|
|
// as creating an object of class YYPARSER. The YYPARSER code now is
|
|
// automatically re-entrant.
|
|
|
|
#ifndef YYPARS_INCLUDED
|
|
#define YYPARS_INCLUDED
|
|
|
|
|
|
#ifdef UNICODE
|
|
#define yyitos _itow
|
|
#else
|
|
#define yyitos _itoa
|
|
#endif
|
|
|
|
|
|
#ifndef YYAPI_PACKAGE
|
|
# define YYAPI_TOKENNAME yychar //name used for return value of yylex
|
|
# define YYAPI_TOKENTYPE int //type of the token
|
|
# define YYAPI_TOKENEME(t) (t) //the value of the token that the parser should see
|
|
# define YYAPI_TOKENNONE -2 //the representation when there is no token
|
|
# define YYAPI_TOKENSTR(t) (yyitos(t,yyitoa,10)) //string representation of the token
|
|
# define YYAPI_VALUENAME yylval //the name of the value of the token
|
|
# define YYAPI_VALUETYPE YYSTYPE //the type of the value of the token (if null, then the value is derivable from the token itself)
|
|
# define YYAPI_VALUEOF(v) (v) //how to get the value of the token
|
|
# define YYAPI_CALLAFTERYYLEX(t) //
|
|
# define YYAPI_PACKAGE //package is in use
|
|
#endif // YYAPI_PACKAGE
|
|
|
|
#ifndef YYPARSER
|
|
# define YYPARSER yyparse
|
|
#endif
|
|
#ifndef YYLEX
|
|
# define YYLEX yylex
|
|
#endif
|
|
#ifndef YYPARSEPROTO
|
|
# define YYPARSEPROTO
|
|
#endif
|
|
#ifndef YYSTYPE
|
|
# define YYSTYPE int
|
|
#endif
|
|
|
|
#define yyerrok ClearErrRecoveryState() //provided for compatibility with YACC
|
|
#define yyclearin YYAPI_TOKENNAME = YYAPI_TOKENNONE
|
|
|
|
#ifndef YYMAXDEPTH
|
|
#define YYMAXDEPTH 150
|
|
#endif
|
|
|
|
#ifndef YYR_T
|
|
#define YYR_T int
|
|
typedef YYR_T yyr_t;
|
|
#endif
|
|
|
|
|
|
class CImpIParserSession;
|
|
class CImpIParserTreeProperties;
|
|
|
|
class YYPARSER {
|
|
friend class YYLEXER;
|
|
// ctor & dtor
|
|
public:
|
|
YYPARSER(CImpIParserSession* pParserSession, CImpIParserTreeProperties* pParserTreeProperties);
|
|
~YYPARSER();
|
|
|
|
// Public interface
|
|
public:
|
|
void ResetParser(); //use to possibly restart parser
|
|
HRESULT Parse(YYPARSEPROTO); //bread and butter function
|
|
|
|
// Public interface that's reluctantly provided
|
|
public:
|
|
int NoOfErrors(); //current count of parsing errors
|
|
int ErrRecoveryState(); //error recovery state.
|
|
void ClearErrRecoveryState(); //error recovery is complete.
|
|
|
|
#ifdef YYAPI_VALUETYPE
|
|
YYAPI_VALUETYPE GetParseTree() // Get result of parse
|
|
{
|
|
return /*YYAPI_VALUENAME*/yyval;
|
|
};
|
|
#endif
|
|
|
|
YYAPI_TOKENTYPE GetCurrentToken(); //current token seen by the parser.
|
|
void SetCurrentToken(YYAPI_TOKENTYPE newToken); //change current token.
|
|
void YYPARSER::yySetBuffer(short iBuffer, YY_CHAR *szValue);
|
|
YY_CHAR *YYPARSER::yyGetBuffer(short iBuffer);
|
|
void yyprimebuffer(YY_CHAR *pszBuffer);
|
|
void yyprimelexer(int eToken);
|
|
void EmptyValueStack();
|
|
HRESULT CoerceScalar(DBTYPE dbTypeExpected, DBCOMMANDTREE** ppct);
|
|
|
|
|
|
|
|
// private data
|
|
private:
|
|
int yyn;
|
|
int yychar1; /* lookahead token as an internal (translated) token number */
|
|
short yyssa[YYMAXDEPTH]; /* the state stack */
|
|
YYSTYPE yyvsa[YYMAXDEPTH]; /* the semantic value stack */
|
|
short *yyss; /* refer to the stacks thru separate pointers */
|
|
YYSTYPE *yyvs; /* to allow yyoverflow to reallocate them elsewhere */
|
|
int yystacksize;
|
|
int yynerrs;
|
|
|
|
YYSTYPE yyval;/* the variable used to return */
|
|
/* semantic values from the action */
|
|
/* routines */
|
|
int yylen;
|
|
|
|
|
|
YYAPI_TOKENTYPE YYAPI_TOKENNAME; //current input token
|
|
#ifdef YYAPI_VALUETYPE
|
|
//could be defined as attribute of the token; In this case.
|
|
//YYAPI_TOKENNAME and YYAPI_VALUENAME must match.
|
|
YYAPI_VALUETYPE YYAPI_VALUENAME; //value of current input token
|
|
#endif
|
|
int yyerrflag; //error recovery flag
|
|
int yyerrstatus; /* number of tokens to shift before error messages enabled */
|
|
|
|
// private pointer data
|
|
private:
|
|
short yystate; //parse state
|
|
short *yyssp; //state pointer
|
|
YYSTYPE *yyvsp; //pointer to value of a state
|
|
CImpIParserSession* m_pIPSession; //all of the data necessary for this parser
|
|
CImpIParserTreeProperties * m_pIPTProperties;
|
|
|
|
public:
|
|
YYLEXER m_yylex; // lexer object for this instance of parser
|
|
|
|
// private tables
|
|
private:
|
|
//These may be allocated dynamically
|
|
YY_CHAR yyitoa[20]; // Buff to store text version of token
|
|
|
|
// debugging helpers
|
|
public:
|
|
// ICommand* m_pICommand; //command object
|
|
#ifdef YYDEBUG
|
|
int yydebug;
|
|
#endif
|
|
|
|
private:
|
|
#ifdef YYDUMP
|
|
void DumpYYS();
|
|
void DumpYYV();
|
|
#endif
|
|
|
|
void Trace(TCHAR *message);
|
|
void Trace(TCHAR *message, const TCHAR *tokname, short state = 0);
|
|
void Trace(TCHAR *message, int state, short tostate = 0, short token = 0);
|
|
|
|
private:
|
|
# define maxYYBuffer 5
|
|
YY_CHAR *rgpszYYBuffer[maxYYBuffer];
|
|
};
|
|
|
|
#endif // YYPARS_INCLUDED
|