词法分析器C++实现
- 格式:docx
- 大小:17.01 KB
- 文档页数:5
词法分析器实验报告实验名称: 编写词法分析器实验类型: 验证型实验指导教师:专业班级:姓名:学号:电子邮件:实验地点:实验成绩:日期: 2012 年3 月 22 日目录一、实验目的。
2 二、实验过程。
21、背景知识。
22、程序总体设计。
23、各种类型表。
4、程序流程图。
5 4三、试验结果。
5 四、讨论与分析。
6 五、附录。
7 六、试验者自评。
131一、实验目的通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。
掌握文法转换成自动机的技术及有穷自动机实现的方法。
确定词法分析器的输出形式及标识符与关键字的区分方法。
加深对课堂教学的理解;提高词法分析方法的实践能力。
通过本实验,掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法以及掌握词法分析的实现方法,并可以成功的上机调试编出的词法分析程序。
二、实验过程我们在设计词法分析器时,应该首先对词法分析器相关的背景知识有足够的了解以及熟练的掌握。
从而在脑海里形成词法分析的一般方案,根据方案一步步所要实现的目的,形成对词法分析器程序的模块划分和整体规划。
1、背景知识词法分析是作为相对独立的阶段来完成的(对源程序或中间结果从头到尾扫描一次,并作相应的加工处理,生成新的中间结果或目标程序)。
在词法分析过程中,编译程序是通过操作系统从外部介质中读取源程序文件中的各个字符的。
同时,为正确地识别单词,有时还需进行超前搜索和回退字符等操作。
因此,为了提高读盘效率和便于扫描器进行工作,通常可采用缓冲输入的方案,即在内存中设置一个适当大小的输入缓冲区,让操作系统直接将磁盘上的源程序字符串分批送入此缓冲区中,供扫描器进行处理。
程序总体设计 2、主程序的说明部分为各种表格和变量安排空间。
二维数组k:关键字表,采用定长的方式,较短的关键字后面补空格。
一维数组p:分界符表。
一维数组s: 运算符表。
二维数组id:存放标识符,在程序运行中,产生标示符表二维数组ci:存放常数。
词法分析器实验报告引言:词法分析器(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 编写测试用例:针对不同类型的词法单元编写测试用例,包括关键字、标识符、数字、字符串和特殊符号。
4.2 执行测试用例:将测试用例作为输入传递给词法分析器,并检查输出是否和预期一致。
4.3 处理错误情况:测试词法分析器对于错误输入的处理情况,如非法字符等。
5. 性能测试:5.1 构建大型源代码文件:生成包含大量代码行数的源代码文件。
5.2 执行词法分析:使用大型源代码文件作为输入,测试词法分析器的性能。
课程设计1 基于Flex的词法分析器设计及实现1.1 需求分析1.1.1 问题定义1、通过对 flex 基本知识的阅读,了解其工作原理和过程以及其匹配模式和规则,掌握简单的 lex 语法和规则;2、在上述基础上能够自主编写出简单且可以运行的词法分析器,实现简单的词法分析功能;3、通过实验,设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
1.1.2 功能描述本次编制调试的词法分析器基本可以实现如下简单功能:1、可以匹配识别关键字:else if switch for int float return void while (所有的关键字都是保留字,并且必须是小写);2、可以匹配识别专用符号: + - * / < <= > >= == != = ; ,( ) [ ] { } /* */;3、标识符(ID)和数字(NU )通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9;4、可以匹配识别空格(空格由空白、换行符和制表符组成,空格通常被忽略,除了它必须分开 ID、NUM 关键字);5、可以识别简单的注释(/* 注释内容*/);1.1.3 开发环境及工具介绍1、Window环境下载Visual Studio之后,利用其命令提示窗口进行操作。
下载并安装Flex。
2、vs2010的编译器cl.exe。
3、flex:词法分析器Flex是用来生成程序的工具,他们所生成的程序能够处理结构化输入,最初的Flex是用来生成编译器的,但是后来他们被证明在其他领域也非常有效。
Flex是一个SourceForge项目。
其依赖于GNU m4宏处理器。
Linux和BSD都应该有m4,对于Windos用户来说,Flex被包含在Cygein Linux模拟环境中。
字符集类,头文件,若不需要去掉红字
#ifndef _WORDMAP_H
#define _WORDMAP_H
#include
class word{
public:
int ID;
string content;
word (){ID = 0; }
void set(intid,string con){
ID = id;
content =con;
}
friendostream& operator<<(ostream&out,word temp);
};
//简单的重载流操作运算符
ostream& operator<<(ostream&out,word temp){
out<<'('<
}
//识别类用于读写字符
class Recognize{
private:
intmapsize;
map
int model;//处在第几处理模式
char TempCan;//作为读入字符的缓冲区
public:
Recognize(){
model=0;
TempCan=' ';
freshmap();
}
voidfreshmap();
word read(istream& input );
int Model(char ch);
};
void Recognize::freshmap()//初始化 map中的变量对应
{
MyMap["for"]=1;
MyMap["if"]=2;
MyMap["then"]=3;
MyMap["else"]=4;
MyMap["while"]=5;
MyMap["+"]=6;
MyMap["-"]=7;
MyMap["*"]=8;
MyMap["/"]=9;
MyMap["="]=10;
MyMap[">"]=11;
MyMap["<"]=12;
MyMap["("]=13;
MyMap[")"]=14;
MyMap[";"]=15;
MyMap["num"]=16;
MyMap["#"]=0;
mapsize=16;
}
word Recognize::read( istream& input )//读字符函数从流中
{
word New;
string s;
model = 0;
while(' '==TempCan||'\n'==TempCan) input.get(TempCan);
model=Model(TempCan);
//读一个单元,然后直接拿去匹配结果直接写入 new
switch(model){
case 1://数字处理
s=s+TempCan;
input.get(TempCan);
while (1==Model(TempCan))
{
s=s+TempCan;
input.get(TempCan);
}
break;
case 2://关键字或者变量
s=s+TempCan;
input.get(TempCan);
while (2==Model(TempCan))
{
s=s+TempCan;
input.get(TempCan);
}
break;
case 3://处理操作符
s=s+TempCan;
input.get(TempCan);
break;
case 5://结束
s=s+TempCan;
break;
}
pair
if (model==1)
{
New.set(16,s);
}
else if (MyMap.insert(mm).second)
{
mapsize++;
New.set(MyMap[s],s);
}
elseNew.set(MyMap[s],s);
return New;
}
int Recognize::Model( char ch )//模式判断函数从缓冲中看目前处于第几读取模式
{
int n;
switch (ch)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
n = 1;//说明接下来处理的是数字
break;
case '+':
case '-':
case '*':
case '=':
case '<':
case '>':
case ';':
case '(':
case ')':
n = 3;//处理操作符
break;
case '#':
n = 5;//文件结束
break;
default:
n = 2;//处理变量或关键字
//case '\n':
//case ' ':
// model = 3;
// break;
//case '#':
}
return n;
}
#endif
Main函数 p=test.read(cin);
#include
#include
#include "WordMap.h"
using namespace std;
void main(){
Recognize test;
word p;
p=test.read(cin);
while(p.ID){
cout<
}
}