急急急,编译原理
1.题目:编译程序构造2.内容:涉及词法分析、自下而上语法分析程序的实现:SLR(1)分析器的实现以及生成中间代码。3.具体要求根据LR分析算法构造SLR(1)分析程序,...
1.题目:编译程序构造
2.内容:涉及词法分析、自下而上语法分析程序的实现:SLR(1)分析器的实现以及生成中间代码。
3.具体要求
根据LR分析算法构造SLR(1)分析程序,并完成语法分析动作(当需要一个单词时,调用词法分析程序获取),同时完成语义分析生成四元式输出。要求程序具有通用性,改变文法时只需改变程序的数据初值,无需改变程序主体;
要求完成算数表达式和赋值语句的翻译,生成中间代码。
算数表达式和赋值语句的文法及相应的语义子程序。
(1)A→id=E {p=lookup(id.name);
emit(E.PALCE, , p);}
(2)E→E(1)+T {E.PALCE=newtemp();
emit(+,E(1).PALCE,T.PALCE,E.PALCE)}
(3)E→T {E.PALCE=T.PALCE;}
(4)T→T(1)*F {T.PALCE=newtemp();
emit(+,T(1).PALCE,F.PALCE,T.PALCE)}
(5)T→F {T.PALCE=F.PALCE;}
(6)F→(E) { F.PALCE=E.PALCE;}
(7)F→id {P=LOOKUP(id.name)
F.PALCE=P;}
构造其用于SLR(1)分析的识别活前缀的DFA以及action表和goto表。然后编程实现。(关于词法分析部分只需识别出与此文法相关的单词即可(+,*,(,),id,=))。
4.程序设计提示:
(1)分析栈设计时可以用一个栈完成,也可以设计三个栈:一个符号栈,一个状态栈,一个语义栈,则归约时,则需要在符号栈中退掉n个符号,在状态栈中退掉n个符号(n为产生式符号个数),语义栈中退掉n个符号对应的语义;
(2)终结符表和非终结符表的组织和预测分析程序中相同(将符号对应到一个数字,表示在分析表中对应的下标)。
(3)action表中的错误处理:简化的错误处理:当查找action表出现空白时,则当前单词无法移进和规约,可简单的认为当前单词为多余的单词,则抛弃当前单词,读下一单词继续分析。
5.测试数据:
作为程序测试数据,以赋值语句area=r*r+r$作为测试输入(源程序)。程序要求输出二元式序列、符号表、语法分析过程、四元式序列。
程序运行情况如下:
请输入源文件名称:E:\AA.TXT<回车>
语法分析过程如下:
状态栈 符号栈 语义栈 动作说明
源程序对应的二元式如下:
(id,0)
(=,)
(id,1)
(*,)
(id,1)
(+,)
(id,1)
符号表如下:
0 area
1 r
源程序对应的四元式序列如下:
(*,r,r,T1)
(+,T1,r,T2)
(=,T2,,area)
分析过程完成。
6.程序扩展要求
有能力的同学可 将编译程序扩展布尔表达式的分析和四元式生成,布尔表达式的翻译参见教材(胡元义《编译原理教程》)104——105页。 展开
2.内容:涉及词法分析、自下而上语法分析程序的实现:SLR(1)分析器的实现以及生成中间代码。
3.具体要求
根据LR分析算法构造SLR(1)分析程序,并完成语法分析动作(当需要一个单词时,调用词法分析程序获取),同时完成语义分析生成四元式输出。要求程序具有通用性,改变文法时只需改变程序的数据初值,无需改变程序主体;
要求完成算数表达式和赋值语句的翻译,生成中间代码。
算数表达式和赋值语句的文法及相应的语义子程序。
(1)A→id=E {p=lookup(id.name);
emit(E.PALCE, , p);}
(2)E→E(1)+T {E.PALCE=newtemp();
emit(+,E(1).PALCE,T.PALCE,E.PALCE)}
(3)E→T {E.PALCE=T.PALCE;}
(4)T→T(1)*F {T.PALCE=newtemp();
emit(+,T(1).PALCE,F.PALCE,T.PALCE)}
(5)T→F {T.PALCE=F.PALCE;}
(6)F→(E) { F.PALCE=E.PALCE;}
(7)F→id {P=LOOKUP(id.name)
F.PALCE=P;}
构造其用于SLR(1)分析的识别活前缀的DFA以及action表和goto表。然后编程实现。(关于词法分析部分只需识别出与此文法相关的单词即可(+,*,(,),id,=))。
4.程序设计提示:
(1)分析栈设计时可以用一个栈完成,也可以设计三个栈:一个符号栈,一个状态栈,一个语义栈,则归约时,则需要在符号栈中退掉n个符号,在状态栈中退掉n个符号(n为产生式符号个数),语义栈中退掉n个符号对应的语义;
(2)终结符表和非终结符表的组织和预测分析程序中相同(将符号对应到一个数字,表示在分析表中对应的下标)。
(3)action表中的错误处理:简化的错误处理:当查找action表出现空白时,则当前单词无法移进和规约,可简单的认为当前单词为多余的单词,则抛弃当前单词,读下一单词继续分析。
5.测试数据:
作为程序测试数据,以赋值语句area=r*r+r$作为测试输入(源程序)。程序要求输出二元式序列、符号表、语法分析过程、四元式序列。
程序运行情况如下:
请输入源文件名称:E:\AA.TXT<回车>
语法分析过程如下:
状态栈 符号栈 语义栈 动作说明
源程序对应的二元式如下:
(id,0)
(=,)
(id,1)
(*,)
(id,1)
(+,)
(id,1)
符号表如下:
0 area
1 r
源程序对应的四元式序列如下:
(*,r,r,T1)
(+,T1,r,T2)
(=,T2,,area)
分析过程完成。
6.程序扩展要求
有能力的同学可 将编译程序扩展布尔表达式的分析和四元式生成,布尔表达式的翻译参见教材(胡元义《编译原理教程》)104——105页。 展开
4个回答
展开全部
using namespace std;
struct BiNode
{
char data;
BiNode *lchild, *rchild;
};
typedef BiNode *BiTree;
int CreateBiTree(BiTree &T, const char *s1, const char *s2, int len)
{
if (len<=0)
{
T = NULL;
return 1;
}
else
{
T = new BiNode;
T->data = *s1;
int i;
for ( i=0; i<len; i++) if (s2[i]==*s1) break;
CreateBiTree(T->lchild, s1+1, s2, i);
CreateBiTree(T->rchild, s1+i+1, s2+i+1, len-(i+1));
}
return 1;
}
int DestroyBiTree(BiTree &T)
{
if (T==NULL) return 1;
DestroyBiTree(T->lchild);
DestroyBiTree(T->rchild);
delete T;
T = NULL;
return 1;
}
int ATraverse(BiTree &T)
{
if (T==NULL) return 1;
ATraverse(T->lchild);
ATraverse(T->rchild);
cout<<T->data;
return 1;
}
main()
{
char a[2000],b[2000];
while(cin>>a>>b)
{
BiTree T;
int count=0;
int n;
for(n=0;a[n]!='\0';n++);
CreateBiTree(T,a,b,n);
ATraverse(T);
cout<<" ";
cout<<endl;
DestroyBiTree(T);
struct BiNode
{
char data;
BiNode *lchild, *rchild;
};
typedef BiNode *BiTree;
int CreateBiTree(BiTree &T, const char *s1, const char *s2, int len)
{
if (len<=0)
{
T = NULL;
return 1;
}
else
{
T = new BiNode;
T->data = *s1;
int i;
for ( i=0; i<len; i++) if (s2[i]==*s1) break;
CreateBiTree(T->lchild, s1+1, s2, i);
CreateBiTree(T->rchild, s1+i+1, s2+i+1, len-(i+1));
}
return 1;
}
int DestroyBiTree(BiTree &T)
{
if (T==NULL) return 1;
DestroyBiTree(T->lchild);
DestroyBiTree(T->rchild);
delete T;
T = NULL;
return 1;
}
int ATraverse(BiTree &T)
{
if (T==NULL) return 1;
ATraverse(T->lchild);
ATraverse(T->rchild);
cout<<T->data;
return 1;
}
main()
{
char a[2000],b[2000];
while(cin>>a>>b)
{
BiTree T;
int count=0;
int n;
for(n=0;a[n]!='\0';n++);
CreateBiTree(T,a,b,n);
ATraverse(T);
cout<<" ";
cout<<endl;
DestroyBiTree(T);
展开全部
我退休了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议你到相关的论坛上需求高手 那里比较专业!
要解决问题就应该知道什么地方最能帮你解决问题。。
要解决问题就应该知道什么地方最能帮你解决问题。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询