编译原理 实验二 LL(1)分析法程序

源代码仓库:CompilePrincipleLearning/experiment_2 · yusixian/CompilePrincipleLearning (github.com)

一. 实验目的

  1. 掌握LL(1)分析法的基本原理

  2. 掌握LL(1)分析表的构造方法

  3. 掌握LL(1)驱动程序的构造方法

二. 实验内容及要求

编写识别单词的词法分析程序。

根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL(1)分析法的理解。

例:对下列文法,用LL(1)分析法对任意输入的符号串进行分析:

(1)E->TG

(2)G->+TG|—TG

(3)G->ε

(4)T->FS

(5)S->*FS|/FS

(6)S->ε

(7)F->(E)

(8)F->i

输出的格式如下:

(1) LL(1)分析程序,编制人:姓名,学号,班级

(2) 输入一以#结束的符号串(包括 +*()i#):i*(i+i)+(i*i)#

(3) 输出过程步骤如下:

步骤

分析栈

剩余输入串

所用产生式

1

E

i+i*i#

E->TG

(4)输入符号串为非法符号串(或者为合法符号串)

备注:

(1) 在“ 所用产生式 ”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错”;若成功结束则写为“分析成功”。

(2)在此位置输入符号串为用户自行输入的符号串。

(3)上述描述的输出过程只是其中一部分的。

注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#;

2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);

3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照;

4.可采用的其它的文法

三. 实验过程

1、采用的数据结构

产生式类型定义为type,左侧为origin,大写字符,右侧产生的字符

初始化数据结构如下:

2、头文件声明和全局变量定义

如下

4、函数汇总

(1)函数汇总表

函数名称
功能简述

readFile

读取文件函数,返回一个string动态数组,以行数分割

init

初始化函数,在该函数中进行分析栈、剩余栈的初始化

print

输出当前分析栈和剩余栈

isTerminator

判断当前字符c是否是终结符

analyze

分析字符串s,输出其分析步骤

main

主程序入口,从此进入,填充初始分析表及产生式初始化,调用读取文件函数开始分析

(2)函数的调用关系

function

5、实验结果

输入

文件exp.txt

输出

实验结果
在这里插入图片描述

完整代码

最后更新于

这有帮助吗?