Windows中使用Lex(Win flex-bison)

这篇具有很好参考价值的文章主要介绍了Windows中使用Lex(Win flex-bison)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Lex是Lexical Analyzer Generator(取前三个字母)的缩写,是Unix环境下非常著名的工具,主要功能是生成一个词法分析器(scanner)的C源码,描述规则采用正则表达式(regular expression)

Lex已经广泛地用于描述各种语言的词法分析器

flex (the fast lexical analyser)意思是快速词法分析器

Win-flex bison是flex和bison在Windows平台的一个移植版本,它支持flex(快速词法分析器)和bison(GNU解析器生成器)。

Win-flex bison的下载网址: Win flex-bison download | SourceForge.net 

Windows中使用Lex(Win flex-bison)

点击“Download”按钮,开始下载文件“win_flex_bison-latest.zip”,文件大小仅有692KB。

Windows中使用Lex(Win flex-bison) 

解压到自己喜欢的位置。

Windows中使用Lex(Win flex-bison) 

你可以在命令行直接使用win_flex和win_bison,或者在Visual Studio中借助CustomBuildRules使用它们(详见 Win flex-bison / Wiki / Visual Studio custom build rules )

flex/bison文件的例子可参看网页 Win flex-bison - Browse Files at SourceForge.net 

在命令行输入 win_flex --help ,可以获得相关用法:

Usage: win_flex [OPTIONS] [FILE]...

Generates programs that perform pattern-matching on text.

Table Compression:

  -Ca, --align      trade off larger tables for better memory alignment

  -Ce, --ecs        construct equivalence classes

  -Cf               do not compress tables; use -f representation

  -CF               do not compress tables; use -F representation

  -Cm, --meta-ecs   construct meta-equivalence classes

  -Cr, --read       use read() instead of stdio for scanner input

  -f, --full        generate fast, large scanner. Same as -Cfr

  -F, --fast        use alternate table representation. Same as -CFr

  -Cem              default compression (same as --ecs --meta-ecs)

Debugging:

  -d, --debug             enable debug mode in scanner

  -b, --backup            write backing-up information to lex.backup

  -p, --perf-report       write performance report to stderr

  -s, --nodefault         suppress default rule to ECHO unmatched text

  -T, --trace             win_flex should run in trace mode

  -w, --nowarn            do not generate warnings

  -v, --verbose           write summary of scanner statistics to stdout

      --hex               use hexadecimal numbers instead of octal in debug outputs

Files:

  -o, --outfile=FILE      specify output filename

  -S, --skel=FILE         specify skeleton file

  -t, --stdout            write scanner on stdout instead of lex.yy.c

      --yyclass=NAME      name of C++ class

      --header-file=FILE   create a C header file in addition to the scanner

      --tables-file[=FILE] write tables to FILE

Scanner behavior:

  -7, --7bit              generate 7-bit scanner

  -8, --8bit              generate 8-bit scanner

  -B, --batch             generate batch scanner (opposite of -I)

  -i, --case-insensitive  ignore case in patterns

  -l, --lex-compat        maximal compatibility with original lex

  -X, --posix-compat      maximal compatibility with POSIX lex

  -I, --interactive       generate interactive scanner (opposite of -B)

      --yylineno          track line count in yylineno

Generated code:

  -+,  --c++               generate C++ scanner class

  -Dmacro[=defn]           #define macro defn  (default defn is '1')

  -L,  --noline            suppress #line directives in scanner

  -P,  --prefix=STRING     use STRING as prefix instead of "yy"

  -R,  --reentrant         generate a reentrant C scanner

       --bison-bridge      scanner for bison pure parser.

       --bison-locations   include yylloc support.

       --stdinit           initialize yyin/yyout to stdin/stdout

       --nounistd          do not include <unistd.h>

       --wincompat         windows compatibility (uses <io.h> instead of <unistd.h> and _isatty, _fileno functions)

       --noFUNCTION        do not generate a particular FUNCTION

Miscellaneous:

  -c                      do-nothing POSIX option

  -n                      do-nothing POSIX option

  -?

  -h, --help              produce this help message

  -V, --version           report win_flex version

例1

参考网页 Windows环境下lex入门 - 朱迎春 - 博客园 中的例子。

(1)创建文本文件“a.l”(即编写lex程序)

使用文本编辑器创建文件“d:/temp/a.l”,内容如下:

%{

int num_lines = 0, num_chars = 0;

%}

%%

\n      ++num_lines; ++num_chars;

.       ++num_chars;



%%



int main()

{

yyin = fopen("d:/temp/a.l","r");

yylex();

fclose(yyin);

printf("lines = %d, chars = %d\n", num_lines, num_chars);

}



int yywrap()

{

return 1;

}

双百分号“%%”,是lex编译器的专用字符串,用于区分lex程序文件中的声明部分、转换规则(每个规则由模式和动作两部分组成,模式即正则表达式,动作即程序代码)、辅助过程(即C语言编写的函数)。

(2)使用win_flex编译文件“a.l”

在命令行窗口输入命令(wincompat参数,命令lex编译器创建Windows兼容的程序),:

D:\Programs\win_flex_bison-latest\win_flex.exe --wincompat --outfile=d:/temp/a.yy.c d:/temp/a.l

正常执行后,生成文件“d:/temp/a.yy.c”,这个文件较大,内容较多。

3使用C语言编译器编译a.yy.c

我使用的C语言编译器是Visual Studio 2022。进入VS2022的开发者命令行窗口,进入目录“d:\temp”执行如下编译命令: cl a.yy.c

命令执行成功后,在目录中生成文件“a.yy.exe”和“a.yy.obj”.

关于进入VS2022的开发者命令行窗口的方法,可参看网页 今日头条 的相关部分。

(4)运行程序文件“a.yy.exe”

在命令行窗口运行命令“a.yy”,结果如下图所示:

Windows中使用Lex(Win flex-bison)

该程序的运行结果是,对文件中的行数和字符数进行计数。

例2

参考网页 windows 下使用lex_铿老爷的博客-CSDN博客_lex windows 中的例子。

(1)创建文本文件“a.l”(即编写lex程序)

使用文本编辑器创建文件“d:/temp/b.l”,内容如下:

%{  

    #include <stdio.h>  

    #include <stdlib.h>   

    int count = 0;  

%}   

  

delim [" "\n\t\r]   

whitespace {delim}+   

operator \+|-|\*|\/|:=|>=|<=|#|=|<<|>>|\+\+

reservedWord int|include|main|return|using|if|namespace

delimiter [,\.;\(\)\"\<\>\{\}]

constant ([0-9])+

identfier [A-Za-z]([A-Za-z]|[0-9])*  

%%   

{reservedWord} {count++;printf("%d\t(rw,%s)\n",count,yytext);}  

\"[^\"]*\" {count++;printf("%d\t(ct,%s)\n",count,yytext);}

{operator} { count++;printf("%d\t(op,%s)\n",count,yytext); }  

{delimiter} {count++;printf("%d\t(de,%s)\n",count,yytext);}  

{constant} {count++;printf("%d\t(ct,%s)\n",count,yytext);}  

{identfier} {count++;printf("%d\t(id,%s)\n",count,yytext);}   

{whitespace} { /* do    nothing*/ }

%%



int main()

{

yyin = fopen("d:/temp/input.txt","r");

yylex();

fclose(yyin);

}

int yywrap()

{

return 1;

}

上述程序中使用的“d:/temp/input.txt”文件内容

#include<iostream>

using namespace std;

int main(){

cout<<"Hello World!"<<a + b = i++;

}

(2)使用win_flex编译文件“b.l”

在命令行窗口输入命令(wincompat参数,命令lex编译器创建Windows兼容的程序),:

D:\Programs\win_flex_bison-latest\win_flex.exe --wincompat --outfile=d:/temp/b.yy.c d:/temp/b.l

正常执行后,生成文件“d:/temp/b.yy.c”,这个文件较大,内容较多。

3使用C语言编译器编译b.yy.c

我使用的C语言编译器是Visual Studio 2022。进入VS2022的开发者命令行窗口,进入目录“d:\temp”执行如下编译命令: cl b.yy.c

命令执行成功后,在目录中生成文件“b.yy.exe”和“b.yy.obj”。

(4)运行程序文件“b.yy.exe”

在命令行窗口运行命令“b.yy”,结果如下图所示:

 Windows中使用Lex(Win flex-bison)

但是有个问题,就是在“d:/temp/input.txt”文件的”Hello World”的左边的双引号前面添加空格,就会导致程序的结果不同(不符合预期),这个问题原因还找不到。

小结

通过上面两个例子,可以看出在Windows中使用Lex的步骤为:

  1. 编写lex程序。即扩展名为“.l”的文本文件。
  2. 编译lex程序。即使用win_flex.exe处理lex程序得到扩展名为“.c”的文件。
  3. 得到可执行的程序。即使用C语言编译器,生成扩展名为“.exe”的文件。
  4. 运行可执行程序。

相关网页

lex(计算机领域的词法分析器)_百度百科 ,lex计算机领域的词法分析器

Win flex-bison - Browse Files at SourceForge.net , Win flex-bison Files

Windows环境下lex入门 - 朱迎春 - 博客园 ,Windows环境下lex入门

windows 下使用lex_铿老爷的博客-CSDN博客_lex windows ,windows 下使用lex

今日头条 ,SQLite 3.37.2源码下载及编译(Win10+VS2022)

 文章来源地址https://www.toymoban.com/news/detail-433946.html

 

到了这里,关于Windows中使用Lex(Win flex-bison)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自然语言处理(八):Lexical Semantics

    目录 1. Sentiment Analysis 2. Lexical Database 2.1 What is Lexical Database 2.2 Definitions 2.3 Meaning Through Dictionary 2.4 WordNet 2.5 Synsets 2.6 Hypernymy Chain 3. Word Similarity 3.1 Word Similarity with Paths 3.2 超越路径长度 3.3 Abstract Nodes 3.4 Concept Probability Of A Node 3.5 Similarity with Information Content 4. Word Sense Disambi

    2023年04月10日
    浏览(22)
  • 键盘win键无法使用,win+r不生效、win键没反应、Windows键失灵解决方案(亲测可以解决)

    最近几天发现自己笔记本的win键无法使用,win失灵了,但是外接键盘后则正常:。 这个问题困扰了我一周,我都以为自己的枪神坏了。 寻找了几个解决方法,网上看了好多好多稀里糊涂的办法,都是不管用的,这里给大家分享我的解法: 1:我的电脑其实是我按住Fn+win,把

    2024年02月04日
    浏览(40)
  • Lex 生成一个词法分析器

     lex 通过输入一个.l 文件生成一个lex.yy.c 文件,然后通过c 编译器编译成一个可执行的词法分析器。 该词法分析器扫描输入源文件,生成一个token 符号流给后面语法分析器使用。   .l 文件的结构, 分成三个部分,声明, 转换规则, 自定义规则。 三个部分由%%分割 声明段,

    2024年02月19日
    浏览(49)
  • 【经验分享】Windows快捷键Win+G无法使用,提示需要新应用打开链接

    系统版本:Windows 10 家庭中文版 描述:按下Win+G后弹出提示框,需要使用新应用以打开此 ms-gamingoverlay 链接 误将Xbox game bar应用程序删除了,无法找到启动的程序。 这个程序我当时以为就是个打游戏的,我就删除了,没想到录屏会需要到。 视频教程: 文字教程: 1.查看Xbox

    2023年04月27日
    浏览(214)
  • 【解决方法】Windows快捷键Win+G无法使用,提示需要新应用打开链接

    系统版本:Windows 10 家庭中文版 描述:按下Win+G后弹出提示框,需要使用新应用以打开此 ms-gamingoverlay 链接 误将Xbox game bar应用程序删除了,无法找到启动的程序。 这个程序我当时以为就是个打游戏的,我就删除了,没想到录屏会需要到。 视频教程: 文字教程: 1.查看Xbox

    2023年04月27日
    浏览(196)
  • 使用XShell、XFTP 连接 win7 虚拟机(windows、Linux无法远程登录问题)

    ( 更新:可以通过此文章解决三个问题:使用Windows/linux远程连接Linux或Windows,但无法连接,可以对Windows检查ssh,对Linux检查sshd ) 首先,你看到这篇文章的原因可能是如下两个(此篇我们以Windows7为例,因为win10ssh一般是开着的): 还没有尝试使用 [XShell 连接 Windows 7 系统(

    2024年02月02日
    浏览(53)
  • Rust-NLL(Non-Lexical-Lifetime)

    Rust防范“内存不安全”代码的原则极其清晰明了。 如果你对同一块内存存在多个引用,就不要试图对这块内存做修改;如果你需要对一块内存做修改,就不要同时保留多个引用。 只要保证了这个原则,我们就可以保证内存安全。 它在实践中发挥了强大的作用,可以帮助我们

    2024年01月19日
    浏览(38)
  • win11家庭版安装远程桌面服务(使用RDPWra解决windows家庭版无法远程桌面问题)

    1.进行rdpwrap软件安装 2.设置rdpwrap软件进行相关配置 3.按当前系统版本号修改rdpwrap.ini文件 4.进行windows账户相关设置,进行远程桌面测试 获取RDP软件和相关配置文件 rdpwrap相关压缩包和对应版本号的rdpwrap.ini配置文件 百度网盘获取RDP软件和配置文件 https://pan.baidu.com/s/1EJQnfUMoJ

    2024年02月02日
    浏览(54)
  • 【Linux】centos8安装bison3.8

    centos8安装 bison3.8 的教程,感觉这个软件很小众啊,百度找不到安装教程,最终还是在起脚旮旯里面翻出来了很久之前的文档,好在没有过时; 虽然centos8中你可以使用yum直接安装,但是哪个安装的版本太低了,达不到如今的需求 我这边直接用yum安装的是 3.0.4 的版本,已经是

    2024年02月10日
    浏览(52)
  • 【Windows】不要让你的win键落灰!掌握常用的组合快捷键,使用电脑更高效了

    Windows 操作系统提供了丰富的键盘快捷键,能够大幅提高工作效率和操作便利性。在此介绍一些与 Win 键相关的常用快捷键,帮助你更好地利用 Windows 系统。想要在使用电脑时更高效吗?掌握常用的组合快捷键,让你的 Win 键从此不再落灰!这些快捷键可以让你在操作系统中快

    2024年02月15日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包