#include "parse.h"
#include "util.h"
#include <string.h>
static TokenType token;
char * temp_name;
static int line0;
/* 静态变量indentno在函数printTree中 *
* 用于存储当前子树缩进格数,初始为0 */
static int indentno = 0;
/** 增量/减量缩进宏定义 **/
#define INDENT indentno+=4
#define UNINDENT indentno-=4
//函数声明
static void syntaxError(char * message); //语法错误处理函数
static TreeNode * program(void); //总程序的处理函数
static TreeNode * programHead(void); // 程序头的处理函数
TreeNode * newPheadNode(void); // 创建程序头类型语法树节点函数
static void match(LexType expected); // 终极符匹配处理函数
TreeNode * declarePart(void); // 声明部分的处理函数
TreeNode * newDecANode(NodeKind kind); // 创建声明语法树节点函数,没有指明具体的节点声明类型,在语法树的第二层
TreeNode * typeDec(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * typeDeclaration(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * typeDecList(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * newDecNode(void); // 为语法树创建一个新的声明类型结点, 并将语法树节点成员初始化
TreeNode * newProcNode(void); // 为语法树创建一个新的函数类型结点,并将语法树节点成员初始化
void typeId(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void typeName(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void baseType(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void structureType(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void arrayType(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void recType(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * fieldDecList(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void idList(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void idMore(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * fieldDecMore(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * typeDecMore(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * varDec(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * varDeclaration(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * varDecList(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void varIdList(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void varIdMore(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * varDecMore(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * procDec(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * procDeclaration(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void paramList(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * paramDecList(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * param(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void formList(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
void fidMore(TreeNode * t); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * paramMore(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * procDecPart(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * procBody(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * programBody(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * newStmlNode(void); // 为语法树创建一个新的语句标志类型结点,并将语法树节点成员初始化
TreeNode * stmList(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * stm(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * conditionalStm(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * newStmtNode(StmtKind kind); // 为语法树创建一个新的语句类型结点,并将语法树节点成员初始化
TreeNode * exp(void); // 根据产生式调用相应递归处理函数,生成表达式类型语法树节点
TreeNode * simple_exp(void); // 根据产生式调用相应递归处理函数,生成表达式类型语法树节点
TreeNode * term(void); // 根据产生式调用相应递归处理函数,生成表达式类型语法树节点
TreeNode * factor(void); // 根据产生式调用相应的递归处理函数,生成表达式类型语法树节点
TreeNode * newExpNode(ExpKind kind); // 为语法树创建一个新的表达式类型结点,并将语法树节点的成员初始化
TreeNode * variable(void); // 根据产生式, 处理变量,生成其语法树节点
void variMore(TreeNode * t); // 根据产生式调用相应的递归处理变量中的几种不同类型
TreeNode * fieldvar(void); // 根据产生式,处理域变量,并生成其语法树节点
void fieldvarMore(TreeNode * t); // 根据产生式调用相应的递归处理域变量为数组类型的情况
TreeNode * loopStm(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * inputStm(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * outputStm(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * returnStm(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
char * copyString(char * s); // 为已存在的字串分配内存单元,并将其复制
TreeNode * assCall(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * assignmentRest(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * callStmRest(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * actParamList(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * actParamMore(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * stmMore(void); // 根据文法产生式,调用相应的递归处理函数,生成语法树节点
TreeNode * newRootNode(void); // 为语法树创建一个新的根结点,并将语法树节点成员初始化
void printTree(TreeNode *tree); // 把语法树输出
void printTab(int tabnum); // 打印个数为参数tabnum的空格
static void printSpaces(void); // 打印指定数量空格,用于表示子树缩进
/********************************************************************/
/* 函数名 parse */
/* 功 能 语法分析函数 */
/* 说 明 该函数把词法分析程序作为子程序调用,采用递归下降法 */
/* 根据产生式调用递归处理函数,函数为源程序创建语法分析树 */
/********************************************************************/
TreeNode * parse(void)
{
TreeNode * t = NULL;
/* 从文件Tokenlist中取得第一个单词,将词法信息送给token */
ReadNextToken(&token);
/* 开始调用基本语法分析处理函数,递归下降处理 */
t = program();
/* 当前单词token不是ENDFILE,报代码在文件结束前提前结束错误 */
if (token.Lex != ENDFILE)
syntaxError("代码在文件结束前提前结束!\n");
/* 函数返回语法树根节点t */
return t;
}
/********************************************************************/
/* 函数名 syntaxError */
/* 功 能 语法错误处理函数 */
/* 说 明 将函数参数message指定的错误信息输出 */
/* 设置错误追踪标志Error为TRUE */
/********************************************************************/
static void syntaxError(char * message) {
fprintf(stdout, "\n>>> error : ");
fprintf(stdout, "Syntax error at line %d: %s\n", token.lineshow, message);
Error = true;
}
/********************************************************************/
/* 函数名 program */
/* 功 能 总程序的处理函数 */
/* 产生式 < program > ::= programHead declarePart programBody . */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/* 语法树的根节点的第一个子节点指向程序头部分programHead, */
/* DeclaraPart为programHead的兄弟节点,程序体部分programBody */
/* 为declarePart的兄弟节点.