识别无符号数的词法分析器设计实现

识别无符号数的词法分析器设计实现,第1张

人不能太懒了,我就不帮你改代码了,>

词法分析的本质是让计算机程序理解词法规则。例如,在我们平时用的语言里,“你”是指一个人,当“你们”出现的时候就是一个词是指多个人,这就是一种规则,但是是人能理解的规则,词法分析要用数学的表达方式让计算机理解,计算机的做法是对每个遇到的字先判断是不是“你”,如果不是,那么不符合这条规则;如果是,就要记下现在这个状态---即已经看到一个“你”字,然后判断下一个字是不是“们”,是则这条规则成立,也就是让计算机理解了这一个词,而不是单个的两个字。词法分析不是编译原理才有的,在搜索、数据挖掘等领域都用到。编译原理中的词法分析就是把源程序中的字符按顺序一个一个输入给计算机,计算机对每个字符按照所有规则进行判断,例如输入了一个“a”,要判断它是不是“and“的开头,是不是一个变量名,函数名,还是字符串等等,每个可能性都是一条规则决定的。根据规则的复杂性,可以用多种数学方法描述,比如基本的方法是状态机、正则表达式。

实验

1

词法分析程序的设计

姓名:

学号:

专业班级:

一、实验目的

掌握计算机语言的词法分析程序的开发方法。

二、实验内容

编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。

三、实验要求

1

根据以下的正规式,编制正规文法,画出状态图;

标识符

<

字母

>(<

字母

>|<

数字字符

>)

十进制整数

0 |

1|2|3|4|5|6|7|8|9

0|1|2|3|4|5|6|7|8|9

如有余力,则进一步分析八进制和十六进制整数,其正规式如下:

八进制整数

0

1|2|3|4|5|6|7

0|1|2|3|4|5|6|7

十六进制整数

0x

0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f

0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f

运算符和界符

+

-

/

>

<

=

<=

>=

(

)

{

}

关键字

main

if

then

else

while

do

int

(

可根据需要添加

)

2

、根据状态图,设计词法分析函数

int scan( )

,完成以下功能:

1

从文本文件中读入测试源代码,根据状态转换图,分析出一个单词

2

以二元式形式输出单词

<

单词种类,单词属性

>

其中单词种类用整数表示:

0

:标识符

1

:十进制整数

2

:八进制整数

3

:十六进制整数

运算符和界符,关键字采用一字一符,不编码

其中单词属性表示如下:

标识符,整数由于采用一类一符,属性用单词表示

运算符和界符,关键字采用一字一符,属性为空

3

、编写测试程序,反复调用函数

scan( )

,输出单词种别和属性。

四、实验环境

PC

微机

DOS

*** 作系统或

Windows

*** 作系统

Turbo C

程序集成环境或

Visual C++

程序集成环境

五、实验步骤

1

根据正规式,画出状态转换图;

2

根据状态图,设计词法分析算法;

3

采用

C

C++

语言,设计函数

scan( )

,实现该算法;

4

编制测试程序(主函数

main

5

调试程序:

读入文本文件

programtxt

运行程序得到输出结果

resulttxt

并检查输出

结果是否正确

选我为最佳答案吧!

南华大学

计算机科学与技术学院

实 验 报 告

( 2011~2012 学年度 第 二 学期 )

课程名称

程序设计语言与编译

姓名 学号

专业 电气信息类 班级

地点 8—209 教师

题目: 用直接分析方法编制C++语言子集的词法分析程序.

一、分析

对于单词符号我们将其分成四类:保留字K、标识符I、常数C和界符P,每类单词符号均可使用一张表格表示.在词法分析过程中,保留字K和界符P这两个表格的内容是固定不变的(由语言确定),源程序字符串只能从其中选取,而标识符I、常数C这两表是在分析过程中不断形成的.

对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是K、I、C或P中之一,那么就以单词的二元式形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串.

各类单词的二元式表述均具有相同的结构与长度,形式如下:

(单词种别t,单词自身的值i)

t是单词种别,而单词种别共分为K、I、C、P四类且每类对应一张表格.因此,t实际上就是一个指向这四类中某一类对应表格的指针.i则为指向该类表格中一个特定项目的指针.

所以整个的词法分析过程就是从源程序中获得一个个的单词符号,将这些符号分别填入四张类表中,并且有一个二元式序列构成一个索引,这个索引为以后的语法分析提供处理上的方便.

为了减少实习量,可以适量地选取K,P中的一个子集来进行.如下表:

表1 保留字K表

内部地址 1 2 3 4 5 6 7 8 9 10

保 留 字 BEGIN CONST DO ELSE  END IF PROCEDURE THEN VAR WHILE

表2 界符P表

内部地址 1 2 3 4 5 6 7 8 9 10

界 符 ; + : : ( , ) < < <

组合界符 = = >

保留字表包括10个有代表性的保留字,界符表包括关系运算符三种(8,9,10),算术运算符(2),分隔符三种(1,4,6),一对圆括号,加上赋值号共10种.这两表的内容表明PASCAL语言的条件语句,赋值语句,WHILE型循环语句,复合语句,过程及变量说明均可作为源程序例子输入给词法分析程序,标识符表I中的每一项包含一个标识符,常数表C中的每一项包含一个整常数,后两表的内容都是在词法分析过程中产生的.

如何从源程序中识别出一个个的单词符号呢?图1中的流图清晰地反映出这一过程.

图1中,双圆圈的状态表示终态,即能到达终态就代表识别出一个单词符号,而带有*号的终态是指处理时应回退一字符.

二、算法

词法分析器在扫描过程中,依次从源程序中取出源字符,根据图1的扫描过程状态转换图,当碰到终态时,即双圆圈的状态时就得到一个单词符号,此时可以根据第一个字符判断单词属于K,I,C,P中哪一类,从而确定单词的"单词种别"和"单词自身的值".整个词法分析的算法流程如图2.

三、实现

选择实习环境为TURBO C20语言 实现程序见附录

四、总结

上机前应做好准备.即根据实习目的、要求和分析,选择相应的数据结构,使用C语言参照算法中的流程编写词法分析的程序.将编好的程序上机进行调试.注意调试的例子应有词法正确的,也应有词法错误的或是超出所选数据结构范围的.

实验完成达到实习目的之后,若尚有余力者,可以对所选子集适当扩大或是增加相应功能如:扩充界符和保留字数目;允许实型常数;进行词法错误检查;最大范围扩充以至PASCAL语言所有字符的集合.

实验完成以后编写出完整的实验报告,反映出最后的实验学习结果.

附录

/ 实验代码:/

实验结果:

五、结果感想

实验中需要识别的词有:

关键字:DIM、IF、DO、STOP、END单词种别码为12345。

标识符;单词种别码为6。

常数为无符号整形数;单词种别码为7。

运算符包括:=、-、、单词种别码为891011。

分隔符包括:,、(、); 单词种别码为121314。

通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。

以上就是关于识别无符号数的词法分析器设计实现全部的内容,包括:识别无符号数的词法分析器设计实现、求高手解答。 编写TEST语言的词法分析程序,并完成词法分析程序的编程与调试。、怎样较容易理解编译原理中词法分析的原理即实现过程,最好配上图文解说等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9449623.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存