语法分析实验报告
ExprNode *Child;
FuncPtr MathFuncPtr;
} CaseFunc;
double CaseConst;
double *CaseParmPtr;
} Content;
};
③关键思想与算法
·改写二义文法为非二义文法的方法:通过引入新的非终结符,使原来分辨不清的结构受到约束,从而使得对任何一个句子,仅能构造一棵分析树。
·消除左递归算法
输入:无回路文法G
输出:无左递归的等价文法G’
方法:将非终结符合理排序:A1,A2,…,An,然后运用下述过程:
for i in 2..n
loop for j in 1..i-1
loop用AjQ1|Q2|…|Qk的右部替换每个形如AiAj产生式中的Aj,得到新产生式:
AiQ1r|Q2r|…|Qkr;
初使化词法分析器
识别出具有独立意义的最小语法单位
辅助性模块
②重要数据结构ຫໍສະໝຸດ ·语法树节点类型struct ExprNode { //语法树节点类型
enum Token_Type OpCode;
union {
struct {
ExprNode *Left, *Right;
} CaseOperator;
struct {
测试过程:(实验中出现的问题、错误、解决方法)
6.八、程序调试与测试结果
运行后结果如下
实验总结:
语法分析是编译器的重要阶段之一,可以认为是语法制导翻译模式编译器的核心。语法分析也有双重含义:根据一定的规则构成语言的各种结构,即语法规则;根据语法规则识别输入序列(记号流)中的语言结构,即语法法分析。同词法分析比较,语法分析的不是记号,而是组成语言的句子,从结构上讲不是线性的而是层次的,表征这种结构的最好方法是树,从而使得语法的分析就有了从根到叶子和从叶子到根两种分析方法。由于语言结构的复杂性,语法规则的描述也相应困难。
验证型
实验时间
实验环境
Windows Xp,vc++
实验目的与要求:1.了解语法分析是如何根据语法规则逐一分析词法分析时得到的属性字,检查语法错误。
2.掌握语法分析过程,加深对语法分析的理解。
实验内容:
语法分析程序一般具有如下功能:对单词符号串进行语法分析(根据语义规则进行推导和规约),识别出程序中的各类语法单位,最终判断输入串是否构成语法上正确的“程序”。
4、构造文法的状态转换图并且简化;
5、将转换图转化为EBNF表示;
6、从EBNF构造递归下降子程序;
实验步骤:(算法描述、源程序、操作步骤和方法)
①总体结构与模块划分
语法分析器模块(parser.h & parser.cpp)
绘图语言解释器入口
递归子程序集
先序遍历并打印表达式的语法树
出错处理模块
词法分析器模块(scanner.h & scanner.cpp)
这里我们采用递归下降分析方法:直接以程序的方式模拟产生式产生语言的过程。它的基本设计思想是:为每一个非终结符构造一个子程序,每一个子程序的过程体中按该产生式的候选项分情况展开,遇到终结符直接匹配,而遇到非终结符就调用相应非终结符的子程序。该分析从调用文法开始符号的子程序开始,直到所有非终结符都展开为终结符并得到匹配为止。若分析过程中达到这一步则表明分析成功,否则表明输入中有语法错误。递归下降分析对文法的限制是不能有公共左因子和左递归。由于文法是递归定义的,因此子程序也是递归的。
对于规模比较小的语言,递归下降子程序方法是很有效的方法,它简单灵活,容易构造,其缺点是程序与文法直接相关,对文法的任何改变均需对程序进行相应的修改。
这里给出词法分析程序大概的设计方法:
1、根据要求写出语法分析的上下文无关文法G;
2、消除上下文无关文法G的二义性;
3、消除上下文无关文法G的(直接)左递归,并提取左因子;
对于规模比较小的语言,递归下降子程序方法是很有效的方法,它简单灵活,容易构造,其缺点是程序与文法直接相关,对文法的任何改变均需对程序进行相应的修改。
签名:
年月日
评语与成绩:
教师签名:
年月日
洛阳师范学院信息技术学院
软件实验报告
专业:软件工程课程:操作系统课程设计
学号:姓名:班级:
实验名称
语法分析实验
实验类型
extern void Parser(char *SrcFilePtr);
int main(){
Parser("test.txt");
return 0;
}
实验步骤:(算法描述、源程序、操作步骤和方法)
·消除直接左递归算法
输入:文法G中所有的A产生成
输出:等价的不含直接左递归的文法G’
方法:首先,整理A产生式为如下形式:
AAa1|Aa2|…|Aam|p1|p2|…|pn
其中,ai非空,pj均不以A开始,然后用下述产生式代替A产生式:
Ap1A’| p2A’|…|pnA’
A’a1A’| a2A’|…|amA’|
重复此过程,直到所有A产生式的候选项中均不再有公共前缀。
·构造递归下降子程序的方法:
①构造文法的状态转换图并且简化;
②将转换图转化为EBNF表示;
③从EBNF构造递归下降子程序;
三、测试例程设计
·测试程序(parsermain.cpp)
#include <stdio.h>
#include "parser.h"
消除Ai产生式中的直接左递归;
end loop;
end loop;
·提取文法左因子算法:
输入:文法G
输出:等价的无左因子文法G’
方法:为每个产生式A,找出其候选项中最长公共前缀a,重排A产生式如下,其中r是不以a为前缀的其他候选项。
Aap1|ap2|…|apn|r
并用下述产生式替代之。
AaA’|r A’p1|p2|…|pn