资源简介

详细内容:https://blog.csdn.net/weixin_39644536/article/details/101054795 简单计算器的编译器的设计与实现,利用 LR 分析法编制、调试其语法分析程序,生成的中间代码为后缀表达式, 通过语法制导定义和后缀表达式进行计算。编制好分析程序后计若干用例,上机 测试并通过所设计的分析程序。 算术表达式的 LR 分析分为扩展文法,构造识别活动前缀的 DFA 图,判断 是否有冲突,若有冲突,则消除冲突和构造 LR 分析表等步骤。

资源截图

代码片段和文件信息

#include
#include
#include
#include 
#include 
#include 
using namespace std;

//*********************词法分析器******************************//
char SEPARATER[2] = { ‘(‘ ‘)‘ };    //分隔符
char OPERATOR[5] = { ‘+‘ ‘-‘ ‘*‘ ‘/‘ ‘=‘ };     //运算符
char FILTER[4] = { ‘ ‘ ‘\t‘ ‘\r‘ ‘\n‘ };                    //过滤符

/**判断是否为分隔符**/
bool IsSeparater(char ch){
for (int i = 0; i<2; i++){
if (SEPARATER[i] == ch){
return true;
}
}
return false;
}

/**判断是否为运算符**/
bool IsOperator(char ch){
for (int i = 0; i<5; i++){
if (OPERATOR[i] == ch){
return true;
}
}
return false;
}
/**判断是否为过滤符**/
bool IsFilter(char ch){
for (int i = 0; i<4; i++){
if (FILTER[i] == ch){
return true;
}
}
return false;
}
/**判断是否为数字**/
bool IsDigit(char ch){
if (ch >= ‘0‘ && ch <= ‘9‘) return true;
return false;
}

/**词法分析**/
vector analyse(string expression){
vector vec;
char ch = ‘ ‘;
for (int i = 0; i < expression.length(); i++)
{
string arr = ““;
ch = expression[i];
if (IsFilter(ch)){}              //判断是否为过滤符
else if (IsDigit(ch)){           //判断是否为数字
while (IsDigit(ch) || IsFilter(ch)){
if (IsDigit(ch))
arr += ch;
i++;
ch = expression[i];
}
i--;
//printf(“%3d    “ CONSTANT);
cout << “\t\t\t< 整形数  “ << arr <<“>“<< endl;
vec.push_back(arr);
}
else if (IsOperator(ch))
{
arr += ch;
//printf(“%3d    “ value(OPERATOR 8 *arr.data()));
cout << “\t\t\t< 运算符  “ <<  arr << “>“ << endl;
vec.push_back(arr);
}
else if (IsSeparater(ch))
{
arr += ch;
//printf(“%3d    “ value(SEPARATER 8 *arr.data()));
cout << “\t\t\t< 分隔符  “ << arr << “>“ << endl;
vec.push_back(arr);
}
else
{
cout << “\t\t\t\““ << ch << “\“:无法识别的字符!“ << endl;
vec.clear();
return vec;
}
}
return vec;
}
//*********************中间代码生成器******************************//
string InversePolish(string s_mid)
{
string s_beh = ““;
stack stk;

map op;//利用map来实现运算符对应其优先级
op[‘(‘] = 0;
op[‘)‘] = 0;
op[‘+‘] = 1;
op[‘-‘] = 1;
op[‘*‘] = 2;
op[‘/‘] = 2;
string::iterator it = s_mid.begin();;
while (it != s_mid.end())
{
if (op.count(*it))//判断该元素是否为运算符
{
if (*it == ‘)‘)//若为’)‘,把栈中的运算符依次加入后缀表达式,直到出现‘(‘,’(‘出栈,退出该次循环
{
while (stk.top() != ‘(‘)
{
s_beh += stk.top();
s_beh += “ “;
stk.pop();
}
stk.pop();
}
else if (stk.empty() || *it == ‘(‘ || op[*it]>op[stk.top()])//若为‘(’,入栈 ; 要入栈的运算符优先级大于等于栈顶的运算符的优先级,直接入栈
{
stk.push(*it);
}
else if (op[*it] <= op[stk.top()])// 入栈的运算符优先级小于等于栈顶的运算符的优先级,栈顶运算符出栈,再次比较,直到出现优先级低的运算符,或者栈为空,退出
{
while (op[*it] <= op[stk.top()] && (!stk.empty()))
{
s_beh += stk.top();
s_beh += “ “;
stk.pop();
if (stk.empty()) break;
}
stk.push(*it);
}
}
else
{
s_beh += *it;
it+

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4086  2019-06-17 19:08  Calculator(终)\Calculator\Calculator\Calculator.vcxproj

     文件        944  2019-06-17 19:08  Calculator(终)\Calculator\Calculator\Calculator.vcxproj.filters

     文件       1834  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\Calculator.log

     文件        199  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\Calculator.tlog\Calculator.lastbuildstate

     文件       2774  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\Calculator.tlog\cl.command.1.tlog

     文件      24380  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\Calculator.tlog\CL.read.1.tlog

     文件       1078  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\Calculator.tlog\CL.write.1.tlog

     文件       5018  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\Calculator.tlog\link.command.1.tlog

     文件       4674  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\Calculator.tlog\link.read.1.tlog

     文件       1046  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\Calculator.tlog\link.write.1.tlog

     文件     429056  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\vc120.idb

     文件     561152  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\vc120.pdb

     文件     966314  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\源.obj

     文件      15266  2019-06-20 09:50  Calculator(终)\Calculator\Calculator\源.cpp

     文件    8323072  2019-06-20 09:50  Calculator(终)\Calculator\Calculator.sdf

     文件        976  2019-06-17 18:45  Calculator(终)\Calculator\Calculator.sln

    ..A..H.     28160  2019-06-20 09:50  Calculator(终)\Calculator\Calculator.v12.suo

     文件     218624  2019-06-20 09:49  Calculator(终)\Calculator\Debug\Calculator.exe

     文件    1910424  2019-06-20 09:49  Calculator(终)\Calculator\Debug\Calculator.ilk

     文件    3174400  2019-06-20 09:49  Calculator(终)\Calculator\Debug\Calculator.pdb

     目录          0  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug\Calculator.tlog

     目录          0  2019-06-20 09:49  Calculator(终)\Calculator\Calculator\Debug

     目录          0  2019-06-20 09:50  Calculator(终)\Calculator\Calculator

     目录          0  2019-06-19 17:38  Calculator(终)\Calculator\Debug

     目录          0  2019-06-20 09:50  Calculator(终)\Calculator

     目录          0  2019-06-18 20:47  Calculator(终)

----------- ---------  ---------- -----  ----

             15673477                    26


评论

共有 条评论