编译原理DFA化简实验报告C语言,编译原理词法分析程序实验报告解析.doc

该实验报告详细介绍了如何设计并实现一个词法分析程序,针对名为TEST的语言,利用正则表达式构建有限状态自动机(NFA/DFA),识别标识符、保留字、无符号整数、分界符、运算符和注释等词法规则。报告中包含了实验目的、设计原理、步骤以及实验结果,并提供了具体的正则表达式和NFA/DFA转换过程。通过实验,加深了对编译原理中词法分析部分的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译原理词法分析程序实验报告解析

编译原理实验报告

实验名称:编写词法分析程序

实验类型:设计性实验

指导教师:*****

专业班级:软件工程1401

姓 名:****

学 号:**********

实验地点:东六E座301

实验成绩:_________________

日期: 2016 年 5 月 8 日

实验一

编写词法分析程序

一、实验目的

通过设计、调试词法分析程序,掌握词法分析程序的设计工具(有穷自动机),进一步理解自动机理论

掌握正则文法和正则表达式转换成有穷自动机的方法及有穷自动机实现的方法

确定词法分析程序的输出形式及标识符与关键字的区分方法

加深对理论知识的理解

二、实验设计

设计原理:

对源程序代码从头到尾扫描,将符合词法语言规则的单词输出,包括:标识符、保留字、无符号整数、分界符、运算符、注释分离;判断程序的词法是否正确

TEST语言的词法规则如下:

1)、标识符:字母打头,后接任意字母或数字。

2)、保留字:标识符的子集,包括:if,else,for,while,do, int,write,read。

3)、无符号整数:由数字组成,但最高位不能为0,允许一位的0。

4)、分界符:(、)、;、{、}

5)、运算符:+、-、*、/、=、、>=、<=、!=、==

6)、注释符:/* */

设计方法:

用正则表达式或正则文法描述程序设计语言的词法规则,通常采用正则表达式;一个正则表达式对应一条词法规则

为每个正则表达式构造一个NFA,用来识别正则表达式描述的单词将每一个NFA合并、化简得到最简的DFA

将多个NFA合并为一个NFA

将NFA转换成等价的DFA。

最小化DFA

确定单词的输出形式。

化简后的DFA+单词输出形式?构造词法分析程序

设计过程:

将TEST语言的六个语法规则分别转换成正则表达式

为每个正则表达式构造一个NFA,用来识别正则表达式描述的单词

将5个NFA转换成一个NFA,再将NFA化简确定化。

设计结果:

每一条TEST语言对应的正则表达式如下:

标识符:( a|b|……|z|A|B……|Z )( 0|1|……|9| a|b|……|z|A|B……|Z )*

保留字:标识符的子集

无符号整数: ( (1……|9 )( 0|1|……|9)* )|0

分界符:( | ) | ; | { | }

运算符:+ | - | * | / | = | < | > | >= | <= | != | ==

注释符:/*(其他)*/

NFA如图

化简、确定化的DFA

三、实验过程

将TEST语言的六个语法规则转换成正则表达式

将每个正则表达式装换成NFA,再将NFA合并化简

最终得到设计结果如上所示:

根据确定化的DFA编写代码

测试实验数据

三、实验结果

测试数据:

{

/*This a test program.*/

int abc;

int 123;

int A$@;

int i;

int n;

int b,c;

int 2a;

int a2;

read n;

n = 012345;

for (i=1;i<=n; i= i+1)

{

abc=abc+i;

}

if(i!=n) n = n+i;

if (!n) b = b+c;

/*The loop ended

write abc;

}

实验现象:

控制台显示的数据:

输出文本的数据:

{{

intint

IDabc

;;

intint

NUM123

;;

intint

IDA

Error$

Error@

;;

intint

IDi

;;

intint

IDn

;;

intint

IDb

Error,

IDc

;;

intint

NUM2

IDa

;;

intint

IDa2

;;

readread

IDn

;;

IDn

==

NUM0

NUM12345

;;

forfor

((

IDi

==

NUM1

;;

IDi

<=<=

IDn

;;

IDi

==

IDi

++

NUM1

))

{{

IDabc

==

IDabc

++

IDi

;;

}}

ifif

((

IDi

!=!=

IDn

))

IDn

==

IDn

++

IDi

;;

ifif

((

Error!

IDn

))

IDb

==

IDb

++

IDc

;;

数据分析:

根据TEST语法规则,我们可以知道

int A$@;这一句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值