编译原理 预测分析法表达式语法分析

编译原理 预测分析程序 表达式

横/纵i+*()#
EE→TE’E→TE’
E’E’→+TE’E’→εE’→ε
TT→FT’T→FT’
T’T’→εT’→*FT’T’→εT’→ε
FF→iF→(E)

为了方便记录,分别用数字记录相应产生式
1 E→TE’
2 E’→+TE’
3 E’→ε
4 T→FT’
5 T’→*FT’
6 T’→ε
7 F→i
8 F→(E)
表格可以改写为

横/纵i+*()#
E11
E’233
T44
T’6566
F78

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;
}

运行截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值