#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
char L[20] = "i+-*/()#ETF";//判断依据
int search(char c)//对应列寻找
{
int i = 0;
while (L[i] != '\0')
{
if (c == L[i])
return i;
i++;
}
if (c >= 'a' && c <= 'z' || c >= '0' && c <= '9')
{
return 0;
}
return -1;
}
int toTen(string s)
{
int num = 0;
int i = 1;
while (s[i] != '\0')
{
num = num * 10 + s[i] - '0';
i++;
}
return num;
}
int main()
{
//分析表
string LR[16][12] = {
//i + - * / ( ) # E T F
{"s1","null","null","null","null","s5","null","null","s2","s3","s4"},
{"null","r8","r8","r8","r8","null","r8","r8","null","null","null"},
{"null","s6","s7","null","null","null","null","acc","null","null","null"},
{"null","r3","r3","s8","s9","null","r3","r3","null","null","null"},
{"null","r6","r6","r6","r6","null","r6","r6","null","null","null"},
{"s1","null","null","null","null","s5","null","null","s15","s3","s4"},
{"s1","null","null","null","null","s5","null","null","null","s13","s4"},
{"s1","null","null","null","null","s5","null","null","null","s14","s4"},
{"s1","null","null","null","null","s5","null","null","null","null","s11"},
{"s1","null","null","null","null","s5","null","null","null","null","s10"},
{"null","r5","r5","r5","r5","null","r5","r5","null","null","null"},
{"null","r4","r4","r4","r4","null","r4","r4","null","null","null"},
{"null","r7","r7","r7","r7","null","r7","r7","null","null","null"},
{"null","r1","r1","s8","s9","null","r1","r1","null","null","null"},
{"null","r2","r2","s8","s9","null","r2","r2","null","null","null"},
{"null","s6","s7","null","null","null","s12","null","null","null","null"}
};
stack<int>status;//状态栈
stack<char>letter;//符号栈
status.push(0);
letter.push('#');
int len[10] = { 0,3,3,1,3,3,1,3,1 };//1-8号文法每个文法长度
char head[20] = { 'S','E','E','E','T','T','T','F','F' };
string str;
cin >> str;//读入一段算术表达式
str += '#';//在末尾加上结束标识符
int index = 0;
while (index < str.length())
{
int column = search(str[index]);
if (LR[status.top()][column][0] == 's')//移进
{
int st1 = toTen(LR[status.top()][column]);
status.push(st1);//状态入栈
letter.push(str[index]);//符号入栈
}
else if (LR[status.top()][column][0] == 'r')//规约
{
while (LR[status.top()][column][0] == 'r')//若继续规约
{
int st1 = toTen(LR[status.top()][column]);//规约表达式序号
char ch = head[st1];//规约所得符号
int st2 = len[st1];//规约表达式长度
for (int i = 0; i < st2; i++)//状态和符号出栈
{
status.pop();
letter.pop();
}
letter.push(ch);//将规约符号入栈
int col = search(ch);//找到规约符号对应列
status.push(toTen(LR[status.top()][col]));//将规约符号对应的状态入栈
}
if (LR[status.top()][column] == "acc")//结束标志
{
cout << endl << "true";
break;
}
else if(LR[status.top()][column][0] == 's')//移进标志
{
letter.push(str[index]);//符号入栈
status.push(toTen(LR[status.top()][column]));//对应状态入栈
}
else//错误
{
cout << endl << "false" << endl;
break;
}
}
else if ((LR[status.top()][column] == "acc"))
{
cout <<endl<< "true" ;
break;
}
else
{
cout <<endl<< "false";
break;
}
index++;
}
return 0;
}
04-11