#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的兄弟节点.
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
LGanalysis.7z (35个子文件)
.vs
LGanalysis
v15
Browse.VC.db 4.57MB
.suo 49KB
ipch
AutoPCH
LGANALYSIS-3a1651f7
UTIL-7f8f24b5
UTIL.ipch 2.94MB
PARSE-68d77172
PARSE.ipch 3.5MB
SCANNER-268795c1
SCANNER.ipch 3.63MB
MAIN-67122c5c
MAIN.ipch 2.06MB
GLOBAL-3978262d
GLOBAL.ipch 2.88MB
LGanalysis
parse.cpp 68KB
util.h 348B
util.cpp 5KB
LGanalysis.vcxproj.filters 2KB
main.cpp 1KB
scanner.cpp 14KB
LGanalysis.vcxproj 7KB
scanner.h 126B
parse.h 246B
Debug
parse.obj 98KB
LGanalysis.log 970B
LGanalysis.tlog
CL.write.1.tlog 6KB
CL.read.1.tlog 15KB
CL.command.1.tlog 3KB
link.write.1.tlog 1KB
link.command.1.tlog 3KB
link.read.1.tlog 4KB
LGanalysis.lastbuildstate 227B
scanner.obj 24KB
main.obj 16KB
vc141.idb 123KB
util.obj 24KB
vc141.pdb 92KB
globals.h 6KB
LGanalysis.sln 1KB
Debug
LGanalysis.exe 70KB
LGanalysis.pdb 580KB
LGanalysis.ilk 386KB
共 35 条
- 1
资源评论
- sinat_366985772017-12-31不知道放哪里了
xuqi7
- 粉丝: 68
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功