/****************************************************************************
* U N R E G I S T E R E D C O P Y
*
* You are on day 12 of your 30 day trial period.
*
* This file was produced by an UNREGISTERED COPY of Parser Generator. It is
* for evaluation purposes only. If you continue to use Parser Generator 30
* days after installation then you are required to purchase a license. For
* more information see the online help or go to the Bumble-Bee Software
* homepage at:
*
* http://www.bumblebeesoftware.com
*
* This notice must remain present in the file. It cannot be removed.
****************************************************************************/
/****************************************************************************
* myparser.cpp
* C++ source file generated from myparser.y.
*
* Date: 11/26/18
* Time: 21:00:40
*
* AYACC Version: 2.07
****************************************************************************/
#include <yycpars.h>
// namespaces
#ifdef YYSTDCPPLIB
using namespace std;
#endif
#ifdef YYNAMESPACE
using namespace yl;
#endif
#line 1 ".\\myparser.y"
/****************************************************************************
myparser.y
ParserWizard generated YACC file.
Date: 2018年11月26日
****************************************************************************/
#include <stack>
#include "mylexer.h"
#include<iostream>
#include<fstream>
#include <string>
#define MAXCHILDREN 4 //每一个树结点所拥有的孩子结点的最大个数
#define IDNUMMAX 100 //可存储变量的最大数目
#define LETNUMMAX 999 //存储变量名字的区域大小
//定义符号表元素的数据结构
struct entry
{
char *lexptr; //该指针指向符号名字的存储位置
int type; //该变量保存该符号的类型(char型,bool型,int型或float型)(1:char,2:bool,3:int,4:float)
float token; //改变量保存该符号的值(都为float型,依靠type来做区分)
};
stack <float> idstack; //该堆栈用来存储ID对应符号表中的下标
ofstream outfile("output.txt");//写文件outputfile1.txtoutfile
//定义结点类型枚举类型
typedef enum nodeKind
{
kind_prog, //prog
kind_lines, //lines
kind_expr, //expr
kind_stmt, //stmt
kind_rela_stmt, //rela_stmt
kind_type, //type
kind_const, //const
kind_ID, //ID(标示浮)
kind_const_value, //常量(单字符常量:COUNTCHAR,布尔型常量:true,false,整型常量:COUNTINTNUM,浮点常量:COUNTFLOATNUM)
} NodeKind ;
//定义树结点结构
typedef struct treeNode
{
treeNode * child[MAXCHILDREN]; //指向其孩子结点的指针
treeNode * sibling; //保存指向其右兄弟结点的指针
int Currnode_number; //保存该结点的编号
int lineno; //保存某些结点对应用户程序的行号
NodeKind nodekind; //结点类型,取值范围为NodeKind中的类型
int nodekind_kind; //保存一个NodeKind类中所属子类的编号(当nodekind取kind_type_specifier时,
//当保存的nodekind_kind为1时,表示对应的结点为char型,nodekind_kind为2时,表示对应的节点为bool型.....)
int stmt_type; //当nodekind为kind_stmt时,表达式取值,该变量的值有效.保存stmt表达式的类型
//(stmt_type为1时,表示对应的stmt表达式为char型;为2时,表示其为bool型;为3时,其为int型;为4时,表示其为float型)
float node_value; //当结点为叶结点,且其为kind_const_value时,用来保存常量的值.
//当nodekind_kind为1时,则将node_value由float强制转换为int型,然后取对应的char型字符;
//当nodekind_kind为2时,则将node_value由float强制转换为int型,再转换为bool型;
//当nodekind_kind为3时,则将node_value由float强制转换为int型
//当结点为kind_stmt时,用来保存表达式的值,该值可结合stmt_type转换为表达式的相应的真实值
//当结点位kind_ID时,用来保存ID对应符号表中的下标
} TreeNode;
int whole_Currnode_number = 1; //用来为各树结点的结点编号赋值
int ps_error_count = 0 ; //用来保存错误次数
TreeNode * root = NULL; //保存最终的语法树的根结点
TreeNode * new_treeNode; //用来生成一个新的语法树结点
entry symtable[IDNUMMAX]; //定义符号表,外部引用变量(全局变量)
char lexemes[LETNUMMAX]; //定义变量名字的实际存储区域
void warning(char*m); //该函数用来打印警告信息
void ps_error(char*m); //该函数用来打印出错信息
TreeNode * new_TreeNode(); //该函数生成一个树结点,并返回结点指针,同时完成结点内容初始化
//计算表算术达式的值
void stmt_operation(TreeNode*$$,TreeNode*$1,TreeNode*$3,char a);
//计算关系表达式的值
void rela_stmt_operation(TreeNode*$$,TreeNode*$2,TreeNode*$4,int a);
//将表达式的值由浮点型转换为其真实类型
void change_to_original(float a,int b);
void node_print(TreeNode * m);//该函数用来打印单个结点的信息
void treenode_print(TreeNode*m);
void tree_print(); //打印语法树
#line 161 "myparser.cpp"
// repeated because of possible precompiled header
#include <yycpars.h>
// namespaces
#ifdef YYSTDCPPLIB
using namespace std;
#endif
#ifdef YYNAMESPACE
using namespace yl;
#endif
#include ".\myparser.h"
/////////////////////////////////////////////////////////////////////////////
// constructor
YYPARSERNAME::YYPARSERNAME()
{
yytables();
#line 136 ".\\myparser.y"
// place any extra initialisation code here
#line 185 "myparser.cpp"
}
/////////////////////////////////////////////////////////////////////////////
// destructor
YYPARSERNAME::~YYPARSERNAME()
{
// allows virtual functions to be called properly for correct cleanup
yydestroy();
#line 141 ".\\myparser.y"
// place any extra cleanup code here
#line 199 "myparser.cpp"
}
#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