📄 func.cpp
字号:
/* 指定新语法树节点t成员: 结点类型nodekind为表达式类型ExpK */
t->nodekind = TypeK;
/* 指定新语法树节点t成员: 源代码行号lineno为全局变量lineno */
t->lineno = lineno;
t->idnum = 0;
/*初始化符号表地址指针*/
for (int i=0;i<10;i++)
t->table[i] = NULL;
}
/* 函数返回表达式类型语法树结点指针t */
return t;
}
/********************************************************/
/* 函数名 newVarNode */
/* 功 能 变量声明标志语法树节点创建函数 */
/* 说 明 该函数为语法树创建一个新的变量声明标志结点,
/* 表示在它之下的声明都为变量声明, */
/* 并将语法树节点的成员初始化 */
/********************************************************/
TreeNode * Syntax::newVarNode()
{
/* 内存中动态申请分配单元,返回指向该单元的语法树节点类型指针t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 语法树节点指针t为NULL,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==NULL)
cout<<"Out of memory error at line"<<lineno<<endl;
/* 语法树节点指针t不是NULL,内存单元已经成功分配 */
else {
/* 初始化新语法树节点t各子节点child[i]为NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新语法树节点t兄弟节点sibling为NULL(空) */
t->sibling = NULL;
/* 指定新语法树节点t成员: 结点类型nodekind为表达式类型ExpK */
t->nodekind = VarK;
/* 指定新语法树节点t成员: 源代码行号lineno为全局变量lineno */
t->lineno = lineno;
t->idnum = 0;
/*初始化符号表地址指针*/
for (int i=0;i<10;i++)
t->table[i] = NULL;
}
/* 函数返回表达式类型语法树结点指针t */
return t;
}
//试试,如果行的话,就把它们合成一个!!!!
/********************************************************/
/* 函数名 newDecNode */
/* 功 能 创建声明类型语法树节点函数 */
/* 说 明 该函数为语法树创建一个新的声明类型结点 */
/* 并将语法树节点成员初始化 */
/********************************************************/
TreeNode * Syntax::newDecNode(void)
{
/* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 语法树节点指针t为NULL,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==NULL)
{
cout<<"Out of memory error at line"<<lineno<<endl;
Error = TRUE;
}
/* 语法树节点指针t不是NULL,成功分配内存单元 */
else {
/* 初始化新语法树节点t各子节点child[i]为NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新语法树节点t兄弟节点sibling为NULL */
t->sibling = NULL;
/* 指定新语法树节点t成员:结点类型nodekind为语句类型DecK*/
t->nodekind = DecK;
/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
t->lineno = lineno;
t->idnum=0;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函数返回声明类型语法树节点指针t */
return t;
}
/********************************************************/
/* 函数名 newProcNode */
/* 功 能 创建函数类型语法树节点函数 */
/* 说 明 该函数为语法树创建一个新的函数类型结点 */
/* 并将语法树节点成员初始化 */
/********************************************************/
TreeNode * Syntax::newProcNode(void)
{
/* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 语法树节点指针t为NULL,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==NULL)
{
cout<<"Out of memory error at line"<<lineno<<endl;
Error = TRUE;
}
/* 语法树节点指针t不是NULL,成功分配内存单元 */
else {
/* 初始化新语法树节点t各子节点child[i]为NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新语法树节点t兄弟节点sibling为NULL */
t->sibling = NULL;
/* 指定新语法树节点t成员:结点类型nodekind为语句类型ProcDecK */
t->nodekind = ProcDecK;
/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
t->lineno = lineno;
t->idnum = 0;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函数返回语句类型语法树节点指针t */
return t;
}
/********************************************************/
/* 函数名 newStmlNode */
/* 功 能 创建语句标志类型语法树节点函数 */
/* 说 明 该函数为语法树创建一个新的语句标志类型结点 */
/* 并将语法树节点成员初始化 */
/********************************************************/
TreeNode * Syntax::newStmlNode(void)
{
/* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 语法树节点指针t为NULL,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==NULL)
{
cout<<"Out of memory error at line"<<lineno<<endl;
Error = TRUE;
}
/* 语法树节点指针t不是NULL,成功分配内存单元 */
else {
/* 初始化新语法树节点t各子节点child[i]为NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新语法树节点t兄弟节点sibling为NULL */
t->sibling = NULL;
/* 指定新语法树节点t成员:结点类型nodekind为语句类型StmLK */
t->nodekind = StmLK;
/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
t->lineno = lineno;
t->idnum = 0;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/*函数返回语句类型语法树节点指针t*/
return t;
}
/********************************************************/
/* 函数名 newStmtNode */
/* 功 能 创建语句类型语法树节点函数 */
/* 说 明 该函数为语法树创建一个新的语句类型结点 */
/* 并将语法树节点成员初始化 */
/********************************************************/
TreeNode * Syntax::newStmtNode(StmtKind kind)
{
/* 在内存中动态申请分配单元,返回指向该单元的语法树结点类型指针t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 语法树节点指针t为NULL,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==NULL)
{
cout<<"Out of memory error at line"<<lineno<<endl;
Error = TRUE;
}
/* 语法树节点指针t不是NULL,成功分配内存单元 */
else {
/* 初始化新语法树节点t各子节点child[i]为NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新语法树节点t兄弟节点sibling为NULL */
t->sibling = NULL;
/* 指定新语法树节点t成员:结点类型nodekind为语句类型StmtK */
t->nodekind = StmtK;
/* 指定新语法树节点t成员:语句类型kind.stmt为函数给定参数kind */
t->kind.stmt = kind;
/* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */
t->lineno = lineno;
t->idnum = 0;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函数返回语句类型语法树节点指针t */
return t;
}
/********************************************************/
/* 函数名 newExpNode */
/* 功 能 表达式类型语法树节点创建函数 */
/* 说 明 该函数为语法树创建一个新的表达式类型结点 */
/* 并将语法树节点的成员初始化 */
/********************************************************/
TreeNode * Syntax::newExpNode(ExpKind kind)
{
/* 内存中动态申请分配单元,返回指向该单元的语法树节点类型指针t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 语法树节点指针t为NULL,未能成功分配内存单元 *
* 将出错信息及行号lineno写入列表文件listing */
if (t==NULL)
{
cout<<"Out of memory error at line"<<lineno<<endl;
Error = TRUE;
}
/* 语法树节点指针t不是NULL,内存单元已经成功分配 */
else {
/* 初始化新语法树节点t各子节点child[i]为NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新语法树节点t兄弟节点sibling为NULL(空) */
t->sibling = NULL;
/* 指定新语法树节点t成员: 结点类型nodekind为表达式类型ExpK */
t->nodekind = ExpK;
/* 指定新语法树节点t成员: 表达式类型kind.exp为函数给定参数kind */
t->kind.exp = kind;
/* 指定新语法树节点t成员: 源代码行号lineno为全局变量lineno */
t->lineno = lineno;
/* 指定新语法树节点t成员: 表达式为变量类型时的变量类型varkind *
/* 为IdV.*/
t->attr.ExpAttr.varkind = IdV;
/* 指定新语法树节点t成员: 类型检查类型type为Void */
t->attr.ExpAttr.type = Void;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函数返回表达式类型语法树结点指针t */
return t;
}
/********** 递归调用的成员函数原型 ************/
/********************************************************************/
/* 函数名 program */
/* 功 能 总程序的处理函数 */
/* 产生式 < program > ::= programHead declarePart programBody . */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/* 语法树的根节点的第一个子节点指向程序头部分programHead, */
/* DeclaraPart为programHead的兄弟节点,程序体部分programBody */
/* 为declarePart的兄弟节点. */
/********************************************************************/
TreeNode * Syntax::program(void)
{
TreeNode * t=programHead();
TreeNode * q=declarePart();
TreeNode * s=programBody();
TreeNode * root =newRootNode();
if(root!=NULL)
{
root->lineno = 0;
if(t!=NULL) root->child[0] = t;
else syntaxError("a program head is expected!");
if(q!=NULL) root->child[1] = q;
if(s!=NULL) root->child[2] = s;
else syntaxError("a program body is expected!");
}
match(DOT);
return root;
}
/********************************************************************/
/* 函数名 programHead */
/* 功 能 程序头的处理函数 */
/* 产生式 < programHead > ::= PROGRAM ProgramName */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode * Syntax::programHead(void)
{
TreeNode * t = newPheadNode();
match(PROGRAM);
if((t!=NULL)&&(token.Lex==ID))
{
t->lineno = 0;
strcpy(t->name[0], token.Sem);
}
match(ID);
return t;
}
/*************************声明部分***********************************/
/********************************************************************/
/* 函数名 declarePart */
/* 功 能 声明部分的处理函数 */
/* 产生式 < declarePart > ::= typeDec varDec procDec */
/* 说 明 函数根据文法产生式,调用相应的递归处理函数,生成语法树节点 */
/********************************************************************/
TreeNode * Syntax::declarePart(void)
{
/*类型*/
TreeNode * typeP = newDecANode(TypeK);
TreeNode * pp = typeP;
if(typeP!=NULL)
{
typeP->lineno = 0;
TreeNode * tp1 = typeDec();
if(tp1!=NULL)
typeP->child[0] = tp1;
else
{
free(typeP);
typeP=NULL;
}
}
/*变量*/
TreeNode * varP =newDecANode(VarK);
if(varP != NULL)
{
varP->lineno = 0;
TreeNode * tp2 = varDec();
if(tp2 != NULL)
varP->child[0] = tp2;
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -