没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
23页
设计内容及要求:设计一个语法制导翻译器,将算术表达式翻译成四元式。 要求:先确定一个定义算术表达式的文法,为其设计一个语法分析程序,为每条 产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。 对用户输入的任意一个正确的算术表达式,程序将其转换成四元式输出(可按一 定格式输出到指定文件中)。(知识点难度系数 ***) firstvt、lastvt 算符优先文法,总控程序,GUI图形交互界面,优秀课设
资源详情
资源评论
资源推荐
#include "mainwindow.h"
#include <bits/stdc++.h>
using namespace std;
// 关键字表置初始值
vector <string> Cppkeyword = {"#", "+", "-", "*", "/", "<","<=", "==",
"!=", ">=", ">", "&", "&&", "||", "=", "(",
")", "[", "]", "{", "}", ":", ";", ",", "@",
"?"};
vector <string> grammar; //文法
map <string,int> vn; //非终结符
map <string,int> vt; //终结符
// 终结符与非终结符的第二维 int 作为对于符号 firstvt lastvt 集下标索引
int ind = 1; //作用于非终结符与终结符的第二元 指示下标
const int MAXN = 200;
//若 ind 从 0 开始,由于当 string 在 vt 中找不到时,vt["string"]会返回 0,
则 first[vt["string"]]为非空
set <string> firstvt[50];
set <string> lastvt[50]; //不会重复
int table[MAXN][MAXN]; //算符优先关系表
bool if_table[MAXN][MAXN]; //判定算符优先关系表某空是否已经填写
bool minus_num = false; //当前输入数为负数
vector<string> in_before; //输入表达式分割后情况
vector<string> in_after; //输入表达式分割前情况
vector <string> sm; //与字符栈同步变化的带原本语义的字符栈
vector <string> s; //字符栈
bool illegal = true;
void initgrammar()
{
grammar.push_back("E'->E");
grammar.push_back("E->E+T");
grammar.push_back("E->E-T");
grammar.push_back("E->T");
grammar.push_back("T->T*F");
grammar.push_back("T->T/F");
grammar.push_back("T->F");
grammar.push_back("F->i");
grammar.push_back("F->(E)");
if((grammar[0].length() - (grammar[0].find("->")+2)) > 1)
{
string q = grammar[0].substr(0,1);
grammar.insert(grammar.begin(),q+"'->"+q);
}
}
void getVnset(vector <string> &grammar)
{ //获取文法中的非终结符
for(int s = 0; s < grammar.size(); s++)
{
// cout << " " << grammar[s] << endl;
string grammar_this = grammar[s]; //当前输入产生式
if (grammar_this[1] == '\'')
{ //带'的非终结符,如 E',T'
if(vn.find(grammar_this.substr(0,2)) == vn.end())
vn[grammar_this.substr(0, 2)] = ind++;
}
else
{ //不带'的正常非终结符,如 E,T
if(vn.find(grammar_this.substr(0, 1)) == vn.end()) //即 vn
集合里没有当前非终结符
vn[grammar_this.substr(0, 1)] = ind++;
}
}
}
void getVtset(vector <string> &grammar)
{ //获取文法中的终结符
for(int s = 0; s < grammar.size(); s++)
{
string grammar_this = grammar[s]; //当前输入产生式
int t = grammar_this.find("->");
t+=2; //右串开始部分
grammar_this = grammar_this.substr(t);
// cout << "----" << grammar_this << endl;
for(int i = 0; i < grammar_this.length()-1; i++) //搜索长度为
2 的终结符
{
for(int j = 0; j < 26; j++)
{
if(grammar_this.substr(i,2)==Cppkeyword[j].substr()
&& vt.find(grammar_this.substr(i,2)) == vt.end())
vt[grammar_this.substr(i,2)] = ind++;
}
}
for(int i = 0; i < grammar_this.length(); i++) //搜索长度为 1 的
终结符
{
for(int j = 0; j < 26; j++)
{
if(grammar_this.substr(i,1) == Cppkeyword[j].substr()
&& vt.find(grammar_this.substr(i,1)) == vt.end())
vt[grammar_this.substr(i,1)+""] = ind++;
}
if(grammar_this.at(i) >= 'a' && grammar_this.at(i) <= 'z' &&
vt.find(grammar_this.substr(i,1)) == vt.end())
vt[grammar_this.substr(i,1)] = ind++;
}
}
}
string getVn(string grammar)
{ //获取文法中的非终结符
if (grammar[1] == '\'')
{ //带'的非终结符,如 E',T'
return grammar.substr(0, 2);
}
else
{ //不带'的正常非终结符,如 E,T
return grammar.substr(0, 1);
}
}
string getVt(string grammar)
{ //获取表达式中的终结符
string s;
bool flag_float = false; //用来防止出现两个小数点的错误情况 无小
数点为 false 有小数点为 true
if(!minus_num) //不为负数
{
// cout << "ss" << grammar << endl;
for (int k = 0; k < 26; k++)
{ //这里应该注意:使用最长匹配。举例:遇到>=会优先匹配>,这并
非所要的
if (grammar.substr(0, 2) == Cppkeyword[k])
return grammar.substr(0, 2);
}
for (int k = 0; k < 26; k++)
{ //使用最短匹配
if (grammar.substr(0, 1) == Cppkeyword[k])
return grammar.substr(0, 1);
}
//如果运行到这里,说明这个终结符不是关键词表里的,认为小写
字母也属于终结符
if (grammar[0] >= 'a' && grammar[0] <= 'z')
{
return grammar.substr(0, 1);
}
else if(grammar[0] >= '0' && grammar[0] <= '9')
{
s.push_back(grammar[0]);
for(int i = 1; i < grammar.length(); i++)
{
if(grammar[i] >= '0' && grammar[i] <= '9')
s.push_back(grammar[i]);
else if(grammar[i] == '.' && flag_float == false)
{
s.push_back(grammar[i]);
flag_float = true;
}
else if(grammar[i] == '.' && flag_float == true)
{
cout << "Input error!\n";
illegal = false;
exit(1);
}
else
break;
}
// cout << s << endl;
return s;
}
else
{
cout << "Invalid\n";
illegal = false;
exit(1);
}
}
else //可能为负
{
grammar = grammar.substr(1);
剩余22页未读,继续阅读
@NK
- 粉丝: 5
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0