编译原理 预测分析程序 表达式
横/纵 | i | + | * | ( | ) | # |
---|---|---|---|---|---|---|
E | E→TE’ | E→TE’ | ||||
E’ | E’→+TE’ | E’→ε | E’→ε | |||
T | T→FT’ | T→FT’ | ||||
T’ | T’→ε | T’→*FT’ | T’→ε | T’→ε | ||
F | F→i | F→(E) |
为了方便记录,分别用数字记录相应产生式
1 E→TE’
2 E’→+TE’
3 E’→ε
4 T→FT’
5 T’→*FT’
6 T’→ε
7 F→i
8 F→(E)
表格可以改写为
横/纵 | i | + | * | ( | ) | # |
---|---|---|---|---|---|---|
E | 1 | 1 | ||||
E’ | 2 | 3 | 3 | |||
T | 4 | 4 | ||||
T’ | 6 | 5 | 6 | 6 | ||
F | 7 | 8 |
E’用Q替代,T’用W替代
推导:产生式左部出栈,右部倒序入栈
#include<stdio.h>
#include<iostream>
#include<string>
#include<stack>
using namespace std;
string expression;
stack<char> A;
stack<char> B;
void Error()
{
printf("错误\n");
exit(0);
}
int main()
{
int a[200][200] = {0};
a['E']['i'] = 1;
a['E']['('] = 1;
a['Q']['+'] = 2;
a['Q'][')'] = 3;
a['Q']['#'] = 3;
a['T']['i'] = 4;
a['T']['('] = 4;
a['W']['+'] = 6;
a['W']['*'] = 5;
a['W'][')'] = 6;
a['W']['#'] = 6;
a['F']['i'] = 7;
a['F']['('] = 8;
//printf("%d\n",a['E']['i']);
A.push('#');
A.push('E');
cin >> expression;
int len =expression.length();
//B是表达式栈
for(int i=len -1;i>=0;i--)
{
B.push(expression[i]);
}
//next是表达式的下一位字符,x是下推栈顶元素
char next, x;
next = B.top();
int flag = true;
while(flag)
{
x = A.top();
if(x=='i'||x=='+'||x=='*'||x=='('||x==')'||x=='#')
{
if(x==B.top())
{
if(A.top()=='#' && B.top()=='#')
{
printf("正确\n");
flag = false;
return 0;
}
else
{
printf("匹配\n");
A.pop();
B.pop();
}
}
else
Error();
}
//(x=='E'||x=='Q'||x=='T'||x=='W'||x=='F')
else
{
printf("推导 ");
switch(a[A.top()][B.top()])
{
case 1:
printf("%d E->TE'\n",a[A.top()][B.top()]);
A.pop();
A.push('Q');
A.push('T');
break;
case 2:
printf("%d E'->+TE'\n",a[A.top()][B.top()]);
A.pop();
A.push('Q');
A.push('T');
A.push('+');
break;
case 3:
printf("%d E'->空串\n",a[A.top()][B.top()]);
A.pop();
break;
case 4:
printf("%d T->FT'\n",a[A.top()][B.top()]);
A.pop();
A.push('W');
A.push('F');
break;
case 5:
printf("%d T'->*FT'\n",a[A.top()][B.top()]);
A.pop();
A.push('W');
A.push('F');
A.push('*');
break;
case 6:
printf("%d T'->空串\n",a[A.top()][B.top()]);
A.pop();
break;
case 7:
printf("%d F->i\n",a[A.top()][B.top()]);
A.pop();
A.push('i');
break;
case 8:
printf("%d F->(E)\n",a[A.top()][B.top()]);
A.pop();
A.push(')');
A.push('E');
A.push('(');
break;
default:
Error();
}
}
}
return 0;
}
运行截图: