“编译原理”课程设计报告 CPR-1206010231
错误分析:“32769”超出了int类型,“?”不在分析符号中
程序错误导致的出错:
出错原因以及解决:最开始编写程序时,在扫描数字部分没有进行sum置0的操作,导致后面的整数包含了前面扫描过的整数,在我的思考和同学的帮助下解决了这个 Page 9 of 24
“编译原理”课程设计报告 CPR-1206010231
BUG。另外我在编程中还出现了很多的错误,就不再一一列举,后来均在书籍和同学指导下解决了错误。
以下为正确执行情况下的界面: 开始界面:
输入界面:
输出界面:
Page 10 of 24
“编译原理”课程设计报告 CPR-1206010231
开放实验部分(可选)
单元2:基于预测分析方法的表达式语法分析器 【实验4.1】实验目的
了解预测分析器的基本构成及用自顶向下的预测法对表达式进行语法分析的方法,掌握预测语法分析程序的手工构造方法。 【实验4.2】设计思想
已知文法G[S]: S→AT A→BU T→+AT|$ U→*BU|$ B→(S)|m
根据LL(1)文法的判定条件:对每个非终结符A的两个不同的产生式,A→α,A→β,满足SELECT(A→α)∩SELECT(A→β)=?,其中α、β不同时能?*ε,那么这个文法就是LL(1)文法。由此我们可以通过计算SELECT集来判断,其步骤为:
1、计算FIRST集; 2、计算FOLLOW集; 3、计算SELECT集;
4、判断文法G[S]是否为LL(1)文法。 非终结符 FIRST集 FOLLOW集 S {(,m} {),#} A {(,m} {+,),#} B {(,m} {+,*,),#} U {*,$} {+,),#} Page 11 of 24
“编译原理”课程设计报告 CPR-1206010231 T {+,$} {),#} 表1 FIRST集和FOLLOW集
根据FIRST集和FOLLOW集,可求出相同左部的SELECT交集:
SELECT(T→+AT)∩SELECT(T→$)={+}∩{),#}=? SELECT(U→*BT)∩SELECT(U→$)={*}∩{+,),#}=? SELECT(B→(S))∩SELECT(B→m)={(}∩{m}=? 所以该文法是LL(1)文法
预测分析方法是自顶向下分析的一种方法,而预测分析表是预测分析程序的重要组成部分。对每个终结符或#用a表示,若a∈SELECT(A→α),则把A→α放入M[A,a]中。把所有无定义的M[A,a]标上出错标记(可用空白表示),由此得到的G[S]的预测分析表为:
S A B U T + →$ →+AT * →*BU ( →AT →BU →(S) 表1 预测分析表
语法分析在程序中的实现主要包括8个部分:
1、当栈顶元素为非#的终结符+、*、(、)或m时,若输入串和栈顶元素相同,输入串推进一位且栈顶元素出栈,为其他终结符时显示“ERROR”;
2、当栈顶元素为S时,若输入串为m,栈顶元素出栈且TA进栈,若输入串为(,栈顶元素出栈且TA进栈,若为其他输入串,显示“ERROR”;
3、当栈顶元素为A时,若输入串为m,栈顶元素出栈且UB进栈,若输入串为(,栈顶元素出栈且UB进栈,若为其他输入串,显示“ERROR”;
4、当栈顶元素为B时,若输入串为m,栈顶元素出栈且m进栈,若输入串为(,栈顶元素出栈且)B(进栈,若为其他输入串,显示“ERROR”;
5、当栈顶元素为U时,若输入串为+、)或#,栈顶元素出栈,若输入串为*,栈顶元素出栈且UB*进栈,若为其他输入串,显示“ERROR”;
6、当栈顶元素为T时,若输入串为+,栈顶元素出栈且TA+进栈,若输入串为)或#,栈顶元素出栈,若为其他输入串,显示“ERROR”;
7、当栈顶元素为#时,显示接受;
8、若栈顶元素不满足以上条件时,显示“ERROR”。 全局变量: char css[50];
char s[80]; int l;
//推导所用产生式或匹配 //输入的字符串
) →$ →$ m →AT →BU →m # →$ →$ //输入字符串的长度
Page 12 of 24
相关推荐: