编译原理语法分析器实验报告

  • 格式:doc
  • 大小:205.00 KB
  • 文档页数:6

西安邮电大学

编译原理实验报告

学院名称 : 计算机学院

学生姓名 : 高宏伟

实验名称 : 语法分析器的设计与实现

班 级 : 计科1405班

学号 :

时间 : 2017年5月12日

一. 实验目的

1. 熟悉语法分析的过程

2. 理解相关文法分析的步骤

3. 熟悉First集和Follow集的生成

二. 实验要求

对于给定的文法,试编写调试一个语法分析程序:要求和提示:

1) 可选择一种你感兴趣的语法分析方法(LL(1)、算符优先、递归下降、 SLR(1)等)作为编制语法分析程序的依据。

2) 对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造 所给文法的机内表示。

3) 能进行分析过程模拟。如输入一个句子,能输出与句子对应的语法树,能 对语法树生成过程进行模拟;能够输出分析过程每一步符号栈的变化情况。

设计一个由给定文法生成First集和Follow集并进行简化的算法动态模拟

三. 实验内容

1. 文法: E->TE’

E’->+TE’|ε

T->FT’

T’->*FT’|ε

F->(E)|i:

2. 程序描述(LL(1)文法)

本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。

基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。

3. 判断是否LL(1)文法

要判断是否为LL(1)文法,需要输入的文法G有如下要求: 具有相同左部的规则的SELECT集两两不相交,即: SELECT(A→?)∩ SELECT(A→?)= ?

如果输入的文法都符合以上的要求,则该文法可以用LL(1)方法分析。 算法描述如下:

把第一条产生式的SELECT(0)集放到一个临时数组temp[]中

for(i=1;i<=产生式总数-1;i++)

求temp的长度length

if i指向的当前产生式的左部等于上一条产生式的左部 then

把SELECT(i)并入到temp数组中

If temp的长度小于length加上SELECT (i)的长度

返回0

else

把temp清空

把SELECT (i)存放到temp中

结果返回1;