由于本人比较懒还没咋学编译原理,并不知道LR,算符优先是啥方法,就按照自己想法写了个非常丧心病狂的代码
非常SB的是一个代码过五个题,我知道肯定漏洞百出,但是懒惰如我已经懒得改了,能过就好
下边放下原题水一下字数
题目一 ~ 题目四
1.设计简单算数表达式语法分析器算法;(LR来实现)
2.编写代码并上机调试运行通过。
样例输入
x+y*(3*a+7)-b/5
x+y*(3*a+7-b/5
样例输出
true
false
扩展题
1.设计一个表达式语法分析器,要求表达式支持任意标识符和常数;
2.编写代码并上机调试运行通过。
样例输入
xx+y10*(33*a+0.7)-b/523e-2
xx+y10*(33*a+0.7)-b*/523e-2
样例输出
True
False
非常SB的代码
#include<iostream>
using namespace std;
int main()
{
string s;
while (getline(cin, s))
{
int op = 0;
int l = 0, r = 0, pos = 0;
bool flag = false;
bool flag1 = false, flag2 = false;
while (s[pos] == ' ') pos++;
while (s[pos] == '(') {
pos++;
l++;
}
while (s[pos] >= '0' && s[pos] <= '9' || s[pos] == 'e' || s[pos] == '.' || s[pos] >= 'a' && s[pos] <= 'z' || s[pos] >= 'A' && s[pos] <= 'Z') {
if (s[pos] == 'e') {
if (flag1) flag = true;
flag1 = true;
}
if (s[pos] == '.') {
if (flag2) flag = true;
flag2 = true;
}
pos++;
}
for (int i = pos; i < s.size(); i++)
{
flag1 = false, flag2 = false;
if (s[i] == ' ');
else if (!op) {
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '=');
else if (s[i] == ')') {
r++;
continue;
}
else {
flag = true;
break;
}
op = 1;
}
else {
if (s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z' || s[i] >= '0' && s[i] <= '9' || s[i] == 'e' || s[i] == '.') {
while (s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z' || s[i] >= '0' && s[i] <= '9' || s[i] == 'e' || s[i] == '.') {
if (s[i] == 'e') {
if (flag1) flag = true;
flag1 = true;
}
if (s[i] == '.') {
if (flag2) flag = true;
flag2 = true;
}
i++;
}
i--;
}
else if (s[i] == '(') {
l++;
continue;
}
else {
flag = true;
break;
}
op = 0;
}
}
if (flag || l != r) cout << "false\n";
else cout << "true\n";
}
return 0;
}