C/C++ 编程代写
当前位置:以往案例 > >案例C++/JAVA数据结构算法:语法分析实验 +词法分析器+有限自动机的确定化和最小化
2018-12-27

实验四 LL(1) 语法分析实验



一、实验目的

1. 了解 LL(1)语法分析是如何根据语法规则逐一分析词法分析所得到的单词,检查语法错误,即掌握语法分析过程。

2. 掌握LL(1)文法判别调剂和 LL(1)语法分析器的设计与调试。

二、实验内容

针对任意的文法,编写相应的左递归消除、左公共因子提取程序,求解相应的FIRSTFOLLOW集,构造预测分析表,并编写LL(1)语法分析程序,并给出测试句子的分析过程。(注:左递归消除和左公共因子如果在实验三里做了,可以直接拿过来用)

判断LL(1)文法部分:

1. 输入:文法

2. 处理:左递归消除、左公共因子提取,FIRSTFOLLOW等集合构造,判断LL(1)

3. 输出:是LL(1)的情况输出预测分析表,否则判断不是LL(1)

LL(1)分析程序部分:

1. 输入:诸如对应文法符号串,以$结束。

2. 处理:基于分析表进行 LL(1)语法分析,判断其是否符合文法。

3. 输出:串是否合法。

三、实验要求

1. 构建合适的数据结构来表示文法符号和文法规则

2. 设计恰当的数据结构存储预测分析表。ε可用#代替)

3. 任选 C/C++/Java 或其他高级语言中的一种作为编程语言,要求所编程序结构清晰。

实验一、一个简单的C–词法分析器


一、 实验目的

设计、编制并调试一个自定义语言C–的词法分析程序,加深对词法分析原理的理解。

二、 实验内容

2.1 自定义语言C–的词法系统

1)类型系统:支持int、char、void基本类型,分别用词法记号表示为关键字int、char和void。

2)常量:字符常量(用单引号括起来)、字符串常量(用双引号括起来)、八/十/六进制整数常量(0开头表示八进制,0x开头表示十六进制)。分别用词法记号表示为ch、str和num。

3)变量:与常量对应,使用标识符表示,词法记号表示为id。

4)表达式运算符:支持加减乘除、求余、取负、自增、自减算术运算,大于、大于等于、小于、小于等于、等于、不等于关系运算,与、或、非逻辑运算,表示为词法记号:‘+’,‘-’,‘*’,‘/’‘%’‘-’,‘++’,‘–’‘>‘>=’,‘<’,‘<=’,‘==’,‘!=’,‘&&’, ‘||’,‘!’。注意:取负运算和减法运算在词法分析器里是被看做是同一个词法记号。

5)语句:支持赋值语句、do-while、while、for循环语句,if-else、switch-case条件分之语句、函数调用、函数返回、跳转等语句。涉及的词法记号表示为赋值号‘=’关键字do, while, for, if, else, switch, case, default, return ,break, continue。语句和函数体要求用大括号括起来,case和default后面需要跟冒号,因此需要包括各种分界符作为词法记号:‘{’,‘}’,‘;’,‘:’‘(,‘)’,‘,

所有的词法单元总结如下表所示:

1 C语言的词法构成

类别

记号

含义定义

类别

记号

含义定义

标识符

id

同C语言标识符

运算符

div

/

常量

num

数字

mod

%

ch

字符

inc

++

str

字符串

dec

关键字

kw_int

int

not

!

kw_char

char

and

&&

kw_void

void

or

||

kw_if

if

assign

=

kw_else

else

gt

>

kw_switch

switch

ge

>=

kw_case

case

lt

<

kw_default

default

le

<=

kw_while

while

equ

==

kw_do

do

nequ

!=

kw_for

for

分界符

comma

,

kw_break

break

colon

:

kw_continue

continue

simcon

;

kw_return

return

lparen

(

运算符

add

+

rparen

)

sub

lbrac

{

mul

*

rbrac

}

2.2 单词符号编码

1只是给出了建议分类,你可以根据自己程序的需要来给各种类别单词编码(可以给每个词法记号一个编码,也可以给一个类别里所有符号都编同一个编码)

2.3 词法分析程序的功能:

输入:所给文法的源程序字符串。

输出:二元组(编码,值)构成的序列。(能清楚表示识别出来的单词和它的类别)

三、实验要求

1. 写出程序框图、自动机。

2.写出程序源代码,并调试通过,输出实验结果。

3.完成实验报告及总结。

所有程序需要在上机时间验收过后才有效,实验报告中必须写清楚至少3个以上的测试数据结果

实验二 有限自动机的确定和最小化



一、实验内容

利用状态表和有限自动机的运行原理编写和设计程序,判断输入的自动机是DFA还是NFA,如果是NFA,利用子集法将其确定化,然后利用求同法或求异法将所得的DFA最小化。

二、实验目的

1. 理解有限自动机的作用,进一步理解有限自动机理论

2. 设计有限自动机的表示方式,采用合理的数据结构表示自动机的五个组成部分

3.掌握ε闭包的求法和子集构造算法,以程序实现NFADFA的转换,并且DFA,提高算法的理解和实现能力

三、实验步骤

1.可以采用任何语言来完成,如:CC++JAVA

2.建议以文本文件形式来描述自动机,例如:

第一行:表示状态个数

第二行开始表示为状态转换表

最后一行给出接受状态列表

3.根据读进去的自动机内容,判断其类别(NFA还是DFA?)

4.若是NFA,利用子集法将其确定化

5.DFA最小化

6.输入测试符号串,输出测试结果。

四、实验要求

1. 写出程序框图,具体算法流程

2.写出程序源代码,并调试通过,输出实验结果。

3.完成实验报告及总结。



在线提交订单