编译原理-词法分析器1(lex实现)

编译原理课实验一是词法分析器,但是在网上查了很多资料,发现用lex实现还要用Linux,Windows可以用对应的flex实现,但是网上的资料很零散,所以整理了一下从安装到配置,到实现一个词法分析器的过程

一、 安装

  1. 下载flex和bison
    UnxUtils: http://pan.baidu.com/s/1o6NY1E6
    Updates:http://pan.baidu.com/s/1o6NY1E6
    保存在E:\lex\cywin
  2. 使用的flex和bison都是GNU的工具,GCC既采用C/C++的编译器也采用GNU的编译器,Windows平台的GCC主要是MinGW编译器,下载地址:
    https://sourceforge.net/projects/mingw/files/Installer/mingw-get/catalogue/msys-package-list.xml.lzma/download
    或者
    http://www.mingw-w64.org/doku.php
    保存在E:\lex\GnuWin32
  3. 下载Parser Generator
    http://www.bumblebeesoftware.com/downloads.htm
    二、 配置环境变量
    下载UnxUtils以及UnxUpdates之后,解压到自己的文件夹,把/usr/local/wbin文件夹的绝对地址加到
    我的电脑(右键)->属性->高级->环境变量->系统变量->path值
    三、 安装MinGW
  4. 安装过程简图
    点击mingw-get-setup.exe

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 打开安装好的软件,选Basic Setup,在右侧选择mingw32-gcc-g++,鼠标右键点击Mark for Installation,然后点击左上角的Installation按钮,选择Apply Changes,弹出对话框点击Apply,安装对应的编辑器
  2. 设置环境变量
    进入MinGW的安装路径E:\lex\GnuWin32,将bin的绝对路径添加到path中(E:\lex\GnuWin32\bin)
    我的电脑(右键)->属性->高级->环境变量->系统变量->path值
  3. 检查安装完成
    打开cmd,输入gcc -v,显示如下即为安装成功
    在这里插入图片描述
    四、 Parser Generator的配置
  4. 打开Parser Generator
  5. 菜单project->LibBuilder选第一个

在这里插入图片描述
在这里插入图片描述
3. 配置好后点击built
在这里插入图片描述
4. 建立一个project
<1>project->ParserWizard
<2>工程设定(语言可选C/C++/JAVA)
<3>工程设定(是否带main函数的YACC文件或LEX文件)
<4>YACC文件设定
<5>LEX文件设定
<6>编辑好代码后project->Rebuild All
上图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、 配置VC6.0

  1. 打开cmd,一直到1.l存在的文件夹的目录下
    在这里插入图片描述
  2. Flex 1.l,此时再打开1.l的文件夹会发现出现lex.yy.c文件
    在这里插入图片描述
  3. 那么现在开始配置VC,首先导入Parser Generator的库文件和源文件
    Tools->Options,设置Iuclude files,library files,Source files

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4. project->Settings
Win32 Debug
C/C++ -> preprocessor definitions添加宏定义,YYDEBUG
Link -> Object/Library Modules 加yld,lib
Win32 Release
Link -> Object/Library Modules 加yld,lib

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 将lex.yy.c添加到Source Files
    将1.h添加到Header Files
    在这里插入图片描述
  2. 编译运行就OK啦
  3. 或者在DOS下运行
    在这里插入图片描述
相关推荐
实验二 词法分析器 一、实验目的 掌握词法分析器的构造原理,掌握手工编程或LEX编程方法之一。 二、实验内容 编写一个LEX源程序,使之生成一个词法分析器,能够输入的源程序转换为单词序列输出。 三、实验环境 Flex+VC6.0 四、实验注意 1.Id正则表达式:{letter}({letter}|{digit})* 2.Num正则表达式:{digit}+(\.{digit}+)?(E[+-]?{digit}+)? 3.注释:(\/\*(.)*\*\/) 4.关键字再加上其他字符就又能编程id,所以在词法分析时,id的判断应该放在关键字前面,这样才不会误判 5.由于本程序知识简单的打印数字,因此没有考虑数字的转换 6.">="比">"多一个字符,它应该放在前面判断,其他类似的也应该如此安排 五、实验代码 ******************************************************************************* 实验文件:lex.l、lex.yy.c 实验结果:lex.exe 运行方式:打开lex.exe,弹出input.txt,在其中输入所要测试的程序,保存并关闭,即可在output.txt中看到所得结果 ******************************************************************************* %{ void Install(char *type); %} %option noyywrap delim [ \t] newline [\n] digit [0-9] num {digit}+(\.{digit}+)?(E[+-]?{digit}+)? letter [A-Za-z] id {letter}({letter}|{digit})* key ("if"|"while"|"do"|"break"|"true") basic ("int"|"float"|"bool"|"char") op (">="|""|"<"|"="|"!="|"+"|"-"|"*"|"/") comment (\/\*(.)*\*\/) %% delim {;} newline {printf("\n");} {num} {Install("Num");} {key} {Install("Key");} {basic} {Install("Basic");} {op} {Install("Op");} ";" {Install("Comma");} {id} {Install("ID");} {comment} {Install("Comment");} "(" | "[" | "{" {Install("lbracket");} ")" | "]" | "}" {Install("rbracket");} %% void Install(char *s) { fprintf(yyout, "%s:%s ", s, yytext); } int main() { printf("please input the test program in input.txt\n"); system("input.txt"); yyin = fopen("input.txt", "r"); yyout = fopen("output.txt", "w" ); yylex(); fclose(yyout); fclose(yyin); printf("analysis result in output.txt\n"); system("output.txt"); return 0; } 六、实验小结 本次的实验由于使用了flex,所以代码较短,麻烦的事flex的正则式表达,由于该使用规则只有简单介绍,而网上找的教程难免有比重就轻之嫌,所以得到上述表达式着实费力,且有的没有成功,例如bracket的(\ ((.)*\ ))或者("("(.)*")")使用时都没有成功,所以便单独写出,有点不伦不类。至于其他的,都较为简单,完。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页