由于本人比较懒还没咋学编译原理,并不知道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;
}