【编译原理】【C语言】实验二:自动构造词法分析器

您所在的位置:网站首页 编译原理词法分析实验报告C语言 【编译原理】【C语言】实验二:自动构造词法分析器

【编译原理】【C语言】实验二:自动构造词法分析器

2023-09-11 19:06| 来源: 网络整理| 查看: 265

C语言 实验环境:Visual Studio Code、cmd.exe、flex.exe author:zoxiii

词法分析器 1、实验内容2、前期准备2.1 LEX原理2.2 待分析的C语言子集的词法2.3 C语言子集的单词符号表示表2.4 C语言子集对应的状态转换图 3、分析与运行3.1 代码编写3.2 源代码3.3 代码运行 4、遇到的问题

1、实验内容

  利用LEX或FLEX实验词法分析器,并测试输出。

2、前期准备 2.1 LEX原理

  Lex是由美国Bell实验室的M.Lesk和Schmidt于1975年用C语言研制的一个词法分析程序的自动生成工具。对任何高级程序语言,用户必须用正规表达式描述该语言的各个词法类,Lex就可以自动生成该语言的词法分析程序。   Lex及其编译系统的作用如图1所示。 在这里插入图片描述

图1-Lex编译系统

  描述词法分析器的文件*.l,经过lex编译后,生成一个lex.yy.c 的文件,然后由C编译器编译生成一个词法分析器scan。   词法分析器,简单来说,其任务就是将输入的各种符号,转化成相应的标识符(token),转化后的标识符 很容易被后续阶段处理。   Lex源程序文件由如下三部分组成,且每部分之间必须用“%%”分隔开才有效。   其中,辅助定义式和用户子程序是任选的,而识别规则是必需的。

辅助定义式 %% 识别规则 %% 用户子程序 2.2 待分析的C语言子集的词法

  单词大概可分为的5类:标识符、保留字、常数、运算符、界符。

标识符:以字母开头的包含字母和数字的符号保留字:while、if、else、switch、case常数:数字0~9运算符:+、-、*、/、?、printf("(6,%s)\n",yytext);}

(3) 用户子程序   这里主要编写一个主程序,用于运行程序文件,对其进行词法分析。而要能将程序文件加入,就需要参数“argc”和“argv”。

int main(int argc,char** argv) 3.2 源代码 %{ #include #include %} delim [" "\n\t] whitespace {delim}+ WHILE [w][h][i][l][e] IF [i][f] ELSE [e][l][s][e] SWITCH [s][w][i][t][c][h] CASE [c][a][s][e] letter [A-Za-z][A-Za-z0-9]* digit ([0-9])+ ADD [+] DEL [-] MUL [*] DIV [/] QUESTION [?] RELOP [} {WHILE} {printf("(1,%s)\n",yytext);} {IF} {printf("(2,%s)\n",yytext);} {ELSE} {printf("(3,%s)\n",yytext);} {SWITCH} {printf("(4,%s)\n",yytext);} {CASE} {printf("(5,%s)\n",yytext);} {letter} {printf("(6,%s)\n",yytext);} {digit} {printf("(7,%s)\n",yytext);} {ADD} {printf("(8,%s)\n",yytext);} {DEL} {printf("(9,%s)\n",yytext);} {MUL} {printf("(10,%s)\n",yytext);} {DIV} {printf("(11,%s)\n",yytext);} {QUESTION} {printf("(12,%s)\n",yytext);} {RELOP} {printf("(13,%s)\n",yytext);} {EQUAL} {printf("(14,%s)\n",yytext);} {SEMI} {printf("(15,%s)\n",yytext);} %% int yywrap() { return 1; } int main(int argc,char** argv) { if(argc>1) { if(!(yyin=fopen(argv[1],"r"))) { perror(argv[1]); return 1; } } while(yylex()); return 1; } 3.3 代码运行

首先构建运行环境,在网上下载了flex.exe文件,安装并添加路径到环境变量中,然后就可以在cmd.exe中使用了。

打开编写的文件所在路径:cd …… ;编译编写的.l文件生成lex.yy.c文件:flex.exe sy2.l编译c文件生成运行文件:gcc lex.yy.c -o scan运行文件,添加参数为提前编写好的需分析的文档:scan input.txt,文件内容如下 Hello World?; x=8; y=13; if 7


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3