Chapter 4 ABSTRACT SYNTAX
4.2
问题的思考【仅供参考】:
1、根据第三章的递归下降的分析方法(P47,P89)写出分析程序。
2、将程序4.4中定义的文法动作提取出来,嵌入到递归下降的分析程序中,嵌入的方法有
三种:分析程序的返回值、函数的附加功能和两者融合的方式(P88,P89)。
【其中:S:stmt L:exps E:exp B:PLUS|MINUS|TIMES|DIV】
enum token{ID,INT,PLUS,MINUS,TIMES,DIV, ASSIGN,PRINT,LPAREN,RPAREN, SEMICOLON, COMMA};
union tokenval{string id;int num;};
enum token tok;
union tokenval tokval;
typedef struct table *Table_;
Table_{string id;int value; Table_ tail};
Table_ Table(string id,int value,struct table *tail);
Table_ Table=NULL;
int lookup(Table_ table,string id){
asrt(table!=NULL);
if(id==table.id) return table.value;
el return lookup(table.tail,id);
}
void update(Table_ *tabptr,string id,int value){
*tabptr=Table(id,value,*tabptr);
}
int S_FOLLOW[]={SEMICOLON,COMMA};
void S(void)
{
我国政府的性质switch(tok)
{
ca ID:{string id=tokval.id;
高中数学思想方法if(lookahead()==ASSIGN){
advance();
update(table,id,E());
}
skipto(S_FOLLOW);
break;
}
ca PRINT:{
advance();
if(lookahead()==LPAREN){
L();
eatOrSkipTo(RPAREN,S_FOLLOW);
}
break;
}
default: {
printf(“expected ID or PRINT”);
skipto(S_FOLLOW);
}
}
int L_FOLLOW[]={COMMA,SEMICOLON,RPAREN};
void L(void)
{
switch(tok)
{
ca ID:
ca INT:
{
printf(“%d”,E());
break;
}
default:{
printf(“expected ID or INT”);
skipto(L_FOLLOW);
小年的风俗}
}
}
int E_FOLLOW[]={SEMICOLON,PLUS,MINUS,TIMES,DIV,RPAREN}; int E()
{
switch(tok)
{
ca ID:{
int i=lookup(table,tokval.id);
int p=lookahead();
if(p==PLUS||P==MINUS||P==TIMES||P==DIV){
advance();
return B(i);
}
advance();
return i;
薄成语
读图时代}
ca INT:{
int i=tokval.num;
int p=lookahead();
if(p==PLUS||P==MINUS||P==TIMES||P==DIV){ advance();
return B(i);
}
advance();
return i;
}
ca LPAREN:{
int i=E();
if(lookahead()==RPAREN)
return i;
el{
skipto(E_FOLLOW);
return 0;
唐诗书法作品
}
}
default:{
printf(“expected ID,INT,LPAREN”);
skipto(E_FOLLOW);
return 0;
}
}
}
int B_FOLLOW[]={ID,INT,LPAREN};
int B(int a)
{
switch(tok)
{
ca PLUS:{
advance();
return (a+E());
}
ca MINUS:{
advance();
return (a-E());
}
ca TIMES:{
advance();
文科女生最吃香的专业return (a*E());
}
ca DIV:{
advance();
return (a/E());
}刮目相待造句
Default:{
Skipto(B_FOLLOW);
return 0;
}
}
}
void eatOrSkipTo(int expected,int *stop)
{
if(tok==expected){
eat(expected);
}
el{
skipto(stop);
}
}
【注:只要实现出来就行,答案不唯一,很多同学消除了左递归,都是对的】5.1 a、b (略)
这里主要是数据结构知识,问题不是很大,大家数据结构学的都不错。