编译原理课程设计说明书--词法分析,语法分析,语义分析 联系客服

发布时间 : 星期四 文章编译原理课程设计说明书--词法分析,语法分析,语义分析更新完毕开始阅读

桂林电子科技大学编译原理课程设计说明书 第11页

}

}

}

{ }

selection[get_index(lefts)][get_index(follows[j])]= '@';

2.2.5

LL(1)手工编码

设计思路:

1. 确定的selection表用二维String数组存储,其中 %表示错误标志,@表示空,R表示E’,L表示T’。

string selection[5][7]={

{\ {\ {\ {\ {\};

2. 将当前测试的表达式存入Get_ch数组中,并记下数组的长度,用于依次遍历匹配。

3. 如果[1]当前表达式没有遍历完,[2]当前出栈的文法不是%,@,非终止符,则将当前读入的表达式的字符转换成selection的y下标,当前出栈的文法转换成x下标,并查询selsection[x][y]。如果当前出栈元素是%,则报错退出。如果当前出栈元素是@,则继续出栈下一个元素。如果当前出栈元素是非终止符,则与当前表达式读取的字符匹配,如匹配,则表示继续遍历下一个,继续出栈,如果不匹配,则报错退出。

4. 用栈来存储查selection表所得的文法,并反序入栈,如查得+TR,则反序入栈,从栈底到栈顶元素为RT+。

5. 如果表达式遍历完并且当前栈为空,则说明表示表达式匹配成功。

2.3 语义分析

2.3.1 表达式求值LR(1)

LR分析法:

桂林电子科技大学编译原理课程设计说明书 第12页

是给出一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的k个(k≥0)符号就可唯一地确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能唯一地确定句柄LR分析过程是一种规范归约过程。

设计思路:

一个LR分析器由3个部分组成:

(1)、总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。

(2)、分析表或分析函数。不同的文法分析表将不同,同一个文法采用的LR分析器不同,分析表也不同,分析表又可以分为动作(ACTION)表和状态转换(GOTO)表两个部分,它们都可以用二维数组表示。

(3)分析栈,包括文法符号栈和相应的状态栈。

分析表的生成比较复杂,此处只简述总控程序:

ACTION[Si,a]规定了栈顶状态为Si时遇到输入符号a应执行的动作,动作有4种可能:

(1)移进:

当Sj =GOTO[Si,a]成立,则把Sj移入到状态栈,把a移入到文法符号栈。其中i,j表示状态号

(2)归约:

当在栈顶形成句柄为β时,则用β归约为相应的非终结符A,即当文法中有A—>Β产生式,而β的长度为r(即| β|=r),则从状态栈和文法符号栈中自栈顶向下去掉r个符号,即栈指针SP减去r。并把A移入文法符号栈内,再把满足Sj=GOTO[Si,A]的状态移进状态栈,其中Si为修改指针后的栈顶状态

(3)接受acc:

当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是#,则为分析成功

桂林电子科技大学编译原理课程设计说明书 第13页

(4)报错:

当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入串不是该文法能接受的句子。

本模块功能主要对表达式进行LR(1)分析后,并对表达式进行求值。 产生式存储结构定义为: struct define //产生式 {

char left; string right; };

其他定义:

stacks_sign; //符号栈 stacks_state; //状态栈

char Get_ch[100]; //用于存储测试字符串 define *p = new define[10]; int count=0; //用于记录测试字符串的长度 int counts ; //产生式个数 int tCount ; //终止符个数 int ntCount ; //非终止符个数 string s_NT=\int get_index(char b); void get_gene(); void get_ch(); void init(); //初始化

int parseInt(string); //将字符串转换为int

2.3.2 四元式

本模块基于LR手工编码,主要是将表达式表示成四元式,如运算符,运算对象1,运算对象2,结果)。

四元式存储结构定义为:

struct four_element //四元式结构体 { char op; //操作符 string x1,x2; //两个操作数 string re; //结果 };

主要函数为:string test(string Action[12][6],int Goto[12][3],string input);

桂林电子科技大学编译原理课程设计说明书 第14页

3 测试过程

消除白空格以及注释运行结果截图: 原文件:

输出文件:

词法分析运行结果截图: