实验目的

  1. 培养学生利用软件工程方法分析和设计某语言的词法分析模块,并基于鲲鹏平台选择Flex技术实现词法分析程序。
  2. 训练学生系统分析能力和方案选择与实现能力。

实验要求

1.根据实验内容完成Lex源程序并编译生成词法分析器;
2.分析Lex生成的C语言代码,找出实验所要求功能的代码;
3.使用生成的词法分析器对Sample语言的词法进行分析;
4.完成实验报告。

实验内容

基于校内鲲鹏平台,完成Sample语言的词法分析程序,包括以下两项内容。
(1)编写Lex源程序,其功能是统计文本文件中的字符数和行数。 请你分析Lex生成的C语言代码,找出“统计字符数和行数”的代码。
(2)编写Lex源程序,其功能是输出文本文件中Sample语言的标识符和整数。 并分析生成的C语言代码,找出 “识别标识符和整数”的代码。

实验环境

  1. 校内鲲鹏平台(黄河服务器)、OpenEuler 20.03
  2. flex 2.6.4、gcc 7.3.0、openjdk 17.0.1
  3. 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语言的标识符和整数的功能。
        同时我也懂得了词法分析器的基本原理和类型识别方法.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐