院系:计算机学院
实验课程:编译原理
实验项目:C++源代码单词扫描程序(词法分析)指导老师:陈寅
开课时间:2014~2015年度第1学期
专业:数据库
班级:2班
学生:雷楚楚
学号:20122100158
C++源代码单词扫描程序(词法分析)
一、实验目的
设计并实现一个词法分析器,深刻理解编译原理中词法分析器的原理。
二、实验内容
1、C++源代码扫描程序识别C++记号。C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串,注释,特殊符号(分解符)和运算符号等。
2、打开一个C++源文件,打印出所有以上的记号。
3、选作部分:为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。假设你想牺牲可读性,以节省磁盘空间,那么你可以存贮一个删除了所有不必要空格和注释的C++源程序的压缩文本。因此,程序中还
看可以有这样的压缩功能。
4、进一步实现减少源文件大小的压缩功能。
5、完善软件文档。
二、实验过程
1、对C++文法中的各类单词分类
(1)保留字:asm、do、if、return、typedef、auto、double、inline、short、typeid、bool、try、include、long、sizeof、union、case、enum、mutable、static、unsigned、long、sizeof、union、case、enum、mutable、static、unsigned、catch、explicit、namespace、using、char、export、int、signed、break、else、new、struct、virtual、class、extern、operator、switch、void、const、false、private、template、volatile、float、protected、this、continue、for、public、throw、while、default、friend、register、true、delete、goto、try、include、std、iomanip、setw、setprecision、endl、setiosflags、ios (2)数字:包括整数和浮点数
(3)标识符:由字母打头的字母和数字的字符串,可包含下划线
(4)运算符:"&="、"^="、"、="、"<<="、">>="、"*="、"/="、"%="、"+="、"-="、"="、"?:"、"、、"、"&&"、"、"、"^"、
"&"、"=="、"!="、">"、">="、"<"、"<="、"<<"、">>"、"+"、"-"、"*"、"/"、"%"、".*"、"->*"、"&"、"+"、"-"、"++"、"--"、"->"、"::"
(5)界符:"{"、"}"、"("、")"、"#"、","、":"、";"、"."、"\""
(6)注释:包括//和/**/两种类型的注释
(7)字符串:包含在“”里面的内容
2、将各类单词对应到Flex中:
(1)保留字:
asm|do|if|return|typedef|auto|double|inline|short|typeid|bool|t
ry|include|long|sizeof|union|case|enum|mutable|static|unsigned|
long|sizeof|union|case|enum|mutable|static|unsigned|catch|expli
cit|namespace|using|char|export|int|signed|break|else|new|struc
t|virtual|class|extern|operator|switch|void|const|false|private
|template|volatile|float|protected|this|continue|for|public|thr
ow|while|default|friend|register|true|delete|goto|try|include|s
td|iomanip|setw|setprecision|endl|setiosflags|ios
(2)数字:包括整数和浮点数(正负)
[+-]?([0-9]*|0|([0-9]*\.[0-9]*))
(3)标识符:由字母打头的字母和数字的字符串,包含下划线
[A-Za-z]([A-Za-z]|[0-9]|_)*
(4)运算符:
"&="|"^="|"|="|"<<="|">>="|"*="|"/="|"%="|"+="|"-="|"="|"?:"|"|
|"|"&&"|"|"|"^"|"&"|"=="|"!="|">"|">="|"<"|"<="|"<<"|">>"|"+"|"
-"|"*"|"/"|"%"|".*"|"->*"|"&"|"+"|"-"|"++"|"--"|"->"|"::"
(5)界符:
"{"|"}"|"("|")"|"#"|","|":"|";"|"."|"\""
(6)注释:包括//和/**/两种类型的注释正则匹配到第一个关键字就停止
\/\*(\s|.)*?\*\/(/**/)
\/\/[^\n]*(//)
(7)字符串:包含在“”里面的内容
'[^'\n]*'|\"[^\"]*\"
(8)除其他情况之外判断为出错
3、跳过空行和空格
[\t]+{}/*空格*/ \n|.{}/*空行*/
4、为lex制定一些规则
5、写子程序
让用户输入要进行词法扫描的文件,当lex读完输入文件之后就会调用函数yywrap。如果返回1表示程序的工作已经完成了,否则,返回0。
五、运行结果
1、将源代码存储为c.l,然后用flex进行编译,编译后生成文件。具体在Linux上的命令如下:
2、输入测试文件:test.in如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。