c递归向下语法分析.docx
- 文档编号:9165302
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:20
- 大小:17.35KB
c递归向下语法分析.docx
《c递归向下语法分析.docx》由会员分享,可在线阅读,更多相关《c递归向下语法分析.docx(20页珍藏版)》请在冰豆网上搜索。
c递归向下语法分析
TreeNode*newExpNode(ExpKindkind)
{
TreeNode*t=(TreeNode*)malloc(sizeof(TreeNode));
inti=0;
for(i=0;i<4;i++)
t->child[i]=NULL;
t->sibling=NULL;
t->nodekind=Expk;
t->kind.exp=kind;
t->lineno=lieno1;///////后面再从定义一个来使用主要有提前保存的情况
t->type=Void;
returnt;
}
TreeNode*newDefineNode(DefineKindkind)
{
TreeNode*t=(TreeNode*)malloc(sizeof(TreeNode));
inti=0;
for(i=0;i<4;i++)
t->child[i]=NULL;
t->sibling=NULL;
t->nodekind=Definek;
t->kind.def=kind;
t->lineno=lieno1;//保存第一个变量所在的行
if(Temptoken1=INT)
t->type=Interger;
elseif(Temptoken1=VOID)
t->type=Void;
returnt;
}
TreeNode*newStmtNode(StmtKindkind)
{
TreeNode*t=(TreeNode*)malloc(sizeof(TreeNode));
inti=0;
for(i=0;i<4;i++)
t->child[i]=NULL;
t->sibling=NULL;
t->nodekind=Stmtk;
t->kind.stmt=kind;
t->lineno=lieno1;///////后面再从定义一个来使用主要有提前保存的情况
returnt;
}
#include"2.h"
staticvoidmatch(Tokentypeexpected)
{
if(token==expected)////////////////////////
token=gettoken();
else
;////////输出错误
}
intmain()
{
chartemp[100]={'\0'};
printf("输入文件路径:
");
scanf("%s",temp);
if((fp=fopen(temp,"rt"))==NULL)
printf("文件名错误");
else
{
TreeNode*t=parse();//t为所求
}
return0;
}
TreeNode*declaration_list()
{
TreeNode*t=declaration();
TreeNode*p=t;
while((token!
=ENDFILE)&&(token!
=ELSE))//条件还没有弄清楚
{
TreeNode*q;
q=declaration();
if(q!
=NULL)
{
if(t==NULL)
t=p=q;
else
{
p->sibling=q;///兄弟节点
p=q;
}
}
}
returnt;
}
TreeNode*declaration()
{
TreeNode*t=NULL;
if(token==INT||token==VOID)
{
RESERVED++;//保存第一个token的信息
if(token==INT)//INT情况
{
pp=true;
match(INT);
}
else//void情况
{
pp=true;
match(VOID);
}
RESERVED++;//保存第二个节点的信息
match(ID);
switch(token)
{
caseFENHAO:
markvar=true;
t=var_declaration();
break;
caseLDAKUO:
markvar=true;
t=var_declaration();
break;
caseLKUOHAO:
t=fun_declaration();
break;
default:
printf("ERROR");
break;
}
}
returnt;
}
TreeNode*var_declaration()
{
TreeNode*t=NULL;//胡乱定义的这是
if(markvar)
{
TreeNode*t=newDefineNode(var);
TreeNode*p=newExpNode(idk);//////保存先前保留的ID中的内容
t->child[0]=p;
}
else
{
}
if(token==FENHAO)
{
match(FENHAO);
}
elseif(token==LDAKUO)
{
match(LDAKUO);
TreeNode*q=newExpNode(constk);//保存数字的值
match(NUM);
match(RDAKUO);
match(FENHAO);
}
RESERVED=0;
returnt;
}
TreeNode*fun_declaration()
{
TreeNode*t=newDefineNode(fun);
TreeNode*p=newExpNode(idk);//////保存先前保留的ID中的内容
match(LKUOHAO);
t->child[0]=params();
match(RKUOHAO);
t->child[1]=compound_stmt();
match(FENHAO);
RESERVED=0;
returnt;
}
TreeNode*params()
{
TreeNode*t=NULL;
if(token==VOID)
{
t=newDefineNode(var);//把这个单个的void当做一个定义的节点定义
match(VOID);//是void的情况下t直接返回NULL
}
else
{
t=param_list();
}
returnt;
}
TreeNode*param_list()
{
TreeNode*t=param();
while(token==DOUHAO)
{
TreeNode*p=newExpNode(opk);
if(p!
=NULL)
{
p->child[0]=t;
p->attr.op=token;
t=p;
match(token);
p->child[1]=param();
}
}
returnt;
}
TreeNode*arglist()
{
TreeNode*t=param();
while(token==DOUHAO)
{
TreeNode*p=newExpNode(opk);
if(p!
=NULL)
{
p->child[0]=t;
p->attr.op=token;
t=p;
match(token);
p->child[1]=param();
}
}
returnt;
}
TreeNode*param()//建立定义类型的节点
{
TreeNode*t=NULL;
if(token==INT||token==VOID)
{
t=newDefineNode(var);///变量定义的情况
if(token==INT)//IF的情况
{
t->type=Interger;
match(INT);
}
else
{
t->type=Void;
match(VOID);
}
t->child[0]=newExpNode(idk);///是不是还要把字符给记录进去啊这个
match(ID);
if(token==LDAKUO)
{
match(LDAKUO);
t->child[1]=newExpNode(constk);///////虽然括号里面是空的,但还是把它看做一个常量constk处理
t->child[1]->type=Interger;
match(RDAKUO);
}
}
returnt;
}
TreeNode*compound_stmt()//参照repet_stmt编写代码
{
TreeNode*t=NULL;
match(LHUAKUO);
if(t!
=NULL)
{
t=local_declarations();
if(t!
=NULL)
t->sibling=statement_list();
else//在上一个节点确实存在的时候才把后一个节点保存在t->child[0]中;
t=statement_list();
}
returnt;
}
TreeNode*local_declarations()
{
TreeNode*t=NULL;
TreeNode*p1=NULL;
TreeNode*p2=NULL;
if(token==INT||token==VOID)
t=var_declaration();
p2=t;
while(token==INT||token==VOID)
{
p1=var_declaration();
p2->sibling=p1;
p2=p1;
}
returnt;
}
TreeNode*statement_list()
{
TreeNode*t=NULL;
TreeNode*p1=NULL;
TreeNode*p2=NULL;
if(token==FENHAO||token==ID||token==LHUAKUO||token==IF||token==WHILE||token==RETURN)
t=statement();
p2=t;
while(token==FENHAO||token==ID||token==LHUAKUO||token==IF||token==WHILE||token==RETURN)
{
p1=statement();
p2->sibling=p1;
p2=p1;
}
returnt;
}
TreeNode*statement()
{
TreeNode*t=NULL;
switch(token)
{
caseFENHAO:
t=expression_stmt();break;
caseID:
t=expression_stmt();break;
caseLHUAKUO:
t=compound_stmt();break;
caseIF:
t=selection_stmt();break;
caseWHILE:
t=iteration_stmt();break;
caseRETURN:
t=return_stmt();break;
}
returnt;
}
TreeNode*expression_stmt()///////没有建立节点不知道对不对
{
TreeNode*t=NULL;
if(token==FENHAO)
;//FENHAO结束,没有操作
elseif(token==ID)
t=expression();
else
printf("ERROR");///出错处理
returnt;
}
TreeNode*selection_stmt()
{
TreeNode*t=newStmtNode(ifk);
match(IF);
match(LKUOHAO);
if(t!
=NULL)
t->child[0]=expression();
match(RKUOHAO);
if(t!
=NULL)
t->child[1]=statement();
if(token==ELSE)
{
match(ELSE);
if(t!
=NULL)
t->child[2]=statement();
}
returnt;
}
TreeNode*iteration_stmt()
{
TreeNode*t=newStmtNode(whilek);
match(WHILE);
match(LKUOHAO);
if(t!
=NULL)
t->child[0]=expression();
match(RKUOHAO);
if(t!
=NULL)
t->child[1]=statement();
returnt;
}
TreeNode*return_stmt()
{
TreeNode*t=newStmtNode(returnk);
match(RETURN);
if(token==FENHAO)
match(FENHAO);
elseif(token==ID)
{
t->child[0]=expression();
match(FENHAO);
}
returnt;
}
TreeNode*expression()
{
TreeNode*t=newStmtNode(assignk);////赋值表达式
TreeNode*p1,*p2;
booltemp=true;////最开始那个循环的节点作为t的孩子节点,后面的节点全当做第一个孩子节点的兄弟节点处理
p2=t;
inti=0;
while(token=ID)
{
p1=Var();//还需要把ID的内容写到相应的节点中
if(temp)
p2->child[0]=p1;
else
p2->sibling=p1;
p2=p1;
match(EQ);
temp=false;
}
p1=simple_expression();
p2->sibling=p1;
returnt;
}
TreeNode*Var()
{
TreeNode*t=newExpNode(idk);////对应attr中的内容
TreeNode*p=NULL;
match(ID);//还需要吧ID的内容添加到相应的节点中
if(token==LDAKUO)
{
match(LDAKUO);
p=expression();
t->sibling=p;//把expression当做兄弟节点看待
match(RDAKUO);
}
returnt;
}
TreeNode*simple_expression()
{
TreeNode*t=additive_expression();
TreeNode*p2=NULL;
if(token==LESS||token==LESSA||token==MORE||token==MOREA||token==EQ||token==UEQ)
{
p2=newExpNode(opk);
if(p2!
=NULL)
{
p2->attr.op=token;
p2->child[0]=t;
match(token);
p2->child[1]=additive_expression();
t=p2;
}
}
returnt;
}
TreeNode*additive_expression()//完全参照书上的实现
{
TreeNode*t=term();
while(token==PLUS||token==MINUS)
{
TreeNode*p=newExpNode(opk);
if(p!
=NULL)
{
p->child[0]=t;
p->attr.op=token;
t=p;
match(token);
p->child[1]=term();
}
}
returnt;
}
TreeNode*term()/////完全参照书上的实现
{
TreeNode*t=factor();
while(token==MULTI||token==DIV)//乘除问题
{
TreeNode*p=newExpNode(opk);
if(p!
=NULL)
{
p->child[0]=t;
p->attr.op=token;
t=p;
match(token);
p->child[1]=factor();
}
}
returnt;
}
TreeNode*factor()////////////////////////////////参照书上的FACTOR实现
{
TreeNode*t=NULL;
switch(token)
{
caseNUM:
t=newExpNode(constk);
if((t!
=NULL)&&(token=NUM))
t->attr.val=atoi(tokenstring);//////////////////////tokenstring表示匹配token的内容推广
match(NUM);
break;
caseLKUOHAO:
match(LKUOHAO);
t=expression();
match(RKUOHAO);
break;
caseID:
pp=true;
RESERVED++;
match(ID);///////同时要在这里定义一个来保存
if(token==LKUOHAO)
t=call();
else
{
markvar=true;
t=Var();
}
default:
;///////////////出错处理
}
returnt;
}
TreeNode*call()
{
TreeNode*t=newStmtNode(whilek);///、、。
。
。
。
。
。
。
。
/胡乱写的whilek
///保存没有实现
match(LKUOHAO);
t->sibling=args();///把args当做函数调用节点的兄弟节点保存
match(RKUOHAO);
RESERVED=0;
returnt;
}
TreeNode*args()
{
TreeNode*t=NULL;
if(token==ID||token==NUM||token==LKUOHAO)
t=arg_list();
returnt;
}
TreeNode*arg_list()
{
TreeNode*t=expression();
while(token==DOUHAO)/////////////////////////////////////逗号表达式
{
TreeNode*p=newExpNode(opk);
if(p!
=NULL)
{
p->child[0]=t;
p->attr.op=DOUHAO;
t=p;
match(DOUHAO);
p->child[1]=expression();
}
}
returnt;
}
TreeNode*parse()
{
TreeNode*t;
token=gettoken();
t=declaration_list();
if(token!
=ENDFILE)
printf("error");
returnt;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归 向下 语法分析