当前位置:文档之家› 词法分析实验原理_编译原理实验报告范文分析

词法分析实验原理_编译原理实验报告范文分析

词法分析实验原理_编译原理实验报告范文分析

1.实验目的根据Sample语言或者自定义的某种语言,设计该语言的

编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。

2.实验内容及要求

(1)词法分析器

输入源程序,输出对应的token表,符号表和词法错误信息。按规则

拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用

的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表

打印源程序;发现并定位词法错误;

(2)语法分析器

输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算

术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、dowhile语句等。

(3)语义分析和中间代码生成

输入token串,进行语义分析,修改符号表,寻找其中的语义错误,

并生成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、dowhile语句等。

实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍

不足。

3.实验方案设计

3.1编译系统原理介绍

编译器逐行扫描高级语言程序源程序,编译的过程如下:

(1).词法分析

识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类

符号,分别归类等待处理。

(2).语法分析

一个语句看作一串记号(Token)流,由语法分析器进行处理。按照

语言的文法检查判定是否是合乎语法的句子。

如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。

(3).语义分析

语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该

做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不

该去的地方;是否有重名或者使语义含糊的记号,等等。如果有错误,则

转出错处理,否则可以生成执行代码。

.中间代码生成中间代码是向目标码过渡的一种编码,其形式尽可能

和机器的汇编语言相似,以便下一步的代码生成。

但中间码不涉及具体机器的操作码和地址码。

采用中间码的好处是可以在中间码上做优化。

.优化

对中间码程序做局部优化和全局(整个程序)优化,目的是使运行更快,占

用空间最小。局部优化是合并冗余操作,简化计算,例如某:=0可用

一条"清零"指令替换。全局优化包括改进循环、减少调用次数和快速地址

算法等。

.代码生成

由代码生成器生成目标机器的目标码(或汇编)程序,其中包括数据分段、

选定寄存器等工作,然后生成机器可执行的代码。

3.1.1编译程序介绍

编译程序是指把用高级程序设计语言书写的源程序,翻译成等价的机

器语言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现

的翻译程序。它以高级程序设计语言书写的源程序作为输入,而以汇编语

言或机器语言表示的目标程序作为输出。编译出的目标程序通常还要经历

运行阶段,以便在运行程序的支持下运行,加工初始数据,算出所需的计

算结果。

3.1.2对所写编译程序的源语言的描述

Sample语言是一种类PASCAL语言,他以赋值语句为基础,包括顺序、条

件和循环三种结构。有变量说明和常量说明,有多种数据类型、如整型、实型、字符型等。它包括如下一些语法成分:

.数据类型:整型、布尔型、实型和字符类型。

.表达式:可进行算术、布尔表达式的运算。

.说明语句:常量说明(用cont定义)、变量说明(用var定义)。

.赋值语句。

.控制语句:if语句、while语句,repeat语句和for循环语句。

⑹.Begin…end复合语句。

.程序(program)语句和结束(end.)语句。

3.2词法分析程序的设计

图1词法分析总流程

词法分析将源程序读入一个个的字符,根据一定的构词规则,识别出各类有用的单词。当输入字母时,开始识别标识符或关键宇,边拼写边从缓冲区读入下一符号,当读入一非字母数字符号时,标识符识别完成,但已多读入一个符号,所以列记数回退。然后查关键字表,判断拼出的符号串是否为关键字。

若是关键字,输出其种别码。否则识别的单词就是标识符,同时输出标识符及其种别码。

当输入数字时,开始识别整数或实数。边拼写边读入下一符号,当遇到“.”时,还要继续拼写该常数(实数情况)。如果遇到E,要识别带指数的常数,当遇到其它非数字符号时,数字常数拼写完毕,列计数也要退1。输出常数及其种别码。

当输入“/”时,开始识别注解或除号,若是注解时,最后两个连续

读出的符号是“某/”,不需再读下一符号,列计数不变。当判定是除号“/”时,已多读入一字符,列计数一1,输出“/”的种别码。

3.3语法分析程序设计

图2语法分析总流程

不断地读入token文件中的单词,根据不同的语句,使用不同的方法

进行分析,直到token文件的结束。程序头部以program开头,变量说明

以var开头,常量说明是以cont开头的,从begin开始就是可执行语句,可执行语句分为五种:for语句(以for语句开头),while语句(以

while开头),if语句(以if开头),repeat语句(以repeat开头),赋值语句(以标识符开头)。每当读到前导词,表明一个新的语法结构的

开始,以此识别该语法单位是否符合定义。

3.4语义分析和中间代码生成程序的设计

4.结果及测试分析

4.1软件运行环境及限制

程序是使用C#语言编写的,开发软件是VS2022。VS是一个基本完整

的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、

代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于

微软支持的所有平台。使用VS调试程序会很方便,可以实时观察程序的

运行状态。用VS制

作界面会显得非常地简单,但是也存在一定的缺点。VS的集成度比较高,所以

要修改封装好的一些函数不会太简单。

4.2测试数据说明

输入数据:

programe某amplel;

cont

a:=1;b:=3;c:='fadf;

var

a,b,c:integer;某:char;

begin

a:=3;

b:=12;

if(a+3某c>b)thenc:=3;

whilea>bdoc:=5;

repeata:=10;untila+3>b;for某:=1+2to3dob:=100;

end.

这是ample语言的一个比较简单的测试程序,它有着ample语言最基本的格式,如函数头部、常量说明、变量说明、执行语句、条件语句,循环语句等等。

用这个测试程序来观察程序的效果。

4.3运行结果及功能说明

3-彝译程序演示菜统

文件離词1蚣折爲查看语潼耸忻昌

pEOpnilC某KTipl某1;conta:=l;b:^3;c:

=faEdf;vtrhb<■integer::

pEOpnilC某KTipl某1;

cont

a:=l;b:^3;c:=faEdf;

vtr

hb<■integer

::ckur;

b科in

r-3.

b:-i2:

if(L+3某c>l>)than杖书;vkil心bJpe'"6:repeat且:1D;MJitilr 助b;fork:=!某£to3dob:=100:

':某某:土的某某某"某某■nb.r^|牛1应离如下”卄甘科打艸fi-progran1

:「e某anplel34

II-;4&

!2.co^it7

口a34

f3;'=33

nane:

lenth

tohn

e某wpleI

8

34

1

34

1

1

3S

t

1

34

u

1

35

e

1

34

£df

5

34

蓉9fr115U

j

円j.

Hn=TT--一rtnlm二rm二□.mtt03酉S3S3B口1变叢克又变变凭七1.3-.-mf-In-3-rt&ii-In-占H-in~nrr-nrr4ip-or-c

df

4555554634334134414623440344034

图3词法分析结果

图3是正常词法分析的结果,可以看出,程序会将每个单词显示到token文

件显示区,同时显示单词在源文件的位置。并且会将标识符和常量添加到符号表

并显示到符号表显示区。下面的图4是当测试程序有错误时的情况图4词法分析有错误的程序

可以看到当我在b:=12;后面加上一个后,会出现报错。并且if语

句位置上少了个“)”也会出现报错,实现了词法分析的相关功能。

图5语法分析结果

从图5看到,语法分析能够正确地处理token串,并分析出各类语句,直到程序的结束。输出结果的显示层次感不强,没有按照一级级地缩进,

这里是语法分析的一点问题。下面的图6是语法分析处理错误的功能演示。

图6语法分析错误处理

我修改了程序的部分地方,通过语法分析就能够检测到错误的地方,

并显示出错误可能的原因,并且能够在错误的前提下继续执行后面的程序,直到语法分析结束。

5.总结及心得体会

通过编译原理实验课,我掌握了什么是编译程序,编译程序工作的基

本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译

程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识

是机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机

上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深

的理解。

然而,我认为自己在实验课上做的并不够好。首先,在总体实验内容

来说,我没能够完成所有的内容,只完成了词法分析和语法分析的程序;

其次,就完成的两个实验来说,功能上还是不够完善,有一些bug。最后,运行界面上过于简陋,不够美观。由于时间的有限性,这些不足是无法继

续改善了。这也让我意识到对于做每一件事,你的付出时间和你的成果是成正比的。

所以,对于做一件事,要舍得花时间,肯花时间,这样最后的效果才会更好。对于编译原理,整体看下来自己做得不算好。意识到不足,我更加地明白自己能力不够强。

在今后的学习里,需要更加地努力才行,能力越强,自己的提升空间就会越大,完成一件事的效率也才会更高。争取在以后做一个高效率,强能力的人。

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

一、目的(本次实验所涉及并要求掌握的知识点) 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析等) 程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a = 10; b = a + 20; } 要求输出如右图。

要求: 识别保留字:if、int、for、while、do、return、break、continue; 单词种别码为1。 其他的都识别为标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括:+、-、*、/、=、、<、=、<=、!= ; 单词种别码为4。 分隔符包括:,、;、{、}、(、);单词种别码为5。 三、实验使用环境(本次实验所使用的平台和相关软件) 平台:WindowsXP SP3 软件:MyElicpse 四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)1)定义常量及变量:

private JTextArea ta1; private JTextArea ta2; private JButton jb=new JButton("词法分析"); private JButton jb1=new JButton("清空文本区"); private JLabel jl1=new JLabel("输入源代码:"); private JLabel jl2=new JLabel("分析结果:"); static int m=0; //标识字符位置标记 static String str1 = new String(); String blz[]={"int","return","break","while","for","do","continue","if","else"}; 2)主要实现的函数: public void actionPerformed(ActionEvent e) { if(e.getSource()==jb1) { int a=JOptionPane.showConfirmDialog(null, "确定清空吗?","提示! ",JOptionPane.YES_NO_OPTION); if( a==JOptionPane.YES_OPTION) { ta1.setText(""); ta2.setText(""); } } if(e.getSource()==jb) { String a=ta1.getText(); //把输入的软代码赋值给字符串变量a char[] b=new char[a.length()]; //把a中的字符一个一个放入字符数组b中 for(int i=0;i

编译原理实验报告(手打)

《编译原理》实验报告 班级:计C104 姓名:李云霄 学号:108490

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。 三、实现方法与环境 1、首先设计识别各类单词的状态转换图。 描述无符号常数的确定、最小化状态转换图如图1所示。其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 图1 文法G[<无符号数>]的状态转换图 其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。 四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢

词法分析实验原理_编译原理实验报告范文分析

词法分析实验原理_编译原理实验报告范文分析 1.实验目的根据Sample语言或者自定义的某种语言,设计该语言的 编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。 2.实验内容及要求 (1)词法分析器 输入源程序,输出对应的token表,符号表和词法错误信息。按规则 拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用 的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表 打印源程序;发现并定位词法错误; (2)语法分析器 输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算 术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、dowhile语句等。 (3)语义分析和中间代码生成 输入token串,进行语义分析,修改符号表,寻找其中的语义错误, 并生成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、dowhile语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍 不足。 3.实验方案设计

3.1编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1).词法分析 识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类 符号,分别归类等待处理。 (2).语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照 语言的文法检查判定是否是合乎语法的句子。 如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 (3).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该 做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不 该去的地方;是否有重名或者使语义含糊的记号,等等。如果有错误,则 转出错处理,否则可以生成执行代码。 .中间代码生成中间代码是向目标码过渡的一种编码,其形式尽可能 和机器的汇编语言相似,以便下一步的代码生成。 但中间码不涉及具体机器的操作码和地址码。 采用中间码的好处是可以在中间码上做优化。 .优化

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

编译技术实验报告 实验题目:词法分析 学院:信息学院 专业:计算机科学与技术学号: 姓名:

一、实验目的 (1)理解词法分析的功能; (2)理解词法分析的实现方法; 二、实验内容 PL0的文法如下 ‘< >’为非终结符。 ‘::=’ 该符号的左部由右部定义,可读作“定义为”。 ‘|’ 表示‘或’,为左部可由多个右部定义。 ‘{ }’ 表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次 数,有上下界时可重复次数的限制。 ‘[ ]’ 表示方括号内的成分为任选项。 ‘( )’ 表示圆括号内的成分优先。 上述符号为“元符号”,文法用上述符号作为文法符号时需要用引号‘’括起。 〈程序〉∷=〈分程序〉. 〈分程序〉∷= [〈变量说明部分〉][〈过程说明部分〉]〈语句〉 〈变量说明部分〉∷=V AR〈标识符〉{,〈标识符〉}:INTEGER; 〈无符号整数〉∷=〈数字〉{〈数字〉} 〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉} 〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉}; 〈过程首部〉∷=PROCEDURE〈标识符〉; 〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉 〈赋值语句〉∷=〈标识符〉∶=〈表达式〉 〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END 〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉 〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉} 〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')' 〈加法运算符〉∷=+|- 〈乘法运算符〉∷=* 〈关系运算符〉∷=<>|=|<|<=|>|>= 〈条件语句〉∷=IF〈条件〉THEN〈语句〉 〈字母〉∷=a|b|…|X|Y|Z 〈数字〉∷=0|1|2|…|8|9 实现PL0的词法分析

编译原理实验报告

编译原理实验报告 一、实验目的 编译原理是计算机科学中的重要课程,旨在让学生了解编译器 的基本工作原理以及相关技术。本次实验旨在通过设计和实现一 个简单的编译器,来进一步加深对编译原理的理解,并掌握实际 应用的能力。 二、实验环境 本次实验使用了Java编程语言及相关工具。在开始实验前,我 们需要安装Java JDK并配置好运行环境。 三、实验内容及步骤 1. 词法分析 词法分析是编译器的第一步,它将源代码分割成一系列词法单元。我们首先实现一个词法分析器,它能够将输入的源代码按照 语法规则进行切割,并识别出关键字、标识符、数字、运算符等。

2. 语法分析 语法分析是编译器的第二步,它将词法分析得到的词法单元序列转化为语法树。我们使用自顶向下的LL(1)语法分析算法,根据文法规则递归地构建语法树。 3. 语义分析 语义分析是编译器的第三步,它对语法树进行检查和转换。我们主要进行类型检查、语法错误检查等。如果源代码存在语义错误,编译器应该能够提供相应的错误提示。 4. 代码生成 代码生成是编译器的最后一步,它将经过词法分析、语法分析和语义分析的源代码翻译为目标代码。在本次实验中,我们将目标代码生成为Java字节码。 5. 测试与优化

完成以上步骤后,我们需要对编译器进行测试,并进行优化。 通过多个测试用例的执行,我们可以验证编译器的正确性和性能。 四、实验心得 通过完成这个编译器的实验,我收获了很多。首先,我对编译 原理的知识有了更深入的理解。在实验过程中,我深入学习了词 法分析、语法分析、语义分析和代码生成等关键技术,对编译器 的工作原理有了更系统的了解。 其次,我提高了编程能力。实现一个完整的编译器需要处理复 杂的数据结构和算法,这对我的编程能力是一个很好的挑战。通 过实验,我学会了合理地组织代码,优化算法,并注意到细节对 程序性能的影响。 最后,我锻炼了解决问题的能力。在实验过程中,我遇到了很 多困难和挑战,但我不断地调试和改进代码,最终成功地实现了 编译器。这次实验使我明白了解决问题的关键在于坚持和勇于尝试。

编译原理词法分析报告(C++)

词法分析实验报告 一、实验目的 1. 掌握词法分析的原理。 2. 熟悉保留字表等相关的数据结构与单词的分类方法。 3. 掌握词法分析器的设计与调试。 二、实验内容 根据编译中的分词原理,用C++语言编写一个C语言的词法分析程序:. 三、实验要求 1. 输入:任意一个C语言程序的源代码。 2. 处理:对输入进行分析,分离出保留字、标识符、常量、算符和界符。 3. 输出:对应的二元式 四、实验环境 Windows XP Professional SP3,Visual Studio 2010 五、关键代码 // Scanner.cpp #include "stdafx.h" #include "CuteC.h" #include "Scanner.h" #include "CuteCView.h" int CScanner::m_constListIndex=0; int CScanner::g_place=0; // CScanner IMPLEMENT_DYNAMIC(CScanner, CWnd) CScanner::CScanner() { } CScanner::CScanner(CString str) { //初始化保留字 reservedWords[0].str=L"void"; reservedWords[0].tok=tokentype::_VOID; reservedWords[1].str=L"char"; reservedWords[1].tok=tokentype::CHAR; reservedWords[2].str=L"const"; reservedWords[2].tok=tokentype::_CONST; reservedWords[3].str=L"double";

编译原理语法分析实验报告

编译原理语法分析实验报告 编译原理实验报告 二、语法分析 (一) 实验题目 编写程序,实现对词法分析程序所提供的单词序列进行语法检查和 结构分析。 (二) 实验内容和要求 1. 要求程序至少能分析的语言的内容有: 1) 变量说明语句 2) 赋值语句 3) 条件转移语句 4) 表达式(算术表达式和逻辑表达式) 5) 循环语句 6) 过程调用语句 2. 此外要处理:包括依据文法对句子进行分析;出错处理;输出结果的构造。 3. 输入输出的格式: 输入:单词文件(词法分析的结果) 输出:语法成分列表或语法树(都用文件表示),错误文件(对 于不合文法的句子)。 4. 实现方法:可以采用递归下降分析法,LL(1)分析法,算符优先法或LR分析法的任何一种,也可以针对不同的句子采用不同的分析方法。 (三) 实验分析与设计过程

1. 待分析的C语言子集的语法: 该语法为一个缩减了的C语言文法,估计是整个C语言所有文 法的60%(各种关键字的定义都和词法分析中的一样),具体的 文法如下: 语法: 100: program -> declaration_list 101: declaration_list -> declaration_list declaration | declaration 102: declaration -> var_declaration|fun_declaration 103: var_declaration -> type_specifier ID;|type_specifier ID[NUM]; 104: type_specifier -> int|void|float|char|long|double| 105: fun_declaration -> type_specifier ID (params)|compound_stmt 106: params -> params_list|void 107: param_list ->param_list,param|param 108: param -> type-spectifier ID|type_specifier ID[] 109: compound_stmt -> {local_declarations statement_list} 110: local_declarations -> local_declarations var_declaration|empty 111: statement_list -> statement_list statement|empty 11 编译原理实验报告 112: statement -> epresion_stmt|compound_stmt |selection_stmt|iteration_stmt|return_stmt 113: expression_stmt -> expression;|; 114: selection_stmt -> if{expression)statement |if(expression)statement else statement

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

编译原理实验一·词法分析

一、实验目的 通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。 二、实验内容及要求 对某特定语言A ,构造其词法规则。 该语言的单词符号包括: 保留字(见左下表)、标识符(字母大小写不敏感)、整型常数、界符及运算符(见右下表) 。 功能要求如下所示: ·按单词符号出现的顺序,返回二元组序列,并输出。 ·出现的标识符存放在标识符表,整型常数存放在常数表,并输出这两个表格。 ·如果出现词法错误,报出:错误类型,位置(行,列)。 ·处理段注释(/* */),行注释(//)。 ·有段注释时仍可以正确指出词法错误位置(行,列)。 三、实验过程 1、词法形式化描述 使用正则文法进行描述,则可以得到如下的正规式: 其中ID表示标识符,NUM表示整型常量,RES表示保留字,DEL表示界符,OPR表示运算符。 A→(ID | NUM | RES | DEL | OPR) * ID→letter(letter | didit)* NUM→digit digit* letter→a | …| z | A | …| Z digit→0 | …| 9 RES→program | begin | end | var | int | and | or | not | if | then | else | while | do DEL→( | ) | . | ; | , OPR→+ | * | := | > | < | = | >= | <= | <>

计算机编译原理---词法分析器实验报告

编译原理 实验报告书

词法分析器 目录 1、摘要: (2) 2、实验目的: (2) 3、任务概述 (3) 4、实验依据的原理 (3) 5、程序设计思想 (5) 6、实验结果分析 (7) 7、总结 (9)

1、摘要: 本实验用C/C++高级语言编写词法分析程序,通过课堂上对词法分析器相关的背景知识的足够了解,清晰词法分析的过程,在脑海中形成词法分析的一般方案,根据方案一步步所要实现的目的,形成对词法分析器程序的模块划分和整体规划,最终实现一个词法分析器。具体要求能够通过扫描源程序分析出单词符号,将相应字符流转换成内码。 2、实验目的: 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的时间能力。通过本实验,掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法以及掌握词法分析的实现方法,并可以成功的上机调试编出词法分析程序。 3、任务概述 用C/C++实现对Pascal的子集程序设计语言的词法识别程序。 词法分析程序的主要工作为: (1)从源程序文件中读入字符。 (2)统计行数和列数用于错误单词的定位。 (3)删除空格类字符,包括回车、制表符空格。 (4)按拼写单词,并用(内码,属性)二元式表示。 (5)根据需要是否填写标识符表供以后各阶段使用。 4、实验依据的原理 (1)词法分析器工作流程图

图1 词法分析器工作流程图 实现流程:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。词法分析的功能是输入源程序,输出单词符号。所依据的理论基础有有限自动机、正规式、正规文法。

编译原理词法分析器实验报告

一、实验目的 设计一个简单的词法分析器,从而进一步加深对词法分析器工作原理的理解。 二、实验要求 1、该个词法分析器要求至少能够识别以下几类单词: (1)关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写; (2)标识符:识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*; (3)常数:NUM = digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整数,如123等;小数,如123.45等;科学计数法表示的常数,如1.23e3,2.3e-9等; (4)专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */; 2、分析器的输入为由上述几类单词构成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符变为其对应的机内符,常数使用二进制形式,标识符使用相应的标识符表指针表示。 3、词法分析器应当能够指出源程序中的词法错误,如不可识别的符号、错误的词法等。 三、实验环境 实验环境为win7系统、vs2005。 四、实验内容 1、词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token)或(sum或fsum,对应二进制)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数; fsum为浮点型常数。 2、各种单词符号种别码如下表:

词法分析实验报告(实验一)

编译原理词法分析实验报告 软工082班 兰洁 200831104044 一、实验内容 二、实验目的 三、实验预期 四、程序规定 五、实验原理 ●程序流程图 ●判别浮点功能扩展流程图 ●状态转换图 六、程序代码与浮点判别功能扩展 七、测试用例 ●扩展功能测试用例; ●普通功能测试用例 八、输出结果 九、实验心得

一、实验内容: 词法分析: 1、识别简单语言的单词符号; 2、识别关键字、标识符、数字、运算符等。并扩展浮点识别功能。 二、实验目的 调试词法分析程序,加深对词法分析原理的理解,掌握编写简单词法分析程序的一般步骤。 三、实验预期结果: 经过调试源代码程序,程序能够成功运行编译,对输入的简单字符串,能够别关键字、标识符、数字、运算符等,并且给出单词符号的对应编码。 四、程序规定: 1、关键字:"function","if","then","while","do","endfunc"; 2、算术运算符:”+”,”-”,”*”,”/”,”=”; 3、关系运算符:"<" ">" "<=" ">=" "==" "!="; 4、界符:"(" ")" ";" "#"; 5、标识符规定以字母开头,字母均为小写; 6、空格和换行符跳过; 7、单词对应编码: 十、实验原理: 输入串--------------------〉词法分析程序————————〉单词符号串 输入:字符串以#结束。 输出:单词的二元组(syn,token/sum)

程序流程图 分析浮点数功能扩展部分流程图:

shuzi()函数

状态转换图 六、程序代码: 备注:红色字体部分为程序功能的功能扩展,使程序能够分析浮点数! 我把浮点数的syn设置为80!

编译原理实验报告++词法分析器实验报告

编译原理实验报告 词法分析器制作与应用 设计思想 (1)程序主体结构部分: 说明部分 %% 规则部分 %% 辅助程序部分 (2)主体结构的说明 在这里说明部分告诉我们使用的LETTER,DIGIT, IDENT(标识符,通常定义为字母开头的字母数字串)和STR(字符串常量,通常定义为双引号括起来的一串字符)是什么意思.这部分也可以包含一些初始化代码.例如用#include来使用标准的头文件和前向说明(forward ,references).这些代码应该再标记"%{"和"%}"之间;规则部分>可以包括任何你想用来分析的代码;我们这里包括了忽略所有注释中字符的功能,传送ID名称和字符串常量内容到主调函数和main函数的功能. (3)实现原理 程序中先判断这个句语句中每个单元为关键字、常数、运算符、界符,对与不同的单词符号给出不同编码形式的编码,用以区分之。 PL/0语言的EBNF表示 <常量定义>::=<标识符>=<无符号整数>; <标识符>::=<字母>={<字母>|<数字>}; <加法运算符>::=+|- <乘法运算符>::=*|/ <关系运算符>::==|#|<|<=|>|>= <字母>::=a|b|…|X|Y|Z <数字>::=0|1|2|…|8|9 三:设计过程 1.关键字:void,main,if,then,break,int,Char,float,include,for,while,printfscanf 并为小写。 2."+”;”-”;”*”;”/”;”:=“;”:”;”<“;”<=“;”>“;”>=“;”<>“;”=“;”(“;”)”;”;”;”#”为运算符。 3.其他标记如字符串,表示以字母开头的标识符。 4.空格符跳过。 5.各符号对应种别码 关键字分别对应1-13 运算符分别对应401-418,501-513。 字符串对应100 常量对应200 结束符# 四:举例说明 目标:实现对常量的判别 代码:

词法分析实验报告

词法分析实验报告 词法分析是编译原理中的一个重要概念,它是编译器中的第一个阶段,也是最基础的一个阶段。词法分析器将输入的源代码转化为一系列的标记(Token),这些标记是语法分析器后续 分析的基本单元。 在本次实验中,我们使用C语言编写了一个简单的词法分析器。该词法分析器可以识别常见的C语言关键字(如if、while、for等)、运算符(如+、-、*、/等)、标识符、常量等,并将它们转化为相应的标记。 实验过程中,我们使用了C++编程语言来实现词法分析器。 在主函数中,我们首先读取输入的源代码文件,并将其逐个字符地进行扫描。扫描过程中,我们利用一些常见的正则表达式来匹配每个标记,并将其转化为相应的Token。在匹配完成后,我们将Token存储在一个Token序列中,以便后续的语法分 析器使用。 实验过程中,我们遇到了一些困难。一是字符匹配的问题,在处理运算符等特殊字符时,需要对转义字符进行特殊处理。二是标识符的识别问题,我们需要判断一个字符是否属于标识符中的某一部分,而不能将其单独当作一个标记。为了解决这个问题,我们采用了状态机的方法,维护一个标识符的状态,根据状态的变化来判断是否识别到了一个完整的标识符。 在实验结果中,我们成功地将源代码转化为了一系列的标记。这些标记可以用于后序的语法分析和语义分析等过程中。同时,

我们也发现了一些问题,如在处理注释时可能会出现误判等。针对这些问题,我们可以进一步改进词法分析器,提高其准确性和鲁棒性。 总的来说,通过本次实验,我们深入理解了词法分析的原理和过程,并成功地实现了一个简单的词法分析器。通过这个实验,我们对编译原理有了更深入的了解,并提高了自己的编程能力。

编译原理实验报告(词法分析器语法分析器)

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序

3

五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k (int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

编译原理词法分析,语法分析实验报告

编译原理实验报告 一.LL(1)文法分析 1.设计要求 (1)对输入文法,它能判断是否为LL(1)文法,若是,则转(2);否则报错并终止; (2)输入已知文法,由程序自动生成它的LL(1)分析表; (3)对于给定的输入串,应能判断识别该串是否为给定文法的句型。 2.分析 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由总控算法判断输入符号串是否为该文法的句型。 3.流程图 开始 读入文法 有效? 是 是LL(1)文法? 是 判断句型报错 结束

4.源程序 /******************************************* 语法分析程序 作者:xxx 学号:xxx ********************************************/ #include #include #include /*******************************************/ int count=0; /*分解的产生式的个数*/ int number; /*所有终结符和非终结符的总数*/ char start; /*开始符号*/ char termin[50]; /*终结符号*/ char non_ter[50]; /*非终结符号*/ char v[50]; /*所有符号*/ char left[50]; /*左部*/ char right[50][50]; /*右部*/ char first[50][50],follow[50][50]; /*各产生式右部的FIRST和左部的FOLLOW集合*/ char first1[50][50]; /*所有单个符号的FIRST集合*/ char select[50][50]; /*各单个产生式的SELECT集合*/ char f[50],F[50]; /*记录各符号的FIRST和FOLLOW是否已求过*/ char empty[20]; /*记录可直接推出^的符号*/ char TEMP[50]; /*求FOLLOW时存放某一符号串的FIRST集合*/ int validity=1; /*表示输入文法是否有效*/ int ll=1; /*表示输入文法是否为LL(1)文法*/ int M[20][20]; /*分析表*/ char choose; /*用户输入时使用*/ char empt[20]; /*求_emp()时使用*/ char fo[20]; /*求FOLLOW集合时使用*/ /******************************************* 判断一个字符是否在指定字符串中 ********************************************/ int in(char c,char *p) { int i; if(strlen(p)==0)

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

词法分析器实验报告 一、实验目的 选择一种编程语言实现简单的词法分析程序,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 := + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 各种单词符号对应的种别码: 表各种单词符号对应的种别码

词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 主程序示意图: 主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};

相关主题
文本预览
相关文档 最新文档