编译原理-预测分析法(附源码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
预测分析法实验报告
一、实验项目名称
预测分析法
二、实验目的
根据某一LL(1)文法编制调试预测分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析法的理解。
三、实验环境
Windows 10
Microsoft Visual Studio 2015
四、实验内容
本次实验的LL(1)文法为表达式文法:
E→E+T | T
T→T*F | F
F→i | (E)
编写识别表达式文法的合法句子的预测分析程序,对输入的任意符号串,给出分析过程及分析结果。分析过程要求输出步骤、分析栈、剩余输入串和所用产生式。如果该符号串不是表达式文法的合法句子,要给出尽量详细的错误提示
五、源程序清单、测试数据、结果
#include
#include
using namespace std;
const int NUM = 20;//初始化的栈的大小
//非终结符数组集
char Var[5] = { 'E','R','T','M','F' };
//终结符数组集
char Ter[6] = { 'i','+','*','(',')','#' };
string pred[5][6] =
{ { "TR","","","TR","","" },{ "","+TR","","","@","@" },{ "FM","","","FM","","" },{ ""," @","*FM","","@","@" },{ "i","","","(E)","","" } };
typedef struct {
char *top;
char *base;
int stacksize;
int num;
}Stack;// 栈结构体
void init(Stack *ss) {//初始化栈
ss->base = (char *)malloc(NUM * sizeof(char));
if (!ss->base)
exit(1);
ss->top = ss->base;
ss->stacksize = NUM;
ss->num = 0;
}
void push(Stack *ss, char c) {//入栈操作
if (ss->top - ss->base >= ss->stacksize)
exit(1);
*(ss->top) = c;
ss->top++;
ss->num++;
}
void pop(Stack *ss) {//出栈操作
if (ss->top == ss->base)
exit(1);
ss->top--;
ss->num--;
}
char getTop(Stack *ss) {//取得栈顶元素
if (ss->top == ss->base)
exit(1);
return *(ss->top - 1);
}
int isT(char c) {//判断是否为终结符
int i = 0;
int ret = 0;
for (i = 0; i<6; i++) {
if (Ter[i] == c)
{
ret = 1; break;
}
}
return ret;
}
string isInPred(char v, char t) {//查找预测分析表,并返回产生式右部int i, j;
for (i = 0; i<5; i++)
{
if (Var[i] == v)
break;
}
for (j = 0; j<6; j++)
{
if (Ter[j] == t)
break;
}
if (pred[i][j] !="")
{
return pred[i][j];
}
else
return"";
}
void displayStack(Stack *stack) { //输出分析站的内容
string str;
int i = 0;
Stack ss = *stack;
while (ss.num != 0)
{
str += getTop(&ss);
pop(&ss);
}
for (i = str.length() - 1; i >= 0; i--)
{
cout << str.at(i);
}
}
void predict(Stack stack, string input)//预测分析总函数
{
int a = 1;
char b;
char ctop;//当前栈顶符号
char cinput;//当前输入符号
int i = 0, j = 0, count = 0;
int error = 0;
cout <<"步骤"<<'\t'<<"栈"<<'\t'<<"输入缓冲区"<<'\t'<<"所用的产生式"< cout << count++ <<'\t'; displayStack(&stack); cout <<'\t'< while (getTop(&stack) != '#') { string produce = ""; ctop = getTop(&stack);