编译原理实验:词法分析
编译原理词法分析实验报告
编译原理词法分析实验报告
实验名称:词法分析器的设计与实现
一、实验目的:
1.熟悉编译原理中词法分析的基本概念和原理;
2.掌握正则表达式的使用方法;
3.实现一个简单的词法分析器。
二、实验内容:
1.设计一个简单的编程语言,包含如下几种类型的词法单元:关键字、标识符、常量、运算符和界符。
2.使用正则表达式定义每种词法单元的模式。
3.设计一个词法分析器,将源代码中的每个词法单元识别出来并输出。
三、实验步骤:
1. 确定编程语言的词法单元类型和正则表达式模式,定义相应的单
词类型(如 TokenType)和模式(如 regex)。
2. 实现一个词法分析器的类 Lexer,包含以下方法:
(1)一个构造方法,用于初始化词法分析器的输入源代码。
(2) 一个getNextToken方法,用于获取源代码中的下一个词法单元。
3. 在getNextToken方法中,使用正则表达式逐个识别源代码中的词
法单元,并返回相应的Token对象。
4. 设计一个Token类,包含以下属性:词法单元类型、词法单元的值和位置信息等。
5.在主程序中使用词法分析器,将源代码中的每个词法单元识别出来并输出。
四、实验结果:
1.设计一个简单的编程语言,包含如下词法单元类型(示例):
(1) 关键字:if、else、while、for等;
(2)标识符:变量名等;
(3)常量:整数、浮点数、字符串等;
(4)运算符:+、-、*、/、=等;
(5)界符:(、)、{、}、;等。
2. 实现一个词法分析器,识别出源代码中的每个词法单元,并输出相应的Token对象。
编译原理实验一词法分析
编译原理实验⼀词法分析
实验⼀词法分析
【实验⽬的】
(1)熟悉词法分析器的基本功能和设计⽅法;
(2)掌握状态转换图及其实现;
(3)掌握编写简单的词法分析器⽅法。
【实验内容】
对⼀个简单语⾔的⼦集编制⼀个⼀遍扫描的词法分析程序。
【实验要求】
(1)待分析的简单语⾔的词法
1) 关键字 begin if then while do end
2) 运算符和界符 := + - * / < <= <> > >= = ; ( ) #
3) 其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digitdigit*
4) 空格由空⽩、制表符和换⾏符组成。空格⼀般⽤来分隔 ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。 (2)各种单词符号对应的种别编码
(3)词法分析程序的功能
输⼊:所给⽂法的源程序字符串
输出:⼆元组(syn,token 或 sum)构成的序列。
syn 为单词种别码;
token 为存放的单词⾃⾝字符串;
sum 为整形常数。
【实验代码】
1 #include<iostream>
2 #include<string.h>
3 #include<conio.h>
4 #include<ctype.h>
5using namespace std;
6int sum,syn,p,m,n;
7char ch,chs[8],s[100];
编译原理 实验
编译原理实验
编译原理实验。
编译原理是计算机科学中的一个重要领域,它研究的是编译器的设计和实现原理。编译器是将高级语言代码转换成机器语言代码的程序,它在软件开发过程中起着至关重要的作用。而编译原理实验则是帮助学生深入理解编译原理的重要手段之一,通过实际操作来加深对编译原理知识的理解和掌握。
在编译原理实验中,我们需要掌握以下几个关键点:
1. 词法分析,词法分析是编译过程中的第一步,它负责将源代码分割成一个个的单词(Token)。在词法分析实验中,我们需要实现一个词法分析器,能够正确地识别出源代码中的各种单词,并进行分类和标记。
2. 语法分析,语法分析是编译过程中的第二步,它负责将词法分析得到的单词序列转换成抽象语法树。在语法分析实验中,我们需要实现一个语法分析器,能够根据给定的文法规则,将单词序列转换成抽象语法树,并进行语法检查。
3. 语义分析,语义分析是编译过程中的第三步,它负责对抽象语法树进行语义检查和翻译。在语义分析实验中,我们需要实现一个语义分析器,能够对抽象语法树进行类型检查、作用域分析等,并生成中间代码。
4. 代码生成,代码生成是编译过程中的最后一步,它负责将中间代码转换成目标机器代码。在代码生成实验中,我们需要实现一个代码生成器,能够将中间代码转换成目标机器代码,并进行优化。
通过以上实验,我们可以深入理解编译原理的各个环节,并掌握编译器的设计和实现原理。同时,实验过程中还能培养我们的动手能力和解决问题的能力,为今后的软件开发打下坚实的基础。
总之,编译原理实验是非常重要的,它能够帮助我们深入理解编译原理知识,提高我们的动手能力和解决问题的能力。希望大家能够认真对待编译原理实验,从中获得更多的收获和成长。
编译原理词法分析
δ(1,a) = 3
δ(3,a) = 3
δ(1,b) = 2
a 0 b b
1 a
a 3 b
a,b
2
编译原理
DFA的确定性表现在:
对任何状态s ∈S,在读入了输入符号a ∈
Σ 之后,能够唯一地确定下一个状态。
编译原理
例子
符号 100 21 记号 ID = 单词 a =
a=10+c*20
200 22 100 25 200
NUM + ID * NUM
10 + c * 20
编译原理
识别各种单词符号
超前搜索技术:如在读取/* */时,当读到/时, 如何判别是注释还是除法运算?
识别单词:掌握单词的构成规则很重要
字母或数字 数字
0
字母
1
其它
2
*
0
数字
1
其它
2
*
识别标识符的转换图
识别整数的转换图
编译原理
字母、数字
S
字母
标识符 数字
S
数字
无符号整数
wenku.baidu.com
编译原理
示例语言的单词符号
标识符: name, aaa 基本字: if,else,for,while,do,int,read,write 无符号整数:100,256 算符及界符:
编译原理-词法分析
词法分析的挑战和解决方案
错误处理
如何处理错误输入和不合法的词法 单元。
性能优化
如何提高词法分析的速度和效率。
跨平台兼容
如何处理不同编程语言和操作系统 的词法规则。
结论和总结
词法分析是编译原理中不可或缺的一部分,对于编译器的正确性和性能有着 重要影响。了解词法分析的流程和技术,可帮助开发者构建更高效的编译器 和语言处理工具。
2
识别
将符号序列映射到相应的词法单元。
3
归类
将词法单元分为不同的类别,如标识符、关键字、操作符等。
常见的词法分析技术
正则表达式
用于描述词法单元的模式。
有限自动机
用于识别符号序列并生成词法 单元。
词法分析器生成器
自动生成词法分析器的工具。
词法分析的应用场景
词法分析广泛应用于编译器、解释器和语言处理工具等领域,确保源代码的正确解析和语义分析。
编译原理-词法分析
词法分析是编译原理中的重要阶段,负责将源代码分解为词法单元,为后续 的语法分析准备输入。
词法分析的定义和作用
词法分析是编译器的第一阶段,其主要目的是将源代码转换为有意义的词法 单元,如标识符、关键字、操作符等,以便后续的语法分析和语义分析使用。
词法分析的流程
Fra Baidu bibliotek
1
扫描
将源代码分割为符号序列。
计算机编译原理实验报告
编译原理实验报告
实验一词法分析设计
一、实验功能:
1、对输入的txt文件内的内容进行词法分析:
2、由文件流输入test.txt中的内容,对文件中的各类字符进行词法分析
3、打印出分析后的结果;
二、程序结构描述:(源代码见附录)
1、分别利用k[],s1[],s2[],s3[]构造关键字表,分界符表,算术运算符表和关系运算符表。
2、bool isletter(){} 用来判断其是否为字母,是则返回true,否则返回false;
bool isdigit(){} 用来判断其是否为数字,是则返回true,否则返回false;
bool iscalcu(){} 用来判断是否为算术运算符,是则返回true,否则返回false;
bool reserve(string a[]){} 用来判断某字符是否在上述四个表中,是则返回true,否则返回false;
void concat(){} 用来连接字符串;
void getn(){} 用来读取字符;
void getb(){} 用来对空格进行处理;
void retract(){}某些必要的退格处理;
int analysis(){} 对一个单词的单词种别进行具体判断;
在主函数中用switch决定输出。
三、实验结果
四、实验总结
词法分析器一眼看上去很复杂,但深入的去做就会发现并没有一开始想象的那么困难。对于一个字符的种别和类型可以用bool函数来判断,对于关键字和标示符的识别(尤其是3b)则费了一番功夫,最后对于常数的小数点问题处理更是麻烦。另外,这个实验要设定好时候退格,否则将会导致字符漏读甚至造成字符重复读取。
词法分析实验报告
词法分析实验报告
词法分析是编译原理中的一个重要概念,它是编译器中的第一个阶段,也是最基础的一个阶段。词法分析器将输入的源代码转化为一系列的标记(Token),这些标记是语法分析器后续
分析的基本单元。
在本次实验中,我们使用C语言编写了一个简单的词法分析器。该词法分析器可以识别常见的C语言关键字(如if、while、for等)、运算符(如+、-、*、/等)、标识符、常量等,并将它们转化为相应的标记。
实验过程中,我们使用了C++编程语言来实现词法分析器。
在主函数中,我们首先读取输入的源代码文件,并将其逐个字符地进行扫描。扫描过程中,我们利用一些常见的正则表达式来匹配每个标记,并将其转化为相应的Token。在匹配完成后,我们将Token存储在一个Token序列中,以便后续的语法分
析器使用。
实验过程中,我们遇到了一些困难。一是字符匹配的问题,在处理运算符等特殊字符时,需要对转义字符进行特殊处理。二是标识符的识别问题,我们需要判断一个字符是否属于标识符中的某一部分,而不能将其单独当作一个标记。为了解决这个问题,我们采用了状态机的方法,维护一个标识符的状态,根据状态的变化来判断是否识别到了一个完整的标识符。
在实验结果中,我们成功地将源代码转化为了一系列的标记。这些标记可以用于后序的语法分析和语义分析等过程中。同时,
我们也发现了一些问题,如在处理注释时可能会出现误判等。针对这些问题,我们可以进一步改进词法分析器,提高其准确性和鲁棒性。
总的来说,通过本次实验,我们深入理解了词法分析的原理和过程,并成功地实现了一个简单的词法分析器。通过这个实验,我们对编译原理有了更深入的了解,并提高了自己的编程能力。
编译原理实验词法分析器与语法分析器实现
编译原理实验词法分析器与语法分析器实现词法分析器与语法分析器是编译器的两个重要组成部分,它们在编译过程中扮演着至关重要的角色。词法分析器负责将源代码转化为一个个标记(token)序列,而语法分析器则根据词法分析器生成的标记序列构建语法树,验证源代码的语法正确性。本实验旨在实现一个简单的词法分析器和语法分析器。
实验一:词法分析器实现
在实现词法分析器之前,需要定义所需词法项的规则。以C语言为例,常见的词法项包括关键字(如int、if、for等)、标识符、运算符(如+、-、*、/等)、常量(如整数、浮点数等)和分隔符(如括号、逗号等)。接下来,我们来实现一个简单的C语言词法分析器。
1. 定义词法项的规则
在C语言中,关键字和标识符由字母、数字和下划线组成,且首字符不能为数字。运算符包括各种数学运算符和逻辑运算符。常量包括整数和浮点数。分隔符包括括号、逗号等。
2. 实现词法分析器的代码
下面是一个简单的C语言词法分析器的实现代码:
```python
def lexer(source_code):
keywords = ['int', 'if', 'for'] # 关键字列表
operators = ['+', '-', '*', '/'] # 运算符列表
separators = ['(', ')', '{', '}', ',', ';'] # 分隔符列表
tokens = [] # 标记序列列表
current_token = '' # 当前标记
for char in source_code:
if char.isspace(): # 如果是空格,则忽略
编译原理词法分析器
编译原理词法分析器
编译原理是计算机科学中的重要领域,而词法分析器则是编译器的
第一个阶段。它的主要任务是将源代码转化为一个个词法单元,以便
接下来的语法分析和语义分析等阶段进行处理。在本文中,我们将深
入探讨词法分析器的原理和实现。
一、什么是词法分析器
词法分析器(Lexical Analyzer)是编译器中实现词法分析的部分。
它负责从源代码中提取出各个合法的词法单元,并进行分类和标记。
词法单元通常包括关键字、标识符、运算符、分隔符和常量等。
二、词法分析器的原理
词法分析器的工作原理可以概括为以下几个步骤:
1. 预处理:词法分析器首先会对源代码进行预处理,去除注释、替
换宏定义等。
2. 分割:将预处理后的源代码分割成一个个字符。
3. 匹配:根据预定义的词法规则,将字符序列匹配到对应的词法单
元上。
4. 标记:对每个词法单元都打上相应的标记,以便后续的语法分析。
三、词法分析器的实现
1. 正则表达式:词法分析器通常使用正则表达式定义词法规则,用以匹配词法单元。例如,使用正则表达式"\d+"可以匹配一个或多个数字。
2. 有限自动机:词法分析器可以通过构造有限自动机来进行词法分析。有限自动机可以根据当前状态和输入字符进行状态转移,最终得到一个词法单元的序列。
3. 符号表:词法分析器使用符号表来存储已经识别出的标识符和关键字,并为每个标识符分配一个唯一的标识符号。
四、应用举例
以C语言为例,假设我们要编写一个词法分析器来分析C源代码。下面是一个简单的示例代码:
```c
#include <stdio.h>
编译原理词法分析
编译原理词法分析
编译原理的词法分析是编译器中的一个重要过程,它负责将源代码分
割成一个个的词法单元(Token)。词法单元是程序中的最小语法单位,
如标识符、关键字、运算符、常数等。
词法分析的主要任务是从左到右扫描源代码字符流,逐个字符进行解析,并根据预先定义的词法规则识别出各种词法单元。为了实现词法分析,通常会采用有限自动机(DFA)或正则表达式来描述词法规则。
具体的词法分析过程包括以下几个步骤:
1.建立输入缓冲区:将源代码存储在缓冲区中,方便逐个字符进行读
取和处理。
2.扫描字符流:从缓冲区中逐个字符读取并处理,跳过空白字符(空格、制表符、换行符等)。
3.根据词法规则识别词法单元:根据预先定义的词法规则,将字符序
列转换为词法单元,并记录其类型和属性信息。
4.错误处理:如果遇到无法识别的字符序列或不符合词法规则的情况,进行相应的错误处理并报告错误。
5.输出词法单元流:将识别出的词法单元按照顺序输出,作为下一步
的输入。
词法分析是编译器的前端处理阶段,它为语法分析提供了基础数据,
将源代码转化为一个个的词法单元,为后续的语法分析、语义分析和代码
生成等阶段提供支持。
实验一词法分析器
语句的语法和语义( semantics) 2.2 语句的语法和语义(syntax & semantics)
语句满足下述规定(原则) 语句满足下述规定(原则): 各类语句可以按任意次序书写,且语句以分号结尾。 <1> 各类语句可以按任意次序书写,且语句以分号结尾。 源程序中的语句以它们出现的先后顺序处理。 源程序中的语句以它们出现的先后顺序处理。 ORIGIN、ROT和 语句只影响其后的绘图语句, <2> ORIGIN、ROT和SCALE 语句只影响其后的绘图语句, 且遵循最后出现的语句有效的原则。例如,若有下述ROT ROT语句 且遵循最后出现的语句有效的原则。例如,若有下述ROT语句 序列: 序列: ROT IS 0.7 ; ROT IS 1.57 ; 则随后的绘图语句将按1.57而不是0.7弧度旋转。 1.57而不是0.7弧度旋转 则随后的绘图语句将按1.57而不是0.7弧度旋转。 无论ORIGIN ROT和SCALE语句的出现顺序如何 ORIGIN、 语句的出现顺序如何, <3> 无论 ORIGIN 、ROT 和SCALE 语句的出现顺序如何, 图 形的变换顺序总是:比例变换→旋转变换→ 形的变换顺序总是:比例变换→旋转变换→平移变换 语言对大小写不敏感,例如for For、FOR等 for、 <4> 语言对大小写不敏感,例如for、For、FOR等,均 被认为是同一个保留字。 被认为是同一个保留字。 语句中表达式的值均为双精度类型, <5> 语句中表达式的值均为双精度类型,旋转角度单位 为弧度且为逆时针旋转,平移单位为点。 为弧度且为逆时针旋转,平移单位为点。
编译原理的词法分析与语法分析
编译原理的词法分析与语法分析编译原理是计算机科学中的一门重要课程,它研究如何将源代码转换为可执行的机器代码。在编译过程中,词法分析和语法分析是其中两个基本的阶段。本文将分别介绍词法分析和语法分析的基本概念、原理以及实现方法。
1. 词法分析
词法分析是编译过程中的第一个阶段,主要任务是将输入的源代码分解成一个个的词法单元。词法单元是指具有独立意义的最小语法单位,比如变量名、关键字、操作符等。词法分析器通常使用有限自动机(finite automaton)来实现。
在词法分析的过程中,需要定义词法规则,即描述每个词法单元的模式。常见的词法规则有正则表达式和有限自动机。词法分析器会根据这些规则匹配输入的字符序列,并生成相应的词法单元。
2. 语法分析
语法分析是编译过程中的第二个阶段,它的任务是将词法分析器生成的词法单元序列转换为语法树(syntax tree)或抽象语法树(abstract syntax tree)。语法树是源代码的一种抽象表示方式,它反映了源代码中语法结构和运算优先级的关系。
语法分析器通常使用上下文无关文法(context-free grammar)来描述源代码的语法结构。常见的语法分析算法有递归下降分析法、LR分析法和LL分析法等。
递归下降分析法是一种自顶向下的分析方法,它从源代码的起始符号开始,递归地展开产生式,直到匹配到输入的词法单元。递归下降分析法的实现比较直观,但对于左递归的文法处理不方便。
LR分析法是一种自底向上的分析方法,它使用一个自动机来分析输入的词法单元,并根据文法规则进行规约操作,最终生成语法树。常见的LR分析法有LR(0)、SLR、LR(1)和LALR等。
编译原理-第3章 词法分析--习题答案
第3章词法分析习题答案
1.判断下面的陈述是否正确。
(1)有穷自动机接受的语言是正规语言。(√)
(2)若r1和r2是Σ上的正规式,则r1|r2也是Σ上的正规式。(√)
(3)设M是一个NFA,并且L(M)={x,y,z},则M的状态数至少为4个。(× )
(4)设Σ={a,b},则Σ上所有以b为首的符号串构成的正规集的正规式为b*(a|b)*。(× )(5)对任何一个NFA M,都存在一个DFA M',使得L(M')=L(M)。(√)
(6)对一个右线性文法G,必存在一个左线性文法G',使得L(G)=L(G'),反之亦然。(√) (7)一个DFA,可以通过多条路识别一个符号串。(× )
(8)一个NFA,可以通过多条路识别一个符号串。(√)
(9)如果一个有穷自动机可以接受空符号串,则它的状态图一定含有 边。(× )
(10)DFA具有翻译单词的能力。(× )
2.指与出正规式匹配的串.
(1)(ab|b)*c 与后面的那些串匹配?ababbc abab c babc aaabc
(2)ab*c*(a|b)c 与后面的那些串匹配? acac acbbc abbcac abc acc
(3)(a|b)a*(ba)* 与后面的那些串匹配? ba bba aa baa ababa
答案
(1) ababbc c babc
(2) acac abbcac abc
(3) ba bba aa baa ababa
3. 为下边所描述的串写正规式,字母表是{0, 1}.
(1)以01 结尾的所有串
(2)只包含一个0的所有串
(3) 包含偶数个1但不含0的所有串
编译原理词法分析与语法分析
编译原理词法分析与语法分析在计算机科学领域,编译器是一个非常重要的工具,它将高级程序
语言转换为能够被计算机处理的低级机器语言。编译器的设计与开发
离不开以下两个主要部分:词法分析和语法分析。本文将着重介绍编
译原理中的词法分析和语法分析的定义、原理、方法以及它们之间的
关系。
一、词法分析
词法分析是编译器的第一个阶段,负责将源代码转化为一个个“词
法单元”,也称为“记号”。词法单元是计算机程序中的最小语义单位,
例如变量名、关键字、操作符等。词法分析器会从源代码中连续读取
字符,并将其组成具有独立意义的词法单元。
词法分析的主要任务是识别代码中的词法单元,并将其分类。它采
用正则表达式来定义词法单元的模式,并通过有限状态自动机(FSM)进行匹配。以下是词法分析的一般步骤:
1. 输入源代码,逐字符读取。
2. 将字符组合成词法单元。
3. 跳过空格、换行符等不相关的字符。
4. 使用正则表达式判断词法单元的类型。
5. 将识别出的词法单元传递给语法分析阶段。
二、语法分析
语法分析是编译器的第二个阶段,它将从词法分析器获得的词法单
元串转换为语法树。语法树是一种树状结构,用于表示程序的语法结构。它通过分析词法单元之间的关系来检查程序是否符合语法规则。
在语法分析过程中,会根据源代码中的语法规则使用上下文无关文
法(Context-Free Grammar)进行分析。常用的语法分析算法有自顶向
下分析(Top-Down Parsing)和自底向上分析(Bottom-Up Parsing)。
自顶向下分析是从语法的起始符号开始,逐步展开已识别的符号,
编译原理 第五章 词法分析
六、单词的描述与识别 1、单词的描述 正则表达式与正则文法都是用来描述程序设计语 言的单词符号的,两者具有同样的表达能力。 2、单词的识别 利用状态转换图来识别单词。当词法分析在识别 单词时,为了进一步判明情况,以确定下一步要作什 么,常采用一种超前搜索的技术。所谓超前搜索,就 是向前读取字符,并判别该字符是什么,当情况判明 之后,再回来处理已读过的字符。
预处理 子程序 扫描器 单词符号
输入 列表 输入缓冲区
扫描缓冲区
词法分析器的结构
三、设置缓冲器的必要性
之所以要设置缓冲器,是因为对于许多源程序而言,有 时词法分析器为了得到某个单词符号的确切性质,只从该符 号本身所含有的字符不能作出判定,还需要超前扫描若干字 符之后,才能作出确切的分析。 例如:有合法的Fortran语句: DO99K=1,10 和 DO99K=1.10 前者是循环语句,后者是赋值语句,两者的区别在于等 号后的第一个界符不同,前者是逗号,后者是句号,因此为 了识别前者中的关键字‘“DO”,必须超前扫描若干字符之 后,才能作出确切的判定。
七、词法分析器的实现及TINY扫描程序的实现
5.3
词法分析器的自动生成
Lex工具是一种词法分析程序生成器,它可以根据词法规 则说明书的要求来生成单词识别程序,由该程序识别出输入文 本中的各个单词。 Lex的流程如下图所示:
LEX源程序 LEX编译器 C编译器 a.out Lex.yy.c a.out 单词序列
编译原理词法分析与语法分析的基本原理与实现
编译原理词法分析与语法分析的基本原理与
实现
编译原理是计算机科学的核心课程之一,它研究如何将高级语言编
写的程序转换为计算机可以执行的机器码。而词法分析和语法分析则
是编译原理中的两个重要组成部分,它们负责将源代码分解为更加抽
象和易于处理的单元,以供后续的语义分析和代码生成阶段使用。
一、词法分析的基本原理与实现
词法分析是编译器的第一道工序,它负责将源代码按照词素的单位
进行分解,生成一个个词法单元(Token)。词法单元是计算机程序中
最小的、有着确定含义的语法单元,例如关键字、标识符、常数、运
算符等。词法分析器根据编程语言的词法规则,通过有限自动机(DFA)来实现对源代码的扫描和分析。
词法分析的基本原理可以概括为以下几个步骤:
1. 正则表达式定义词法规则:不同的编程语言有着不同的词法规则,可以通过正则表达式的方式来定义关键字、标识符、运算符等的模式。
2. 构建有限自动机(DFA):根据正则表达式的定义,可以通过状
态转换图的方式来构造一个有限自动机。这个自动机可以根据输入的
字符逐步进行状态转换,最终确定每个输入字符的类型。
3. 扫描源代码:将源代码作为输入输入到DFA中,逐个字符进行
扫描,并根据状态转换图确定每个词法单元的类型。
4. 生成词法单元(Token):根据扫描的结果,生成对应的词法单元,包括单词的类型和对应的值。
实现词法分析的方式有很多种,常用的方法包括手动写正则表达式
和有限自动机,以及使用词法分析生成器(Lexical Analyzer Generator)等现成工具。
二、语法分析的基本原理与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.2 各单词符号所对应的种别码
单词符号
种别 单词 种别 码 符号 码
begin
1
:
17
if
2
:= 18
then
3
<
20
while
4
<> 21
do
5
<= 22
end
6
>
23
letter(letter | digit)*
10
>=
24
digit dihit* 11 =
25
+
12 ;
26
-
14 (
27
*
case 11 : printf("(%d,%d)",syn,sum); break;
caseຫໍສະໝຸດ Baidu-1 : printf(" error \n"); break;
default: printf("(%d,%s)",syn,token); } }while (syn!=0); } (备注:代码可以运行) 5.实验感想 通过此次实验,学习到了扫描程序的算法思想和具体的源代码的编 写,成功设计,编写,并调试了一个词法分析程序,使我加深了对词法 分析原理的理解,编写程序的过程中也是对学过的c语言的相关知识的 复习,加强了使用c语言编程的熟练程度,一定程度上也提高了自己的 动手能力。
(2)扫描之程序的算法思想: 首先要设置3个变量:token用来存放构成单词符号的字符串; sum用来存放整型单词; syn用来存放单词符号的种别码。 扫描子程序主要流程图如下:
4.词法分析程序源代码: #include<stdio.h> #include<string.h> #include<ctype.h> char prog[80],token[80]; char ch; int syn,p,m,n,sum;
编译原理实验报告
课题名称:词法分析
院系:计算机科学系
实验一:词法分析
1. 实验目的 设计,编制并调试一个词法分析程序,加深对词法分析原理的理解。 2. 实验要求
2.1 待分析的简单语言的词法 (1)关键字:
begin if then while do end 所有的关键字都是小写。 (2)运算符和界符: := + - * / < <= > >= = ; ( ) # (3) 其他单词标识符(ID)和整型常数(NUM),通过以下正规是 定义: ID= letter(letter | digit)* NUM = digit digit* (4)空白由空白,制表符和换行符组成。空格一般用来分隔ID, NUM,运算符,界符和关键字,词法分析阶段通常被忽略。
ch=prog[p++]; if(ch == '>') {
syn=21; token[m++] = ch; } else if(ch == '=') { syn=22; token[m++] = ch;
} else{
syn = 20; p--; } break; case '>': m=0;token[m++] = ch; ch=prog[p++]; if(ch == '=') { syn=24; token[m++] = ch; } else{ syn=24; p--; } break; case ':': m=0;token[m++] = ch; ch=prog[p++]; if(ch == '=') {
ch=prog[p++]; if(isalpha(ch)) {
while(isalnum(ch)){ token[m++]= ch ; ch=prog[p++];
} token[m++]='\0'; p--; syn = 10; for(n=0;n<6;n++)
if(strcmp(token,rwtab[n]) == 0) {
} return syn;
} void main() {
p=0; printf("\n please input string :\n"); do{
ch=getchar(); prog[p++]=ch; }while(ch!='#'); p=0; do { scaner(); switch(syn) {
syn=18; token[m++] = ch;
} else{
syn=18; p--; } break; case '+': syn=13; token[0]=ch;break; case '-': syn=14; token[0]=ch;break; case '*': syn=15; token[0]=ch;break; case '/': syn=16; token[0]=ch;break; case '=': syn=25; token[0]=ch;break; case ';': syn=26; token[0]=ch;break; case '(': syn=27; token[0]=ch;break; case ')': syn=28; token[0]=ch;break; case '#': syn=0; token[0]=ch;break; default : syn=-1;
syn=n+1; break; } } else if(isdigit(ch)){ while(isdigit(ch)) { sum=sum*10+ch-'0'; ch=prog[p++]; } p--; syn=11; }
else switch(ch) { case '<': m=0; token[m++] = ch;
3.词法分析程序的算法思想 该算法的基本任务是从字符串表示的源程序中只别处具有独立意义的单 词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出 相应的单词符号。
(1)主程序示意图
置初值 调用扫描子程序 输出单词二元组 输出串结束? 结束 是 否
关键字表为一个字符串数组, 其初值如下: char *rwtab[6] = { “begin”,” if”, “then” ,”while”, “do” ,“end”}; 程序中需要用到的变量为syn ,token, sum
char * rwtab[6]={"begin","if","then","while","do","end"}; int scaner(void); int scaner() {
m=0; sum=0; for( n=0;n<8;n++)
token[n]='\0'; ch=prog[p++]; while(isspace(ch))
15 )
28
/
16 #
0
2.3 词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn 为单词种别码;
token 为存放单词自身的字符; sum 为整型常数。 例如:对源程序 begin x :=9;if x>0 then x := 2*x+1/3; end # 的源文件,经词法分析后 输出如下序列: ( 1,begin)(10,’x’) (18,:=) ( 11,9) (26, ;) (2,if)……