乐趣区

win10环境使用LEX实现词法分析

一、安装配置 Parser Generator

1. 安装 Parser Generator-> 百度云下载地址
2. 安装 vc6.0-> 百度云下载地址
3. 安装完后,先打开 Parser Generator,Project->LibBuilder, 双击 Visual c++(32-bit), 出现如下弹窗:

4.options 里的设置如下:

- Complier Version: Version6
- Unicode: True
- Treat wchar_t as Built-in Type: Fasle
- Complier Bin Directory: vc 安装目录..\MICROSOFT VISUAL STUDIO\VC98\BIN
- Complier Bin Directory(2): vc 安装目录..\MICROSOFT VISUAL STUDIO\COMMON\MSDEV98\BIN
- Complier Include Directory: vc 安装目录..\MICROSOFT VISUAL STUDIO\VC98\INCLUDE
- Complier Include Directory(2): vc 安装目录..\MICROSOFT VISUAL STUDIO\VC98\MFC\INCLUDE
- Complier Library Directory: vc 安装目录..\MICROSOFT VISUAL STUDIO\VC98\LIB
- Complier Library Directory(2): vc 安装目录..\MICROSOFT VISUAL STUDIO\VC98\MFC\LIB

5. 新建项目:Project->ParserWizard,一路下一步,按默认即可




6. 在 mylexer.l 里写如下示例代码:

%{
    #include <stdio.h>
    #include <stdlib.h>
%}
/*difine*/
IF if
THEN then
ELSE else
WHILE while
BEGIN begin
END end
INT [0-9]+
FLOAT {INT}[\.][0-9]+
REAL {FLOAT}([e|E][+|-][0-9]+)
ID    [a-zA-Z]+[0-9a-zA-Z]*
LE [<][=]
GE [>][=]
NE [<][>]
EQ [=]
LT [<]
GT [>]
IS [:][=]
PL [\+]
MI [-]
MU [\*]
DI [\/]
%%
{IF}              {printf("(IF,)\n");}
{THEN}            {printf("(THEN,)\n");}
{ELSE}            {printf("(ELSE,)\n");}
{WHILE}           {printf("(WHILE,)\n");}
{BEGIN}           {printf("(BEGIN,)\n");}
{END}             {printf("(END,)\n");}
{ID}              {printf("(ID,'%s')\n",yytext);}
{REAL}              {printf("(REAL, %g)\n",atof(yytext));}
{FLOAT}              {printf("(REAL, %s)\n",yytext);}    
{INT}             {printf("(INT, %s)\n",yytext);}
{LE}              {printf("(LE,)\n");}
{GE}              {printf("(GE,)\n");}
{NE}              {printf("(NE,)\n");}
{EQ}              {printf("(GQ,)\n");}
{LT}              {printf("(LT,)\n");}
{GT}              {printf("(GT,)\n");}
{IS}              {printf("(IS,)\n");}
{PL}              {printf("(PL,)\n");}
{MI}              {printf("(MI,)\n");}
{MU}              {printf("(MU,)\n");}
{DI}              {printf("(DI,)\n");}
[\t\n]+        ;       /* ignore whitespace */
[!-~]+              {printf("Invalid input: %s\n",yytext); } 
%%

void main()
{yyin=fopen("E:\\example.txt","r");
    yylex();
    fclose(yyin);
    system("PAUSE");
}

// 必须要包含的函数
int yywrap()
{return 1;}

然后 Project->Complie File, 如果为灰色,则先 Rebuild All,稍等片刻, 再 Complie File
编译成功页面如下:

在该工程下会生成 mylexer.c 和 mylexer.h 文件

二、配置 Visual Studio2017

1. 新建 vc++ 空项目,菜单栏项目 -> 属性

2.VC++ 目录:

  • 包含的目录:..\Parser Generator 2\CppInclude
  • 库目录:..\Parser Generator 2\CppLib\msvc32
  • 源目录:..\Parser Generator 2\Cpp\Source

3.C/C++(此选项没有则先写一个 C 的 helloworld 运行一下)

  • 常规 -> 附加包含目录:..\Parser Generator 2\Cpp\Lib
  • 预处理器 -> 预处理器定义:_CRT_SECURE_NO_DEPRECATE
  • 代码生成 -> 运行库:多线程(/MT)



4. 链接器

  • 常规 -> 附加库目录:..\Parser Generator 2\Cpp\Lib\msvc32
  • 输入 -> 附加依赖项:legacy_stdio_definitions.lib;ylmt.lib


5. 将 Parser Generator 生成的.c 和.h 文件加到 VS 的源文件和头文件中

6. 至此,所有的配置已经完成,每次在 Parser Generator 写完 LEX 的程序 Ctrl+F7 编译后在 VS 里运行程序即可

总结

本次配置花费了很多时间才成功,如果有疏漏的地方,欢迎评论区回复。

退出移动版