词法分析器实验报告及源代码
编译原理词法分析实验报告
编译原理词法分析实验报告
实验名称:词法分析器的设计与实现
一、实验目的:
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对象。
编译原理 C语言 词法分析 实验 源码
break; } Result.Add(new Token(TokenFunctions.KeywordOrIdentifitor(word.ToString()), row, index, word.Length, word.ToString())); word = new StringBuilder(); index--; break; #endregion
标示符和保留字的词法构成相同为了更好的实现把语言的保留字建立一个表格存储这样可以把保留字的识别放在标示符之后用识别出的标示符对比该表格如果存在该表格中则是保留字否则是一般标示符
词法分析器实验报告
词法分析器实验报告
引言:
词法分析器(Lexical Analyzer)是编译器的重要组成部分,其
主要任务是将源代码转化为一个个独立的词法单元,为语法分析
器提供输入。在本次实验中,我们设计并实现了一个简单的词法
分析器,通过对其功能和性能的测试,评估其在不同场景下的表现。
实验目的:
1. 确定词法分析器的输入和输出要求;
2. 通过构建适当的正则表达式规则,匹配不同类型的词法单元;
3. 实现一个高效的词法分析器,确保在处理大型源代码时性能
不受影响;
4. 对词法分析器的功能和性能进行测试和评估。
实验过程:
1. 设计词法分析器的接口:
1.1 确定输入:源代码字符串。
1.2 确定输出:词法单元流,每个词法单元包含类型和对应的字符串值。
2. 构建正则表达式规则:
2.1 识别关键字:根据编程语言的关键字列表构建正则表达式规则,将关键字与标识符区分开。
2.2 识别标识符:一般由字母、下划线和数字组成,且以字母或下划线开头。
2.3 识别数字:整数和浮点数可以使用不同的规则来识别。
2.4 识别字符串:使用引号(单引号或双引号)包裹的字符序列。
2.5 识别特殊符号:各类操作符、括号、分号等特殊符号需要单独进行规则设计。
3. 实现词法分析器:
3.1 读取源代码字符串:逐个字符读取源代码字符串,并根据正则表达式规则进行匹配。
3.2 保存词法单元:将匹配到的词法单元保存到一个词法单元流中。
3.3 返回词法单元流:将词法单元流返回给调用者。
4. 功能测试:
4.1 编写测试用例:针对不同类型的词法单元编写测试用例,
包括关键字、标识符、数字、字符串和特殊符号。
编译原理实验报告-词法分析
词法分析实验报告
一、实验目的
1.编制一个词法分析程序。
2.加深对词法分析原理的理解。
二、实验要求
1.待分析的简单的词法
(1)关键字:
begin if then while do end
所有的关键字都是小写。
(2)运算符和界符
: = + - * / < <= <> > >= = ; ( ) .
(3)其他单词是标识符(IDENT)和整型常数(NUMBER),通过以下正规式定义:
IDENT = letter (letter | digit)*
NUMBER = digit digit*
(4)空格有空白、制表符和换行符组成。空格一般用来分隔IDENT、NUMBER、运算符、界符和关键字,词法分析阶段通常被忽略。
2.各种单词符号对应的类别值:
表各种单词符号对应的类别码
3.词法分析程序的功能:
输入:所给文法的源程序字符串,以“.”结束。
输出:二元组(sym,token或number)构成的序列。
其中:sym为单词种别码;
token为存放的单词自身字符串;
number为整型常数。
例如:对源程序begin x:=9;if x<10 then x:=(x+10)*2 end.的源文件,经过词法分析后输出如下序列:(17,begin)(1,x)(16,:=)(2,9)(15,;)……
4.词法分析程序的设计
词法分析采用状态转换图方法:
三、实验设计方法
从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
编译原理词法分析实验报告
编译原理词法分析实验报告
实验一词法分析
一、实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。
二、实验内容
(1)功能描述:
该程序是实现一个词法分析器,词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是将单词分为五种的方法。
识别关键字:main、if、int、for、while、do、return、break、continue;
单词种别码为1。
标识符:单词种别码为2。
常数:为无符号整形数;单词种别码为3。
运算符:包括:+、-、*、/、=、>、<、>=、<=、!= ;单词种别码为4。
分隔符:包括:,、;、{、}、(、);单词种别码为5。
(2)程序结构描述:
输入:从控制台输入一段源程序代码,对输入的代码进行词法分析,
处理:分离出关键字、标识符、数值、运算符和界符。
输出:在词法分析结果表中输出每个单词所在行号、类型以及它所对应的编码。其中,编码是自定义的,一种类型对应一个编码。词法分析结
果显示在控制台上。
(3)程序设计思路
1、定义编码表,用ArrayList集合存放单词,如:关键字、运算符、分界符。这三种单词是固定的,标示符和数字这两种单词不存放在集合中。编码表是固定的,只需要初始化一次就够了,所以将集合定义为static类型,使其在类加载时,进行一次初始化。
(完整版)基于LEX的词法分析器实验报告
Lex输入文件由3个部分组成:定义集(definition),规则集(rule)和辅助程序集(auxiliary routine)或用户程序集(user routine)。这三个部分由位于新一行第一列 的双百分号分开,因此,Lex输入文件的格式如下
{definitions}
%%
{rules}
Lex代码
//定义集,包括头文件和变量定义
%{
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int lineno=1;//定义行号
%}
//定义正则表达式letter [A-Za-z]//字母digit[0-9] //数字id ({letter}|[_])({letter}|{digit}|[_])* error_id ({digit})+({letter})+ num {digit}+ whitespace[\t]+ enter [\n]+//定义识别规则
/*increase the word count by one*/}
{whitespace}{ /*do nothing*/}
([0-9])+ {numcount++;/* one maywant to add someprocessinghere*/}
词法分析器实验报告
词法分析器实验报告
词法分析器实验报告
一、引言
词法分析器是编译器中的重要组成部分,它负责将源代码分解成一个个的词法单元,为之后的语法分析提供基础。本实验旨在设计和实现一个简单的词法分析器,以深入理解其工作原理和实现过程。
二、实验目标
本实验的目标是设计和实现一个能够对C语言代码进行词法分析的程序。该程序能够将源代码分解成关键字、标识符、常量、运算符等各种词法单元,并输出其对应的词法类别。
三、实验方法
1. 设计词法规则:根据C语言的词法规则,设计相应的正则表达式来描述各种词法单元的模式。
2. 实现词法分析器:利用编程语言(如Python)实现词法分析器,将源代码作为输入,根据词法规则将其分解成各种词法单元,并输出其类别。
3. 测试和调试:编写测试用例,对词法分析器进行测试和调试,确保其能够正确地识别和输出各种词法单元。
四、实验过程
1. 设计词法规则:根据C语言的词法规则,我们需要设计正则表达式来描述各种词法单元的模式。例如,关键字可以使用'|'操作符将所有关键字列举出来,标识符可以使用[a-zA-Z_][a-zA-Z0-9_]*的模式来匹配,常量可以使用[0-9]+的模式来匹配等等。
2. 实现词法分析器:我们选择使用Python来实现词法分析器。首先,我们需要读取源代码文件,并将其按行分解。然后,针对每一行的代码,我们使用正则表达式进行匹配,以识别各种词法单元。最后,我们将识别出的词法单元输出到一个结果文件中。
3. 测试和调试:我们编写了一系列的测试用例,包括各种不同的C语言代码片段,以测试词法分析器的正确性和鲁棒性。通过逐个测试用例的运行结果,我们可以发现和解决词法分析器中的问题,并进行相应的调试。
实验一词法分析器实验报告示例
词法分析器实验报告
一.需求分析
1.C语言关键字的子集,以文件形式保存,待判断的C语言语句以文件形式保存。
2.关键字文件包括标识符、基本字、常数、运算符和界符以及相应的种别码。
3.在计算机终端顺次输出各词法单位的种别码和值。若为标识符,其值为该标识符在
标识符表中的位置;若为常数,其值为该常数在常数表中的位置;其余值为-1。
非法输入单词的种别码为-1,值为-2。
4.“单词”定义:C语言中最小的语法单位。
“标识符”定义:用户自定义的标志符。
5.测试数据:文本文件为unknowedword.text
二.概要设计
1.单词种别码设计如表一所示:
2.单词规划的状态图:
A标识符及关键字如图一所示:
图一.标识符状态转换图
B实数如图二所示:
图二.实数状态转换图
C
图三.运算符状态转换图
D其它与运算符雷同,此处略
3. 数据结构
know[N] 用来存放构成单词符号的字符串;
unknow[N]用来存放待辨别的字符串;
chartab[T][N] 用来存放识别出的标识符;
keytab[M][N] 用来存放从文件中读入的基本字;
consttab[T] 用来存放识别出的实数。
以上均设为全局变量。
4.基本操作
Getchar()
初始条件:unknow中读入了一串待辨别的字符串。
操作结果:从unknow读入一个字符到ch中,指向unknow的指针加1。
Getbc()
初始条件:unknow中读入了一串待辨别的字符串。
操作结果:从unknow中读入不是空格的下一个字符。
Concat()
初始条件:know中为字母且ch中为字母,或know中为数字(包括小数点)ch中也为数字。
词法分析器的实验报告
词法分析器的实验报告
词法分析器的实验报告
引言:
词法分析器是编译原理中的重要组成部分,它负责将源代码中的字符序列转换
为有意义的词法单元,为后续的语法分析提供基础。本实验旨在设计和实现一
个简单的词法分析器,并对其进行测试和评估。
实验设计:
1. 词法规则设计:
在开始实验之前,我们首先需要设计词法规则,即定义源代码中的合法词法单元。例如,对于一门类C的语言,我们可以定义关键字(如if、while、int等)、标识符、运算符(如+、-、*等)、分隔符(如()、{}等)等。
2. 有限自动机(DFA)的设计:
基于词法规则,我们可以设计一个有限自动机,用于识别和分析源代码中的词
法单元。有限自动机是一个状态转换图,其中每个状态代表一种词法单元,而
边表示输入字符的转换关系。
3. 实现代码:
根据有限自动机的设计,我们可以使用编程语言(如Python、C++等)实现词
法分析器的代码。代码的主要功能包括读取源代码文件、逐个字符进行词法分析、识别和输出词法单元。
实验过程:
1. 词法规则设计:
我们以一门简单的算术表达式语言为例,设计了以下词法规则:
- 数字:由0-9组成的整数或浮点数。
- 运算符:包括+、-、*、/等。
- 分隔符:包括括号()和逗号,。
- 标识符:以字母开头,由字母和数字组成的字符串。
2. 有限自动机(DFA)的设计:
我们基于词法规则,设计了一个简单的有限自动机。该自动机包含以下状态:- 初始状态:用于读取和识别源代码中的字符。
- 数字状态:用于识别和输出数字。
- 运算符状态:用于识别和输出运算符。
计算机编译原理实验报告
编译原理实验报告
实验一词法分析设计
一、实验功能:
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)则费了一番功夫,最后对于常数的小数点问题处理更是麻烦。另外,这个实验要设定好时候退格,否则将会导致字符漏读甚至造成字符重复读取。
实验一识别无符号数的词法分析器设计实现
实验一识别无符号数的词法分析器设计实现
学院:计算机学院班级:学号:
一、实验目的与要求
通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将其分解成各类单词的词法分析方法。
二、实验内容
选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。
输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。
输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。
3 (对应-)
1 (对应100)
三、程序源代码:
#include<iostream>
using namespace std;
#define M 101 //最多可输入的字符数
#define UNSIGNEDNUMBER 1 //无符号数
#define PLUS 2 //加号
#define SUBTRACT 3 //减号
#define MULTIPLY 4 //乘号
#define DIVIDE 5 //除号
#define LEFTBRACKET 6 //左括号
#define RIGHTBRACKET 7 //右括号
class AccidenceAnalysis //定义词法分析器类
{
private:
char testStr[M],*p; //私有数据
public:
AccidenceAnalysis(); //构造函数
void InputStr(); //输入函数
void Output(int a,char *p1,char *p2); //输出函数
编译原理实验报告——词法分析器(内含源代码)
编译原理实验(一)——词法分析器
一.实验描述
运行环境: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进入一个非空白字符。
实验一、词法分析器(含源代码)
词法分析器实验报告
实验目的及要求
本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。
运行环境:
硬件:windows xp
软件:visual c++
二、实验步骤
查询资料,了解词法分析器的工作过程与原理。
分析题目,整理出基本设计思路。
实践编码,将设计思想转换用c语言编码实现,编译运行。
4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。
实验内容
本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的
关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。
对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。
输出形式例如:void $关键字
流程图、程序
流程图:
程序:
#include<>
#include<>
编译原理 词法分析器 实验报告
词法分析器实验报告
实验目的:
设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。
功能描述:
该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error!”,然后跳过错误部分继续进行)
设计思想:
设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表,然后,每输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循环,最后根据所在的接受状态以及保留字表识别单词。
①标识符及保留字:
②number:
③关系操作符:
digit
digit
digit
E
digit
other
other
letter or
④
⑤算术运算符:
(<=, 2) * (<>, 2)
(<,2)
(>=, 2)
(>, 2)
(:=,2)
使用环境:
Windows xp下的visual c++6.0 程序测试:
input1 :
int a,b;
a=b+2;
input2:
while(a>=0)
do
7x=x+6.7E+23;
end;
input3:
begin:
x:=9
if x>0 then x:=x+1;
while a:=0 do
b:=2*x/3,c:=a;
end;
output1: 3,int 3,a 5,,
3,b 5,;
3,a
2,=
3,b
2,+
4,2 5,; output2:
1,while
5,(
编译原理上机实验报告
编译原理上机实验报告
一、实验目的
本次实验旨在通过实践的方式理解和掌握编译原理中的一些重要概念
和技术,包括词法分析、语法分析和语义分析等。通过实验的操作,了解
和体验编译器的工作过程,深入理解编译原理的相关理论知识。
二、实验环境
本次实验使用了Java语言作为编程语言,使用Eclipse作为开发环境,实验所需的相关工具和库已经提前配置完成。
三、实验内容
本次实验主要分为三个部分,分别是词法分析、语法分析和语义分析。
1.词法分析
词法分析是编译器的第一个阶段,也是最基础的阶段。在本次实验中,我们首先需要实现一个词法分析器,该分析器可以将源代码分割成一个个
的词法单元,将其存储到一个词法单元表中。
我们首先需要定义一些词法单元的模式,比如关键字、标识符、常量等。然后,我们使用正则表达式和有限自动机的思想来实现一个可以识别
各种模式的词法分析器。
2.语法分析
语法分析是编译器的第二个阶段,其目的是将词法单元表中的内容按
照语法规则进行分析,生成一个语法树。
在本次实验中,我们需要实现一个递归下降的语法分析器。我们首先
需要定义一些语法规则,然后根据这些规则逐条实现相应的语法分析函数。最终,我们可以通过递归调用这些函数,将源代码转换成语法树的形式。
3.语义分析
语义分析是编译器的第三个阶段,其目的是对语法树进行进一步的检
查和处理。在本次实验中,我们需要实现一个简单的语义分析器。
我们可以在语法分析的基础上,增加一些语义规则,然后对生成的语
法树进行检查。比如,我们可以检查变量的定义和使用是否一致,是否存
在未定义的变量等。最终,我们可以通过语义分析器发现和纠正一些潜在
词法分析实验报告及完整代码和运行结果
编译原理实验报告实验一词法分析
班级:软件五班
学号:
姓名:
任课教师:邢
计算机科学与工程系
2016年6 月10 日
一、实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
二、实验要求
l、待分析的简单语言的词法
(1) 关键字:begin if then while do end 所有的关键字都是小写。
(2) 运算符和界符::=+ - * / < <=<> > >==;( ) #
(3) 其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM = digit digit*
(4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。
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)…
4、至少应有3个实例,其中应有一个错误的实例。遇到词法分析错误时,应能及时报错,并继续分析,直到源程序结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学与软件科学学院实验报告
学期:13至14__ 第_2 学期 2014年3月17 日
课程名称:编译原理专业:2011级5_班
实验编号:01 实验项目:词法分析器指导教师_王开端
姓名:张世镪学号: 2011060566 实验成绩:
一、目的
学习编译原理,词法分析是编译的第一个阶段,其任务是从左至右挨个字符地对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成单词符号串形式的中间程序。执行词法分析的程序称为词法分析程序,也称为词法分析器或扫描器。词法分析器的功能是输入源程序,输出单词符号
做一个关于C的词法分析器,C++实现
二、任务及要求
1.词法分析器产生下述C的单词序列
这个C的所有的单词符号,以及它们的种别编码和内部值如下表:
-* / & <<=>>===!= && || , : ; { } [ ] ( )
ID和NUM的正规定义式为:
ID→letter(letter | didit)*
NUM→digit digit*
letter→a | … | z | A | … | Z
digit→ 0 | … | 9
如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。空格由空白、制表符和换行符组成。
三、大概设计
1. 设计原理
词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。
理论基础:有限自动机、正规文法、正规式
词法分析器又称扫描器:执行词法分析的程序
2. 词法分析器的功能和输出形式
功能:输入源程序、输出单词符号
程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符、界符。3. 输出的单词符号的表示形式:
(单词种别,单词符号的属性值) 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。
4. 状态转换图实现
三、程序设计
1. 词法分析器的流程图
2. 总体模块设计
/*用来存储目标文件名*/ string file_name;
/*提取文本文件中的信息。*/
string GetText();
/*获得一个单词符号,从位置i开始查找。
//并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。*/
string GetWord(string str,int i,int& j);
/*这个函数用来除去字符串中连续的空格和换行
int DeleteNull(string str,int i);
/*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/
bool IsBoundary(string str,int i);
/*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/
bool IsOperation(string str,int i);
/*此函数将一个pair数组输出到一个文件中*/
void OutFile(vector
/*此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组*/
vector
/*此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假*/
bool IsKey(string str);
4. 各模块设计
1.首先根据上面单词符号表及ID和NUM的正规定义式,构造出状态转换图;
2.定义相关的变量和数据结构。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:
char KEY_WORDS[7]={″main″,″int″,″char″,″if″,″else″,″for″,″while″};
用以存放单词符号二元式的数据结构可如下定义:
class Word_Analyzer
{
public:
char Content[MAXLENGTH] ;
int val ;
void print();
} ;
5.按照编译程序一遍扫描的要求,把词法分析器Scaner作为一个独立的子程序来设计,通过对Scaner的反复调用识别出所有的单词符号;
6.当Scaner识别出一个单词符号时,则将该单词符号的二元式写入到输出文件中。若Scaner 无法识别出一个单词符号时,则调用错误处理程序PrintError,显示当前扫描到的字符及其所在行、列位置,并跳过该字符重新开始识别单词符号。
四、程序测试
测试该设计词法分析器,可对下面的源程序进行词法分析:
main()
{
int i = 10;
while(i) i = i - 1;
}
输出如下二元式代码序列:
(1,main) (26,() (27,)) (30,{) (2,int) (10,i) (21,=) (20,10) (34,;) (7,while) (26,() (10,i) (27,)) (10,i) (21, =) (10,i) (23,-) (20,1) (34,;) (31,})
五、结论
该词法分析器功能良好,可以完成预定的要求。
六、程序代码
#include
#include
#include
/*提取文本文件中的信息。*/ string GetText();