语法分析器(含完整源码)教学文稿
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语法分析器(含完整源
码)
语法分析实验报告
一、实验目的:
1. 了解单词(内部编码)符号串中的短语句型结构形成规律。
2. 理解和掌握语法分析过程中语法分析思想(LL,LR)的智能算法化方法。
二、实验内容:
构造自己设计的小语言的语法分析器:
1. 小语言的语法描述(语法规则)的设计即文法的设计;
2. 把文法形式符号中所隐含的信息内容挖掘出来并用LL或LR 的资料形式(分析表)表示出来;
3. 语法分析的数据输入形式和输出形式的确定;
4. 语法分析程序各个模块的设计与调试。
主要设备和材料:电脑、winxp操作系统、VC语言系统
三、实验分工:
081
四、实验步骤:
1、语法规则
①<程序>::= {<变量定义语句>|<赋值语句>|<条件语句> |<循环语句> }
②<变量定义语句>::=var 变量{,变量};
③<赋值语句>::=变量:= <表达式>;
④<表达式>::=标识符{运算符标识符};
⑤<标识符>::=变量|常量
⑥<运算符>::=+ | - | * | / | >= | <=
⑦<条件语句>::=
⑧
⑨
⑩<循环语句>::=while(表达式) [begin] {赋值语句| 条件语句| 循环语句} [end]
<输出语句>::=prn 表达式
--注1:若if语句、else语句、循环语句中出现begin,后面的end必须出现,即begin与end同对出现
--注2:if、while后的"(",")"表示终结符,而不是定义成分优先的说明符号
2、分析表:
( ) : = 变量常量,;运算
符
变量
定义->②->②->②->②
赋值
语句->③->③->③->③ ->③
条件
语句->⑦->⑦->⑦->⑦->⑦->⑦->⑦循环
语句->⑩->⑩->⑩->⑩->⑩->⑩->⑩输出
语句->->->
分析表(续):
while var begin end if then prn 变量定义->②
赋值语句
条件语句->⑦->⑦->⑦->⑦
循环语句->⑩->⑩->⑩
输出语句-> 3、调试和测试
五、源代码(见附录):
六、实验总结:
本实验在词法分析的基础上,对提取出的标识符进行语法判断。对已有的语法规则运用LL(1)文法判别并进行构造分析表时,遇到的最大困难是:当发生规约冲突时,该如何处理。如对于产生式s-->aAb,当对a进行规约时,满足语法规则的β(用户输入串中当前要进行规约的标识符)只有有限种,而不满足的却有无限种情况。当发生规约冲突时,如何在这无限种情况中,确定冲突的具体信息,以便用户查找。在反复的尝试和验证中,我们发现发生冲突的用户输入串满足一定的规律,且按这种规律可以把这无限种情况化归为有限类,于是我们找出其中规律并进行划分,然后再对这些有限类冲突进行处理。
七、实验心得:
通过这次实验有以下几点收获:
1. LR(1)的构造使得对理论的知识理解的更加透彻。其中LR(1)分析表构造了很多遍,一直无法得到正确结果,这是恒心的考验。2.在写程序中用类数组来存放单词属性使得对单词各项值的调用更加方便,特别是对出错信息的检测有很大的作用。
3.本实验是在词法基础上的更进一步,在词法程序上添加语法程序,更加理解二者之间的关系。词法分析为语法分析提供了词法单元,方便分析,使程序模块化,易于读懂。
附录:
#include
#include
#include
#include
#include
#include
using namespace std;
#define Max 655 //最大代码长度
#define WordMaxNum 256 //变量最大个数
#define DigitNum 256 //常量最大个数
#define MaxKeyWord 32 //关键字数量
#define MaxOptANum 8 //运算符最大个数
#define MaxOptBNum 4 //运算符最大个数
#define MaxEndNum 11 //界符最大个数
typedef struct DisplayTable
{
int Index; //标识符所在表的下标
int type; //标识符的类型
int line; //标识符所在表的行数
char symbol[20]; //标识符所在表的名称
}Table;
int TableNum = 0; //display表的表项总数
char Word[WordMaxNum][20]; //标识符表
char Digit[WordMaxNum][20]; //数字表
int WordNum = 0; //变量表的下标
int DigNum = 0; //常量表的下标
bool errorFlag = 0; //错误标志
int TableIndex = -1; //display 表的下标索引
int beginCount = 0;//遇到begin加1,遇到end减1
int ifCount = 0; //遇到if加1
Table *table = new Table[Max];
//关键字
const char* const KeyWord[MaxKeyWord] = {"and","array", "begin","case","char","constant","do","else","end","false", "for","if","input","integer","not","of","or","output", "packed","procedure","program","read","real","repeat","set", "then", "to", "type", "until", "var","while", "with","prn"};