【编译原理】基于鲲鹏平台的词法分析实验

【编译原理】基于鲲鹏平台的词法分析实验,第1张

文章目录
  • 实验目的
  • 实验要求
  • 实验内容
  • 实验环境
  • 实验步骤
  • 实验代码
  • 实验小结


实验目的
  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语言的标识符和整数的功能。
        同时我也懂得了词法分析器的基本原理和类型识别方法.

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1329821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存