【编译原理】基于鲲鹏平台的词法分析实验
1.根据实验内容完成Lex源程序并编译生成词法分析器;2.分析Lex生成的C语言代码,找出实验所要求功能的代码;3.使用生成的词法分析器对Sample语言的词法进行分析;4.完成实验报告。
实验目的
- 培养学生利用软件工程方法分析和设计某语言的词法分析模块,并基于鲲鹏平台选择Flex技术实现词法分析程序。
- 训练学生系统分析能力和方案选择与实现能力。
实验要求
1.根据实验内容完成Lex源程序并编译生成词法分析器;
2.分析Lex生成的C语言代码,找出实验所要求功能的代码;
3.使用生成的词法分析器对Sample语言的词法进行分析;
4.完成实验报告。
实验内容
基于校内鲲鹏平台,完成Sample语言的词法分析程序,包括以下两项内容。
(1)编写Lex源程序,其功能是统计文本文件中的字符数和行数。 请你分析Lex生成的C语言代码,找出“统计字符数和行数”的代码。
(2)编写Lex源程序,其功能是输出文本文件中Sample语言的标识符和整数。 并分析生成的C语言代码,找出 “识别标识符和整数”的代码。
实验环境
- 校内鲲鹏平台(黄河服务器)、OpenEuler 20.03
- flex 2.6.4、gcc 7.3.0、openjdk 17.0.1
- SSH远程登录工具(如MobaXterm等)
实验步骤
实验一:
1.编译lex源码: 上传文件使用flex编译lex1.l:flex lex_1.l
2.编译生成的c源码: 使用gcc 编译 lex1.c:gcc lex1.c
3.运行生成的词法分析器: 运行lex1.out,统计文件字符数。其中,1.txt是自己创建的包含若干行的文本文档。
实验二:
4.编译lex源码: 上传文件使用flex编译lex2.l:flex lex_2.l
5.编译生成的c源码: 使用gcc 编译 lex2.c:gcc lex2.c
6.运行生成的词法分析器: 运行lex2.out,统计文件字符数。其中,1.txt是自己创建的包含若干行的文本文档。
实验代码
1.1编译lex源码: 上传文件使用flex编译lex1.l
flex -o lex1.c lex_1.l
截图:
1.2编译生成的c源码: 使用gcc 编译 lex1.c
gcc lex1.c -o lex1.out
截图:
1.3运行生成的词法分析器: 运行lex1.out,统计文件字符数。
其中,1.txt是自己创建的包含若干行的文本文档。
./lex1.out < 1.txt
截图:
1.4 查看lex_1.c找出“统计字符数和行数”的代码
cat lex_1.c
vim lex_1.c
int main()
{
yylex();
printf("this file has %5d chars, %5d lines\n",num_chars,num_lines);
return 0;
}
switch ( yy_act )
{
/* beginning of action switch */
case 0: /* must back up */
/* undo the effects of YY_DO_BEFORE_ACTION */
*yy_cp = (yy_hold_char);
yy_cp = (yy_last_accepting_cpos);
yy_current_state = (yy_last_accepting_state);
goto yy_find_action;
case 1:
/* rule 1 can match eol */
YY_RULE_SETUP
#line 7 "lex_1.l"
{++num_chars; ++num_lines;}
YY_BREAK
case 2:
YY_RULE_SETUP
#line 8 "lex_1.l"
{++num_chars;}
YY_BREAK
case 3:
YY_RULE_SETUP
#line 9 "lex_1.l"
ECHO;
YY_BREAK
#line 738 "lex1.c"
case YY_STATE_EOF(INITIAL):
yyterminate();
2.1编译lex源码
flex -o lex2.c lex_2.l
截图:
2.2编译生成的c源码
gcc lex2.c -o lex2.out
截图:
2.3输出结果
./lex2.out < 1.txt
截图:
2.4查看lex2.c找出 “识别标识符和整数”的代码
vim lex2.c
cat lex2.c
int main(int argc, char **argv)
{
if (argc > 1) {
if (!(yyin = fopen(argv[1], "r"))) {
perror(argv[1]);
return 1;
}
}
while (yylex());
return 0;
}
实验小结
通过本次实验.我对于lex源程序的在计算机运行的底层执行过程有了深刻了解.记录为.文件,需要通过flex编译为.c文件给c语言程序解析.gcc将.c编译为可执行文件.
通过编写编写Lex源程序,实现统计文本文件中的字符数和行数的功能。 通过编写Lex源程序,实现输出文本文件中Sample语言的标识符和整数的功能。
同时我也懂得了词法分析器的基本原理和类型识别方法.
更多推荐
所有评论(0)