/****************************************************************************
* frameparser.cpp
* C++ source file generated from frameparser.y.
*
* Date: 05/20/07
* Time: 22:59:12
*
* AYACC Version: 2.07
****************************************************************************/
#include <yycpars.h>
// namespaces
#ifdef YYSTDCPPLIB
using namespace std;
#endif
#ifdef YYNAMESPACE
using namespace yl;
#endif
#line 1 ".\\frameparser.y"
#include <iostream>
#include "main.h"
#include "framelex.h"
#define YYDEBUG 0 // 将这个变量设置为1则表示启动Yacc的调试功能
extern "C"
{
void yyerror(const char *s);
// extern int yylex(void);
}
std::vector<Include> g_Includes;// 用来记录所有的包含声明
Include *g_pInclude;// 用来保存新增的包含声明信息的指针
#line 36 "frameparser.cpp"
// repeated because of possible precompiled header
#include <yycpars.h>
// namespaces
#ifdef YYSTDCPPLIB
using namespace std;
#endif
#ifdef YYNAMESPACE
using namespace yl;
#endif
#include ".\frameparser.h"
/////////////////////////////////////////////////////////////////////////////
// constructor
YYPARSERNAME::YYPARSERNAME()
{
yytables();
}
/////////////////////////////////////////////////////////////////////////////
// destructor
YYPARSERNAME::~YYPARSERNAME()
{
// allows virtual functions to be called properly for correct cleanup
yydestroy();
}
#ifndef YYSTYPE
#define YYSTYPE int
#endif
#ifndef YYSTACK_SIZE
#define YYSTACK_SIZE 100
#endif
#ifndef YYSTACK_MAX
#define YYSTACK_MAX 0
#endif
/****************************************************************************
* N O T E
*
* If the compiler generates a YYPARSERNAME error then you have not declared
* the name of the parser. The easiest way to do this is to use a name
* declaration. This is placed in the declarations section of your YACC
* source file and is introduced with the %name keyword. For instance, the
* following name declaration declares the parser myparser:
*
* %name myparser
*
* For more information see help.
****************************************************************************/
// yyattribute
#ifdef YYDEBUG
void YYFAR* YYPARSERNAME::yyattribute1(int index) const
{
YYSTYPE YYFAR* p = &((YYSTYPE YYFAR*)yyattributestackptr)[yytop + index];
return p;
}
#define yyattribute(index) (*(YYSTYPE YYFAR*)yyattribute1(index))
#else
#define yyattribute(index) (((YYSTYPE YYFAR*)yyattributestackptr)[yytop + (index)])
#endif
void YYPARSERNAME::yystacktoval(int index)
{
yyassert(index >= 0);
*(YYSTYPE YYFAR*)yyvalptr = ((YYSTYPE YYFAR*)yyattributestackptr)[index];
}
void YYPARSERNAME::yyvaltostack(int index)
{
yyassert(index >= 0);
((YYSTYPE YYFAR*)yyattributestackptr)[index] = *(YYSTYPE YYFAR*)yyvalptr;
}
void YYPARSERNAME::yylvaltoval()
{
*(YYSTYPE YYFAR*)yyvalptr = *(YYSTYPE YYFAR*)yylvalptr;
}
void YYPARSERNAME::yyvaltolval()
{
*(YYSTYPE YYFAR*)yylvalptr = *(YYSTYPE YYFAR*)yyvalptr;
}
void YYPARSERNAME::yylvaltostack(int index)
{
yyassert(index >= 0);
((YYSTYPE YYFAR*)yyattributestackptr)[index] = *(YYSTYPE YYFAR*)yylvalptr;
}
void YYFAR* YYPARSERNAME::yynewattribute(int count)
{
yyassert(count >= 0);
return new YYFAR YYSTYPE[count];
}
void YYPARSERNAME::yydeleteattribute(void YYFAR* attribute)
{
delete[] (YYSTYPE YYFAR*)attribute;
}
void YYPARSERNAME::yycopyattribute(void YYFAR* dest, const void YYFAR* src, int count)
{
for (int i = 0; i < count; i++) {
((YYSTYPE YYFAR*)dest)[i] = ((YYSTYPE YYFAR*)src)[i];
}
}
#ifdef YYDEBUG
void YYPARSERNAME::yyinitdebug(void YYFAR** p, int count) const
{
yyassert(p != NULL);
yyassert(count >= 1);
YYSTYPE YYFAR** p1 = (YYSTYPE YYFAR**)p;
for (int i = 0; i < count; i++) {
p1[i] = &((YYSTYPE YYFAR*)yyattributestackptr)[yytop + i - (count - 1)];
}
}
#endif
void YYPARSERNAME::yyaction(int action)
{
switch (action) {
case 0:
{
#ifdef YYDEBUG
YYSTYPE YYFAR* yya[5];
yyinitdebug((void YYFAR**)yya, 5);
#endif
{
#line 24 ".\\frameparser.y"
// 注意这里的$3,实际上就是上面的标记的第三个的意思
// 因为yylval被声明为Include结构,参见main.hpp文件
// 因而每个标记都是Include结构类型。
g_Includes.push_back(Include());
g_pInclude = &g_Includes.back();
g_pInclude->clear();// 初始化
g_pInclude->headerfile = yyattribute(3 - 4).headerfile;// 可以证明$3的类型就是Include类型
g_pInclude->is_angle = true;// 是尖括号
g_pInclude->is_quotation = false;// 不是双引号
#line 184 "frameparser.cpp"
}
}
break;
case 1:
{
#ifdef YYDEBUG
YYSTYPE YYFAR* yya[5];
yyinitdebug((void YYFAR**)yya, 5);
#endif
{
#line 36 ".\\frameparser.y"
// 值得说明的是:上面的include_preprocess用$表示,
// 而不是用$0表示。从左向右依次为:
// include_preprocess $
// INCLUDE $1
// '\"' $2
// HEADERFILE $3
// '\"' $4
g_Includes.push_back(Include());
g_pInclude = &g_Includes.back();
g_pInclude->clear();// 初始化
g_pInclude->headerfile = yyattribute(3 - 4).headerfile;
g_pInclude->is_angle = false;// 不是尖括号
g_pInclude->is_quotation = true;// 是双引号
#line 211 "frameparser.cpp"
}
}
break;
default:
yyassert(0);
break;
}
}
void YYPARSERNAME::yytables()
{
yyattribute_size = sizeof(YYSTYPE);
yysstack_size = YYSTACK_SIZE;
yystack_max = YYSTACK_MAX;
#ifdef YYDEBUG
static const yysymbol_t YYNEARFAR YYBASED_CODE symbol[] = {
{ "$end", 0 },
{ "\'\\\"\'", 34 },
{ "\'<\'", 60 },
{ "\'>\'", 62 },
{ "error", 256 },
{ "INCLUDE", 257 },
{ "HEADERFILE", 258 },
{ NULL, 0 }
};
yysymbol = symbol;
static const char* const YYNEARFAR YYBASED_CODE rule[] = {
"$accept: program",
"program:",
"program: program include_preprocess",
"include_preprocess: INCLUDE \'<\' HEADERFILE \'>\'",
"include_preprocess: INCLUDE \'\\\"\' HEADERFILE \'\\\"\'"
};
yyrule = rule;
#endif
static const yyreduction_t YYNEARFAR YYBASED_CODE reduction[] = {
{ 0, 1, -1 },
{ 1, 0, -1 },
{ 1, 2, -1 },
{ 2, 4, 0 },
{ 2, 4, 1 }
};
yyreduction = reduction;
yytokenaction_size = 258;
static const yytokenaction_t YYNEARFAR YYBASED_CODE tokenaction[] = {
{ 1, YYAT_ACCEPT, 0 },
{ 2, YYAT_SHIFT, 4 },
{ 7, YYAT_SHIFT, 9 },
{ 6, YYAT_SHIFT, 8 },
{ 5, YYAT_SHIFT, 7 },
{ 4, YYAT_SHIFT, 6 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ 2, YYAT_SHIFT, 5 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{ -1, YYAT_ERROR, 0 },
{