@TOC
一、语法分析简介
语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC等工具自动生成。
完成语法分析任务的程序称为语法分析器,或语法分析程序。按照源语言的语法规则,从词法分析的结果中识别出相应的语法范畴,同时进行语法检查。
目前,已存在许多语法分析的方法。但就产生语法树的方向而言,可大致把他们分为自底向上和自顶向下两大类。目前比较流行LL分析法和LR分析法。
二、设计要求
创建一个语法分析程序,它采用LL(1)方法或LR(1)方法。该程序的输入是一个文本文档,包括一组2型文法(上下文无关文法)的产生式和任务1程序输出的符号表。任务2的输出是一个YES或NO,即源代码字符串是否符合本2型文法。
三、开发环境
硬件环境:PC机 windows10 64 位
编程语言:C++
运行环境:codeblocks或vs
四、实现过程
从预先写好的文本文件中读入2型文法,保存在一个char类型的二维数组中,每个文法的长度由length数组记录。
计算first集,具体实现过程为:不停的扫描每个文法,其首个字符是终结符,则加入到对应的非终结符的first集中,如果首个字符是非终结符,则扫描该非终结符的first集,把他们全部加入到当前非终结符的first集中,为空,则扫描下一个字符。直到某一次没有发生任何改动,说明first集计算完成。
然后求LR(1)项目集族,构造LR(1)分析表。
分析过程与书上类似,用一个状态栈,一个符号栈。
五、分析过程框架图
在这里插入图片描述
六、运行结果
语法分析对应的文法,包含了头文件、while语句、定义函数语句,赋值语句,定义变量语句等,可以嵌套配合使用
在这里插入图片描述
求得
在这里插入图片描述
项目集输出(部分):
在这里插入图片描述
分析表(部分):
在这里插入图片描述
分析过程(部分)
在这里插入图片描述