资源简介
第三次上机—语法分析1
目的:熟练掌握自上而下的语法分析方法,并能用C++程序实现。
要求:
1. 使用的文法如下:
E ® TE ¢
E ¢ ® + TE ¢ | e
T ® FT ¢
T ¢ ® * FT ¢ | e
F ® (E) | id
2. 对于任意给定的输入串(词法记号流)进行语法分析,递归下降方法和非递归预测分析方法可以任选其一来实现。
3. 要有一定的错误处理功能。即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。可以参考书上介绍的同步记号集合来处理。
可能的出错情况:idid*id, id**id, (id+id, +id*+id ……
4. 输入串以#结尾,输出推导过程中使用到的产生式。例如:
输入:id+id*id#
输出:E ® TE ¢
T ® FT ¢
F ® id
E ¢ ® + TE ¢
T ® FT ¢
……
如果输入串有错误,则在输出中要体现是跳过输入串的某些记号了,还是弹栈,弹出某个非终结符或者是终结符了,同时给出相应的出错提示信息。比如:
idid*id对应的出错信息是:“输入串跳过记号id,用户多输入了一个id”;
id**id对应的出错信息是:“弹栈,弹出非终结符F,用户少输入了一个id”
(id+id对应的出错信息是:“弹栈,弹出终结符 ) ,用户少输入了一个右括号(或者说,括号不匹配)”
有余力的同学可进一步考虑如下扩展:
1. 将递归下降方法和非递归预测分析方法都实现
2. 在语法分析的过程中调用第二次上机的结果,即利用词法分析器来返回一个记号给语法分析器。
3. 编写First和Follow函数,实现其求解过程。
测试文法:
A->BCDE
B->aBA|ε
C->F|ε
D->b|c|ε
E->e|ε
F->d|ε
代码片段和文件信息
#include
using namespace std;
char st[20]; //存储输入句子
int i=0; //数组下标
void E();
void R();//E‘
void T();
void H();//T‘
void F();
//***********************************
//检错部分
int comp(char s1string s2);
int error_check(int n);
string firfol[5]={“(i““)+e““(i““+*)e““(i“};
string synch[5]={“)““““+)““““+*)“};
char s[5]={‘E‘‘R‘‘T‘‘H‘‘F‘};
int error_check(int n){
if(comp(st[i]synch[n])==1){
cout<<“弹出非终结符“< return 0;
}
else while(comp(st[i]firfol[n])==0&&comp(st[i]synch[n])==0&&st[i]!=‘#‘){
cout<<“输入串跳过记号“< i++;
}
return 1;
}
int comp(char s1string s2){
for(int j=0;j if(s1==s2[j])
return 1;
}
return 0;
}
//*****************************
void main(){
cout<<“使用的文法为:\nE->TE‘\nE‘->+TE‘|e\nT->FT‘\nT‘->*FT‘|e\nF->(E)|id\n“;
cout<<“-------------------“< cout<<“输入待检测串(以 # 结束):“< cin>>st;
cout<<“-------------------“< cout< E();
if(st[i]!=‘#‘){
cout<<“输入串跳过记号 “< i++;
E();
}system(“pause“);
}
void E(){
if(error_check(0)==0||st[i]==‘#‘);
else{
cout<<“E->TE‘“< T();
R();
}
}
void R(){
if(error_check(1)==0);
else{
if(st[i]==‘+‘){
cout<<“E‘->+TE‘“< i++;
T();
R();
}
else
cout<<“T‘->e“< }
}
void T(){
if(error_check(2)==0);
else{
cout<<“T->FT‘“< F();
H();
}
}
void H(){
if(error_check(3)==0);
else{
if(st[i]==‘*‘){
cout<<“T‘->*FT‘“< i++;
F();
H();
}
else
cout<<“T‘->e“< }
}
void F(){
if(error_check(4)==0);
else{
if(st[i]==‘i‘){
i++;
if(st[i]==‘d‘)
{
cout<<“F->id“< i++;
}
}
else
if(st[i]==‘(‘){
cout<<“F->(E)“< i++;
E();
if(st[i]==‘)‘){
i++;
}
else if(st[i]!=‘)‘)
cout<<“括号不匹配“< }
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2013-04-27 19:07 test\
文件 2127 2013-05-27 18:47 test\digui.cpp
文件 4562 2013-05-27 18:47 test\feidigui.cpp
文件 32256 2013-04-22 21:35 test\第三次上机作业-语法分析1.doc
相关资源
- 编译原理--递归下降分析程序C++
- 运用递归下降子程序法,实现整数四
- PL0语法分析器(递归子程序法)
- 编译原理语法分析—递归下降分析法
- 编译原理大作业递归下降法
- 非递归预测分析;C++实现LL1文法分析
- 递归下降语法分析器C++实现
- Pascal文法子集的词法分析及递归下降
- 实验三-递归下降子程序分析(本代码
- 递归下降法翻译if then条件语句
- C++ 递归下降布尔表达式
- 递归下降分析法实现LL(1)文法的语
- 编译原理_递归下降分析语法分析_C语
- SNL递归下降语法分析 C++实现
- 用栈非递归方法迷宫找出路
- 分别用栈和递归来实现十进制转换为
- 二叉树非递归遍历源码
- 众数问题c实现
- 24点算法 C++实现
- 汉诺塔非递归算法 用栈 C语言
- C语言 地图染色 非递归 源代码
- 递归和非递归解决迷宫问题
- LL(1)文法求First和Follow集合
- 实验二 递归子程序方法
- 递归高斯模糊源代码最快速的高斯模
- 在1、2、3...9保持这个顺序之间可任意
- 蛇形矩阵递归算法
- c语言,二叉树,前中后,递归,非递
- 递归反转字符串带中文
- 0-1背包问题-递归算法 c语言实现
评论
共有 条评论