由于本人比較懶還沒咋學編譯原理,并不知道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;
}