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

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

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

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

一、引言

编译器是将高级语言程序转化为机器语言的工具,其中词法分析是编译器的第一个阶段。词法分析的主要任务是将源程序分割成一个个的词素,即最小的语法单位。本实验旨在通过编写一个简单的词法分析器,深入理解词法分析的原理和实现方式。

二、实验目的

1. 理解词法分析的基本概念和原理;

2. 掌握正则表达式的使用;

3. 实现一个简单的词法分析器。

三、实验环境和工具

本实验使用Python语言进行实现,主要利用了Python的正则表达式库re。

四、实验过程

1. 确定词法规则

在词法分析中,需要定义一些词法规则,例如标识符、关键字、运算符等。根据具体要求,我们可以通过正则表达式来描述这些规则。

2. 实现词法分析器

根据词法规则,我们可以编写一个简单的词法分析器。首先,需要将源代码读入内存中。然后,逐个字符进行扫描,根据正则表达式匹配相应的词法单元。最后,将识别出的词法单元输出。

五、实验结果

经过实验,我们成功实现了一个简单的词法分析器。下面是一段示例代码及其词法分析结果:

示例代码:

```

int main()

{

int a = 10;

int b = 20;

int sum = a + b;

return sum;

}

```

词法分析结果:

```

Token: int, Lexeme: int

Token: identifier, Lexeme: main

Token: left_parenthesis, Lexeme: (

Token: right_parenthesis, Lexeme: )

Token: left_brace, Lexeme: {

Token: int, Lexeme: int

Token: identifier, Lexeme: a

Token: assignment_operator, Lexeme: =

Token: integer, Lexeme: 10

Token: semicolon, Lexeme: ;

Token: int, Lexeme: int

Token: identifier, Lexeme: b

Token: assignment_operator, Lexeme: =

Token: integer, Lexeme: 20

Token: semicolon, Lexeme: ;

Token: int, Lexeme: int

Token: identifier, Lexeme: sum

Token: assignment_operator, Lexeme: =

Token: identifier, Lexeme: a

Token: plus_operator, Lexeme: +

Token: identifier, Lexeme: b

Token: semicolon, Lexeme: ;

Token: return, Lexeme: return

Token: identifier, Lexeme: sum

Token: semicolon, Lexeme: ;

Token: right_brace, Lexeme: }

```

六、实验总结

通过本次实验,我们深入了解了词法分析的原理和实现方式。在实现词法分析

器的过程中,我们掌握了正则表达式的使用,并成功将源代码分割成词法单元。

词法分析是编译器的第一个重要步骤,为后续的语法分析和语义分析奠定了基础。通过本次实验,我们对编译原理有了更深入的理解,并提升了编程能力。

计算机编译原理实验报告

编译原理实验报告 实验一词法分析设计 一、实验功能: 1、对输入的IXt文件内的内容进行词法分析: 2、由文件流输入IesiJxi中的内容,对文件中的各类字符进行词法分析 3、打印出分析后的结果;

二、程序结构描述:(源代码见附录) 1、分别利用k[],siu,s2[],s3[]构造关键字表,分界符表,算术运算符表和关系运算符表。 2、bool isletter(){}用来判断其是否为字母,是则返回IrUe,否则返回false; bool isdigit(){)用来判断其是否为数字,是则返回IrUe,否则返回false; bool iscalcu(){)用来判断是否为算术运算符,是则返回IrUe,否则返回false; bool reserve(string a∣∣){)用来判断某字符是否在上述四个表中,是则返向InIe,否则返回false; void concat(){)用来连接字符串; void getn(){)用来读取字符; void getb(){)用来对空格进行处理; void retract(){}某些必要的退格处理; int analysis(){}对一个单词的单词种别进行具体判断; 在主函数中用switch决定输出。

3| file.txt -记事本 文件(F)编辑⑹格式(O)查看(V) W(H) if i = O then i ++; a <= 3b%); 富F:\cpp\词法分析器.exe Process exited after 2.503 seconds with return 信按任意键继续∙.∙ 四、实验总结 词法分析器一眼看上去很复杂,但深入的去做就会发现并没有一开始想象的那么困难。 对于一个字符的种别和类型可以用b∞l 函数来判断,对于关键字和标示符的识别(尤其是 3b)则费了一番功夫,最后对于常数的小数点问题处理更是麻烦。另外,这个实验要设定好 时候退格,否则将会导致字符漏读甚至造成字符重复读取。 我认为,这个实验在程序实现上大体不算困难,但在细节的处理上则需要好好地下功夫 去想,否则最后的程序很可能会出现看上去没有问题,但实际上漏洞百出的状况。 将学过的知识应用到实际中并不简单,只有自己不断尝试将知识转化成程序才能避免眼 高手低,对于知识的理解也必将更加深刻。 单词 *******分析结果如下美 二元序列 类型 then + + 3b <6,i> <4,=> 〈5.0) <6,i> <3,++> <6,a> <4,<=> Error Error <2,>> <2,;> 关标天常关OW ⅛: 天ErEr 八芬 键识系匿识术识系rorr 字 符运字符运符 运r O B-Tnvp 1%E,E--? 符符 算算 位置 <1,1> <1,2> <1,3〉 <1,4〉 <1,5> <1,6〉 <1,7〉 <2,1> <2,2〉 《2,3》 <2,4) <2,5〉 value 0

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

《编译原理》实验报告 班级:计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的词法分析

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

计算机硬件实验室实验报告 姓名学号班级 词法分析成绩 设备名称及软件环境 一、实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求: 识别保留字: if、int、for、while、do、return、break、continue,等C语言的保留字;单词种别码为1。 其他的都识别为标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括: +、-、*、/、=、>、<、>=、<=、!=;单词种别码为4。 分隔符包括: ,、;、{、}、(、)、[、];单词种别码为5。 三、实验过程:

根据题目要求,初步完成程序过程的设计,模块的划分、变量类型分配。 #inlclude int main(){int d,a,c; a=10; c=a+b; printf("%d%d",a,b);; return 0;}用以上定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。 经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格: 常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。 0.定义部分: 定义常量、变量、数据结构。 1.初始化: 从文件将源程序全部输入到字符缓冲区中。 2.取单词前: 去掉多余空白。 3.取单词: 利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?) 4.显示结果。四、实验结果:

编译原理实验报告

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

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

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

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

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

一、实验目的 通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。 二、实验内容及要求 对某特定语言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、各种单词符号种别码如下表:

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

编译原理语法分析实验报告 编译原理语法分析实验报告 引言 编译原理是计算机科学中的重要课程,它研究的是如何将高级语言转化为机器 语言的过程。语法分析是编译过程中的一个关键步骤,它负责将输入的源代码 转化为抽象语法树,为后续的语义分析和代码生成提供便利。本实验旨在通过 实践,加深对语法分析的理解,并掌握常见的语法分析算法。 实验环境 本次实验使用的是Python编程语言,因为Python具有简洁的语法和强大的库 支持,非常适合用于编译原理的实验。 实验步骤 1. 词法分析 在进行语法分析之前,需要先进行词法分析,将源代码划分为一个个的词法单元。词法分析器的实现可以使用正则表达式或有限自动机等方式。在本实验中,我们选择使用正则表达式来进行词法分析。 2. 文法定义 在进行语法分析之前,需要先定义源代码的文法。文法是一种形式化的表示, 它描述了源代码中各个语法成分之间的关系。常见的文法表示方法有巴科斯范 式(BNF)和扩展巴科斯范式(EBNF)。在本实验中,我们选择使用BNF来表 示文法。 3. 自顶向下语法分析 自顶向下语法分析是一种基于产生式的语法分析方法,它从文法的起始符号开

始,逐步展开产生式,直到生成目标字符串。自顶向下语法分析的关键是选择合适的产生式进行展开。在本实验中,我们选择使用递归下降分析法进行自顶向下语法分析。 4. 自底向上语法分析 自底向上语法分析是一种基于移进-归约的语法分析方法,它从输入串的左端开始,逐步将输入符号移入分析栈,并根据产生式进行归约。自底向上语法分析的关键是选择合适的归约规则。在本实验中,我们选择使用LR(1)分析法进行自底向上语法分析。 实验结果 经过实验,我们成功实现了自顶向下和自底向上两种语法分析算法,并对比了它们的优缺点。 自顶向下语法分析的优点是易于理解和实现,可以直接根据产生式进行展开,但缺点是对左递归和回溯的处理比较困难,而且效率较低。 自底向上语法分析的优点是可以处理任意文法,对左递归和回溯的处理较为方便,而且效率较高,但缺点是实现相对复杂,需要构建分析表和使用分析栈。结论 通过本次实验,我们深入理解了编译原理中的语法分析过程,并掌握了自顶向下和自底向上两种常见的语法分析算法。语法分析是编译过程中的重要环节,它为后续的语义分析和代码生成提供了基础。掌握语法分析算法对于编译原理的学习和实践具有重要意义。

(完整word版)编译原理词法分析程序实现实验报告

(完整word版)编译原理词法分析程序实现实验报告 实验一词法分析程序实现 一、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。 二、设计部分 因为需要选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来,而其中的关键则为无符号数的识别,它不仅包括了一般情况下的整数和小数,还有以E为底数的指数运算,其中关于词法分析的无符号数的识别过程流程图如下: GOTO 1:

(完整word版)编译原理词法分析程序实现实验报告 GOTO 2: 三、源程序代码部分 #include #include #include #define MAX 100 #define UNSIGNEDNUMBER 1 #define PLUS 2 #define SUBTRACT 3

#define MULTIPLY 4 #define DIVIDE 5 #define LEFTBRACKET 6 #define RIGHTBRACKET 7 #define INEFFICACIOUSLABEL 8 #define FINISH 111 int count=0; int Class; void StoreType(); int Type[100]; char Store[20]={'\0'}; void ShowStrFile();//已经将要识别的字符串存在文件a中 void Output(int a,char *p1,char *p2);//字符的输出过程 int Sign(char *p);//'+''-''*''/'整体识别过程 int UnsignedNum(char *p);//是否适合合法的正整数0~9 int LegalCharacter(char *p);//是否是合法的字符:Sign(p)||UnsignedNum(p)||'E'||'.' void DistinguishSign(char *p);//'+''-''*''/'具体识别过程 void TypyDistinguish();//字符的识别过程 void ShowType();//将类别码存储在Type[100]中,为语法分析做准备 void ShowStrFile()//已经将要识别的字符串存在文件a中 { FILE *fp_s; char ch; if((fp_s=fopen("a.txt","r"))==NULL)

词法分析实验报告

词法分析实验报告 一、实验目的和背景 词法分析是编译原理中的重要部分之一,其主要作用是将源程序中的字符序列转化为有意义的单词序列,以便于后续的处理和分析。为了更好地理解词法分析的实现原理以及掌握相关算法和工具,本次词法分析实验旨在通过手动编写正则表达式、确定有限自动机的状态转移函数和实现词法分析程序来实现词法分析。 二、实验内容 在本次实验中,我们需要完成以下任务: 1.手动编写正则表达式; 2.确定有限自动机的状态转移函数; 3.实现词法分析程序。

三、实验过程 1.手动编写正则表达式 对于给定的源程序,我们首先需要根据其语法规则手动编写正则表达式。例如,对于一个简单的算术表达式,其正则表达式可以如下所示: i. 数字(0-9):[0-9]+ ii. 加号(+):\+ iii. 减号(-):- iv. 乘号(*):\* v. 除号(/):/ vi. 左括号(():\(

vii. 右括号()):\) 2.确定有限自动机的状态转移函数 根据正则表达式,我们可以确定有限自动机的状态转移函数。例如,对于上述算术表达式的正则表达式,其有限自动机的状态转移函数如下所示: i. 初始状态(S):判断下一个字符,如果是数字则进入数字状态,如果是左括号则进入左括号状态; ii. 数字状态(D):继续判断下一个字符,如果是数字则保持在数字状态,如果是运算符则输出数字记号,返回初始状态,如果是右括号则输出数字记号,返回初始状态; iii. 左括号状态(L):输出左括号记号,返回初始状态; iv. 右括号状态(R):输出右括号记号,返回初始状态。

3.实现词法分析程序 根据以上的正则表达式和有限自动机的状态转移函数,我们可以编写一个简单的词法分析程序。该程序的主要流程如下所示: i. 读取源程序的字符序列; ii. 根据有限自动机的状态转移函数,逐个字符进行状态转移; iii. 如果当前状态为接受状态,则输出相应的记号; iv. 继续进行状态转移,直至读取完整个源程序。 四、实验结果 通过以上步骤,我们成功完成了对给定源程序的词法分析。在实验中,我们还可以尝试根据实际需求对正则表达式、有限自动机的状态转移函数进行优化,以提高程序的效率和准确性。

词法分析实验报告

词法分析实验报告 词法分析是编译原理中的一个重要概念,它是编译器中的第一个阶段,也是最基础的一个阶段。词法分析器将输入的源代码转化为一系列的标记(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]);

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

词法分析器实验报告 一、实验目的 选择一种编程语言实现简单的词法分析程序,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 2.1 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 : = + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2.2 各种单词符号对应的种别码: 表2.1 各种单词符号对应的种别码 2.3 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(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 主程序示意图: 主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴ 关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin ”, “if ”, “then ”, “while ”, “do ”, “end ”,}; 图3-1 (2)程序中需要用到的主要变量为syn,token 和 sum 3.2 扫描子程序的算法思想: 首先设置3个变量:①token 用来存放构成单词符号的字符串;②sum 用来整型单词;③syn 用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。

编译原理实验报告——词法分析器(内含源代码)

编译原理实验(一)——词法分析器

一.实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则。 该语言的单词符号包括: 1

2状态转换图 3程序流程:

词法分析作成一个子程序,由另一个主程序调用,每次调用返回一个单词对应的二元组,输出标识符表、常数表由主程序来完成。 二.实验目的 通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。 三.实验任务 编制程序实现要求的功能,并能完成对测试样例程序的分析。

四.实验原理 char set[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符char sign[50][10],constant[50][10];//存储标识符和常量 定义了一个Analyzer类 class Analyzer{ public: Analyzer(); //构造函数 ~Analyzer(); //析构函数 int IsLetter(char ch); //判断是否是字母,是则返回 1,否则返回 0。 int IsDigit(char ch); //判断是否为数字,是则返回 1,否则返回 0。 void GetChar(char *ch); //将下一个输入字符读到ch中。 void GetBC(char *ch); //检查ch中的字符是否为空白, 若是,则调用GetChar直至ch进入一个非空白字符。 void Concat(char *strTaken, char *ch); //将ch中的字符连接到strToken之后。 int Reserve(char *strTaken); //对strTaken中的字符串查找保留字表,若是一个保留字返回它的数码,否则返回0。 void Retract(char *ch) ; //将搜索指针器回调一个字符位置,将ch置为空白字符。void input();//向存放输入结果的字符数组输入一句语句。 void display();//输出一些程序结束字符显示样式 int analyzerSubFun();//词法分析器子程序,为了实现词法分析的主要功能。 五.代码实现 // cifa.cpp : 定义控制台应用程序的入口点。 // #include"stdafx.h" #include"stdio.h" #include"string.h" #include"iostream" using namespace std; char set[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符 char sign[50][10],constant[50][10];//存储标识符和常量 //int Words[500][10]; char ch;//当前读入字符 int sr,to=0;//数组str, strtaken 的指针 int st=0,dcount=0; int id=0; static int line=1; int h,l; typedef struct Words /*放置二元组*/ { int num; char letters[20];

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

编译原理实验报告 词法分析器制作与应用 设计思想 (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 结束符# 四:举例说明 目标:实现对常量的判别 代码:

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