没有合适的资源?快使用搜索试试~ 我知道了~
1. 使用如下文法: E ® E+T | T T ® T*F | F F ® (E) | id 2. 对于任意给定的输入串(词法记号流)进行语法分析,要求采用LR分析器来完成。手工构造LR分析表,利用移进-归约分析算法(P71 图3.12)输出(P73 表3.8)对应的动作部分。如: 输入:id*+id/(id+id)# 输出:移进 按 F->id归约 按 T->F归约 移进 error …… 3. 要有一定的错误处理功能。即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。 例如: 从状态0开始的记号流为:bm 将b移进之后,栈里的情况应该为: 0 b 2 此时查表发现 action[2,m]=error 输出打印:error 把A和状态1相继压入栈,用户指针后移到FOLLOW(A)对应的元素继续分析。 4. 利用P94页的表3.13的方式将错误进行分类提示,即给出具体的出错信息。 扩展: 在已有文法的基础上再加上减法“-”和除法“/”对应的产生式构成最终的文法。从而使得记号流可以处理带括号的加、减、乘、除四则运算。
资源推荐
资源详情
资源评论
#include<iostream>
#include<string>
#include<stack>
#include<list>
using namespace std;
class getstring
{
public:list <string> istream;
stack<string> label;
bool flag;
list<string>::iterator getite(int i)
{
int j = 0;
list<string>::iterator it1 = istream.begin();
while (j != i)
{
j++; it1++;
}
return it1;
}
void getis()
{
string s1, s2;
cout << "请输入表达式:" << endl;
cin >> s1;
for (int i = 0; i<s1.size(); i++)
{
if (s1[i] == '+' || s1[i] == '*' || s1[i] == '(' || s1[i] == ')')
{
s2.push_back(s1[i]); istream.push_back(s2); s2.clear();
#include<string>
#include<stack>
#include<list>
using namespace std;
class getstring
{
public:list <string> istream;
stack<string> label;
bool flag;
list<string>::iterator getite(int i)
{
int j = 0;
list<string>::iterator it1 = istream.begin();
while (j != i)
{
j++; it1++;
}
return it1;
}
void getis()
{
string s1, s2;
cout << "请输入表达式:" << endl;
cin >> s1;
for (int i = 0; i<s1.size(); 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 << "错误!" << endl;
exit(0);
}
void test()
{
if (label.empty() || istream.empty()) { exit(0); }
}
void gototable(string s1, string s2)
{
if (s1 == "0"&&s2 == "E")
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 << "错误!" << endl;
exit(0);
}
void test()
{
if (label.empty() || istream.empty()) { exit(0); }
}
void gototable(string s1, string s2)
{
if (s1 == "0"&&s2 == "E")
剩余6页未读,继续阅读
资源评论
Damugeisme
- 粉丝: 1
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功