资源简介
目的:熟练掌握自下而上的语法分析方法,并能用程序实现。
要求:
1. 使用如下文法:
E E+T | T
T T*F | F
F (E) | id
2. 对于任意给定的输入串(词法记号流)进行语法分析,要求采用LR分析器来完成。手工构造LR分析表,利用移进-归约分析算法(P69 图3.12)输出(P70 表3.8)对应的动作部分。如:
输入:id*+id/(id+id)#
输出:移进
按 F->id归约
移进
error
……
3. 要有一定的错误处理功能。即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。
例如:
从状态0开始的记号流为:bm
将b移进之后,栈里的情况应该为: 0 b 2
此时查表发现 action[2,m]=error
输出打印:error
把A和状态1相继压入栈,用户指针后移到FOLLOW(A)对应的元素继续分析。
代码片段和文件信息
#include
#include
#include
#include
using namespace std;
class getstring
{
public:list istream;
stack label;
bool flag;
list::iterator getite(int i)
{
int j=0;
list::iterator it1=istream.begin();
while(j!=i)
{
j++;it1++;
}
return it1;
}
void getis()
{
string s1s2;
cout<<“请输入表达式:“< cin>>s1;
for(int i=0;i {
if(s1[i]==‘+‘||s1[i]==‘*‘||s1[i]==‘(‘||s1[i]==‘)‘)
{
s2.push_back(s1[i]);istream.push_back(s2);s2.clear();
}
else if(s1[i]==‘i‘)
{
s2.push_back(s1[i]);i++;
if(s1[i]==‘d‘){s2.push_back(s1[i]);istream.push_back(s2);s2.clear();}
else{error();}
}
else if(s1[i]==‘\0‘)
{
continue;
}
else
{error();}
}
istream.push_back(“$“);flag=false;
}
void error()
{
cout<<“错误!“< exit(0);
}
void test()
{
if(label.empty()||istream.empty()){exit(0);}
}
void gototable(string s1string s2)
{
if(s1==“0“&&s2==“E“)
{
label.push(“1“);
}
if((s1==“0“||s1==“4“)&&s2==“T“)
{
label.push(“2“);
}
if((s1==“0“||s1==“4“||s1==“6“)&&s2==“F“)
{
label.push(“3“);
}
if(s1==“4“&&s2==“E“)
{
label.push(“8“);
}
if(s1==“6“&&s2==“T“)
{
label.push(“9“);
}
if(s1==“7“&&s2==“F“)
{
label.push(“10“);
}
}
void analyse()
{
label.push(“0“);
string stoplistops1;
while(!(label.empty()||istream.empty())&&!(label.top()==“1“&&istream.front()==“$“))
{
stop=label.top();listop=istream.front();
if((stop==“0“||stop==“4“||stop==“6“||stop==“7“)&&listop==“id“)
{
label.push(“id“);label.push(“5“);istream.pop_front();cout<<“移进“< }
if((stop==“0“||stop==“4“||stop==“6“||stop==“7“)&&listop==“(“)
{
label.push(“(“);label.push(“4“);istream.pop_front();cout<<“移进“< }
if((stop==“1“||stop==“8“)&&listop==“+“)
{
label.push(“+“);label.push(“6“);istream.pop_front();cout<<“移进“< }
if((stop==“2“||stop==“9“)&&listop==“*“)
{
label.push(“*“);label.push(“7“);istream.pop_front();cout<<“移进“< }
if(stop==“8“&&listop==“)“)
{
label.
相关资源
- Cryptography in C and C++
- c++标准程序库《》侯杰
- 打开DCM图像,C++
- 北京邮电大学大一C++期末考题.zip
- c++面试题题目集锦
- 传智播客扫地僧C++STL.zip
- Microsoft Visual C++ 2005 Redistributable Pack
- GPS RINEX o文件、n文件和sp3文件c++读取
- 点云数据txt格式
- 网络编程HttpServer c++实现
- VC++帮助文档
- C++ High PerformanceA Boost and optimize the p
- 运用opencv的c++图像单点相关系数匹配
- OpenGL开发的二维坦克大战游戏,小时
- 外卖管理系统含界面C++代码
- C++程序设计--谭浩强完整版
- 仿QQ登陆聊天界面源码C++
- 基于MFC的 数字相册
- VC++6.0对txt文件的增删改查操作
- 基于c++的贪吃蛇游戏设计
- C++ Builder 简体中文版入门教程
- 最好的CS游戏opengl、C++实现
- ruminations on C++
- C++继承、派生 代码
- c++基于OpenGL的游戏源代码
- 简单回合制游戏C++
- C++打造流星雨特效源代码
- IP流量包分析程序
- Programming Abstractions in C++
- C++课后小练习(类、继承、多态等有
评论
共有 条评论