下载后可任意编辑西安邮电大学编译原理实验报告学 院 名 称 :计算机学院学 生 姓 名 :高雄伟实 验 名 称 :语法分析器的设计与实现班 级 :计科 1405 班学号 :04141152时间 :2024 年 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 中 结...