编译原理-预测分析法(附源码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档