在windows下面使用flex和bison编写文件解析器

2023-11-10

本文的目的是介绍如何解决在windows下使用flex和bison编写文件解析器的一些问题, 我水平不高,对与flex,bison,gnu linux也没有什么深刻的理解,只是觉得对于这方 面的具体的问题好像没有人提及,所以把自己在使用过程中遇到的问题和解决问题的方 法写出来,让大家以后遇到这样的问题不会浪费自己宝贵的时间。

一、简介:

1、flex(fast lexical analyzer generator ) flex是gnu的lex工具,可以用来生成文字扫描程序(scanner),我们可以在 GitHub - westes/flex: The Fast Lexical Analyzer - scanner generator for lexing in C and C++ 得到关于flex的更详尽的信息。

如果感兴趣的话也可以在 ftp://ftp.gnu.org/non-gnu/flex/ 找到最新的flex源程序(里面包括了for winnt的makefile,可以尝试编译一个windows 下面的flex)

2、bison bison也是gnu的工具,功能相当于yacc(这么写也许不准确),可以用来生成解析器程序 (parser),我们 可以在 Bison- GNU Project - Free Software Foundation 得到关于bison的更详尽的信息。如果感兴趣的话也可以在 ftp://ftp.gnu.org/gnu/bison/ 找到最新的bison版本。

flex和bison结合使用可以大大减少写解析器程序的难度。具体的使用可以参考 www-900.ibm.com/developerWorks/ cn/linux/sdk/lex/index.shtml (lex与yacc快速 入门)

二、如何得到在windows下可用的flex和bison

flex和bison整合在linux里面,使用方便,而对于windows是另外一回事情,要得到能在 windows下面使用的flex和bison有以下途径:

1、使用mingw:这里给出几个网址www.mingw.org(mingw的主页) http://sourceforge.net/projects/mingw(sorceforge上面的主页)


如果像我一样没有什么linux的经验最好使用上面提供的一个集成的安装 文件 Download MinGW - Minimalist GNU for Windows from SourceForge.net nload 在mingw下面使用flex和bison非常方便。

2、使用cygwin:这个我没有用过,不过和mingw差不多的说。

3、使用从cygwin中抽出来的flex和bison:这个是某人把flex和bison从cygwin环境中独 立出来得到的,很小,也很好用 www.driverdevelop.com/lu0/App/20040513.html

4、使用gnuwin32:在sourceforge上面的gnuwin32工程里面可以找到在windows下面可用 的flex和bison。flex很好用,不过bison好像有点问题 。给出地址:GnuWin download | SourceForge.net

5、自己编译一个可用的exe文件,flex提供了for nt的makefile,不过我尝试了一下没 有成功,有时间和兴趣的话可以去捣鼓。

三、编写文件遇到的麻烦

按照“lex与yacc快速入门”上面说得东西,并参照flex 手册及bison手册来编写自己的 文件解析器,基本不会遇到什么大问题。需要提一下几点

1、在.y文件中不要按照bison手册提到的那样使用‘’来表示会遇到的标点符号,把所 有的标点符号都定义相应的token,在.y中用定义好的token来表示标点符号。比如说要 写一个c的解析器,那么对于';'',''+'等,就最好在lex文件里里面加入 ';' return SEMI; ',' return COMMA; '+' return PLUS; 在.y文件里面定义SEMI,COMMA,和PLUS为token。

2、.y里面有用的变量yylval,这个变量用来把.y和.l联系起来,.l生成的扫描器程序遇 到了一个token会把这个词放在yytext变量里面,把text付给yylval的话,.y文件生成的 parser就能接受到扫描器遇到的词了。另外yylval默认的类型是char*,我们可以用#def ine YYSTYPE来改变yylval的类型,还可以用%union{....}以及%type...来使yylv al对于不同的toaken有不同的变量类型。

四、编译连接文件会遇到的麻烦

1、在编译.y文件的时候要小心 -p 选项,这个选项会改变yylval以及yylex等一大堆东 西的名字,具体的可以去查阅bison手册。

2、如果没有犯错误的话,注意了上面的这些问题,用flex和bison编写的文件解析程序 在mingw应该可以用gcc编译链接通过,并正常运行。 但是如果你想把程序拿到vc下面去用,问题就出来了。vc会有一个编译错误,并告诉你 在文件lex.yy.c(由flex产生的代码)不能打开。如果你找到这一行,并删掉 的话,就能编译通过但是会在link的时候出错,告诉你unresolved external symbol " int __cdecl isatty(int)"。 造成错误的原因是windows下面没有unistd.h,我在网上找了很久找到了解决办法, 在flex生成的c代码中加入一下几行代替原来的#include就行了

#ifndef _WIN32

#include <unistd.h>

#else

#ifndef YY_ALWAYS_INTERACTIVE

#ifndef YY_NEVER_INTERACTIVE

/* extern int isatty YY_PROTO(( int )); */

#include <io.h>

#endif

#endif

#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在windows下面使用flex和bison编写文件解析器 的相关文章

  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • 安装 JDK 时出错:keytool 命令需要已安装的 proc fs (/proc)。 Linux 的 Windows 子系统

    我尝试在 Linux 的 Windows 子系统 Ubuntu 14 04 上安装 Oracle JDK 1 7 但出现以下错误 the keytool command requires a mounted proc fs proc Jav
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • Windows 控制台支持 ANSI 吗?

    Windows 控制台支持 ANSI 控制字符吗 默认情况下它不支持许多 ANSI 控制字符 维基百科文章中也提到了这一点 http en wikipedia org wiki ANSI escape code http en wikipe
  • 如何使用 WinAPI 读取 MessageBox 文本

    如何读取标准Win消息框 Info 的消息 Using SendMessage this HandleControl WM GETTEXT builder Capacity builder 我只能读取消息框的标题或按钮的文本 但不能读取消息
  • MinGW g++ 在自己的包含目录中找不到标头

    所以我最近通过最新版本安装了 MinGWnuwen 的 MinGW 发行版 http nuwen net mingw html其中包括 boost C 库 具体来说 我正在寻找 boost 库提供的scoped ptr 但是 当我尝试包含s
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • 用于 e NetworkManager VPN 连接的 dbus 信号处理程序

    我需要开发一些在建立 VPN 连接时执行的 python 代码 VPN 由 NetworkManager 控制 我试图弄清楚如何为此使用 NM DBUS 事件 使用 dbus monitor system 我能够识别连接信号 signal
  • 如何在 Ubuntu/Linux 发行版中安装 Tesseract-OCR 3.03?

    我和一个朋友有兴趣为 CV 项目训练 tesseract OCR 引擎 我们尝试使用一些包装器 例如 PyTesser 和 pyocr 但结果目前不如我们需要的那么准确 因此 我们希望尝试训练超立方体以更好地实现我们的目的 即识别食品标签上
  • Linux 上的“软/硬 nofile”是什么意思

    当我尝试在RedHat EL5上安装软件时 我得到了错误 软 硬nofile的期望值是4096 而默认值是1024 我设法增加了这个数字 但我不知道参数是什么 他们指的是软链接和硬链接吗 我改变的方法是 a 修改 etc security
  • 为什么 %processor_architecture% 总是返回 x86 而不是 AMD64

    我正在尝试检索环境变量来检测系统是32位还是64位 但在64位服务器上环境变量 processor architecture 正在返回x86代替AMD64 有人对此有任何线索吗 您可能获得了错误的环境变量 如果您的应用程序是在 64 位操作
  • .NET 或 Windows 同步原语性能规范

    我目前正在写一篇科学文章 我需要非常准确地引用 有人可以向我指出 MSDN MSDN 文章 一些已发表的文章来源或一本书 我可以在其中找到 Windows 或 NET 同步原语的性能比较 我知道这些是按性能降序排列的 互锁 API 关键部分
  • 后台地理围栏 Windows Phone 8.1 (WinRT)

    Issue 我试图在 WP8 1 WinRT 中发生地理围栏事件 进入 退出 时触发后台任务 我已经编写了一个示例应用程序来尝试让它工作 但似乎无法做到这一点 到目前为止 我已采取以下步骤来尝试让地理围栏在后台运行 检查位置功能 创建 注册
  • SIGHUP 用于重新加载配置

    根据signal 7 SIGHUP用于检测控制终端的挂起或控制进程的死亡 然而 我遇到过很多 OSS 守护进程 服务 其中SIGHUP用于启动配置的重新加载 这里有一些例子 hostapd sshd snort etc 这是实现重新加载的标
  • 尝试使用 C++ 创建一个计划任务运行一次,win7 上的任务计划程序 1.0

    我正在尝试创建一个非常简单的程序 它将在两分钟后运行记事本 这些都经过简化以提出更清晰的问题 我尝试合并一些MSDN 的例子 http msdn microsoft com en us library windows desktop aa3
  • 如何使用 cython 编译扩展?

    我正在尝试从示例页面编译一个简单的 cython 扩展here http docs cython org src userguide tutorial html在我安装了 Python 2 6 64 位版本的 Windows 7 64 位计
  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • select() 可以在 Windows 下使用 Python 中的文件吗?

    我正在尝试在 Windows 下运行以下 python 服务器 An echo server that uses select to handle multiple clients at a time Entering any line o
  • 让 Jenkins 对远程用户不可见

    我的本地 Windows 设备上有一个 Jenkins 服务器 但我想让它对外界不可见 有关服务器的办公室规则 明显且不隐晦的 效果令人满意的方法是设置防火墙规则来阻止对其端口的传入访问 但我认为必须有一个 Jenkins 设置来阻止它向除
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul

随机推荐

  • Optimal Coin Change(完全背包计数)

    题目描述 In a 10 dollar shop everything is worthy 10 dollars or less In order to serve customers more effectively at the cas
  • Java对象序列化

    Java 对象序列化 对象序列化的目标是将对象保存到磁盘中 或允许在网络中直接传输对象 对象序列化机制允许把内存中的 java 对象转换成为与平台无关的二进制流 从而允许把这种二进制流持久保存到磁盘上 实现对象序列化 该类实现接口 seri
  • texstudio与ctex_Latex的使用(Ctex+TeXstudio)

    1 下载 CTEX Latex 本来是只支持英文的 但是实在太好用了 遂结合中国的团队以及有识之士 开发了这个 CTEX CTEX 有 TexLive TexLive 为 Latex 安装包的名字 的所有内容 还包括了中文的支持 所以这里我
  • 【C++】详解inline

    2023年8月28日 周一晚上 目录 优点 缺点 使用条件 为什么调用函数会有开销 举例说明 优点 当使用inline关键字声明一个函数时 编译器会将函数体内联到所有调用该函数的地方 这可以提高执行效率 因为无需进行函数调用的开销 缺点 但
  • android 日期控件

    相关布局文件
  • android:OKHttp的使用

    1 之前学习了两种基于http访问服务器的方法 一种是HttpURLConenction 一种是Apache下的HttpClient 说实话 这两种方法操作起来都不是很简单明了 所以当前首选的网络通信库是由Square公司开发的OKHttp
  • 有关C++,Qt中使用指针的注意事项

    1 指针一般在创建的时候都应该初始化 除非你能保证要么你不会用到这个指针 要么在你使用之前它以及被被初始化了 如果不初始化 它就是野指针 在Debug模式下 VC 编译器会把未初始化的栈内存上的指针全部填成 0xcccccccc 当字符串看
  • RUNOOB python练习题6 斐波那契数列

    用来练手的python 练习题其六 原链接 python练习实例6 题干 斐波那契数列 斐波那契数列可以说是很好的递归理解工具了 这里就用递归实现一下斐波那契数列 源代码如下 返回fibonacci数列中某一项的数值 def Fibonac
  • 【面试题】2023年最新前端面试题-react篇

    原文见 语雀 https www yuque com deepstates interview hia3k3 核心概念 元素渲染 组件 props state refs 使用场景 如何创建 如何访问 组件通信 父子 祖孙 兄弟组件通信 生命
  • 【golang/go语言】Go语言代码实践——高复用、易扩展性代码训练

    某个项目里有一段老代码写的不是很好 想着能否通过自己掌握的知识 将其改善一下 感兴趣的小伙伴可以通过了解背景和需求 自己试想下该如何实现 如果有更好的方案也欢迎留言讨论 1 背景及需求 1 背景 假设我们的下游提供了一个定时任务接口Cron
  • linux编译命令——make -j18

    项目越来越大 每次需要重新编译整个项目都是一件很浪费时间的事情 Research了一下 找到以下可以帮助提高速度的方法 总结一下 1 tmpfs 有人说在Windows下用了RAMDisk把一个项目编译时间从4 5小时减少到了5分钟 也许这
  • Browsersync的安装及使用方法

    Browsersync介绍 Browsersync是浏览器同步测试工具 Browsersync能让浏览器实时 快速响应文件更改 html js css sass less等 并自动刷新页面 省去手动F5的事件 更重要的是 Browsersy
  • 模拟电路设计(24)---几种不同类型的A/D转换器的转换原理

    A D转换器是将模拟信号变换成相应的数字信号的装置 今天来介绍几种不同类型的A D转换器的转换原理 双积分式A D转换器的转换原理 这种转换本质是一种V T 电压 时间 的转换 如下图所示 它的一次转换基本工作原理可以分成三个工作阶段 双积
  • 为什么要学设计模式?

    01 什么是设计模式 设计模式 Design Pattern 代表了最佳的实践 通常被有经验的面向对象的软件开发人员所采用 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案 这些解决方案是众多软件开发人员经过相当长一段时间的试
  • 亚马逊云科技 云技能孵化营——我的云技能之旅

    文章目录 每日一句正能量 前言 活动流程 后记 每日一句正能量 不能在已经获得足够多的成功时 还对自己的能力保持怀疑 露出自信的微笑 走出自信的步伐 做一个自信的人 前言 亚马逊云科技 Amazon Web Services 是全球云计算的
  • 事务的隔离级别

    脏读 脏读是指某一个事务读取到了其他事务未提交的数据 如果此数据回滚 将导致读取到的数据是错误的数据 不可重复读 指某个事务在开启后 读取某个范围或者某条数据时 在此事务未结束的时间里内 其他事务对表内的数据进行了添加 或者更改了某一条或者
  • 关于工作流应用的思考

    我今天在学习的过程中突然思考了一个问题 即工作流在多数企业中用不起来主要有两个原因 1 信息化程度不够 2 工作流不够灵活 下面我以大学业务管理为例 对以上两个原因进行说明 由于各个学院各个单位的系统相互独立 所以学院内部的工作通常由内部系
  • 数据结构之图的遍历

    什么是图的遍历 图的遍历是对一张图中所有节点进行访问的过程 在图遍历中 我们从图中的某个节点开始 沿着边一直访问其他节点 直到访问完所有与该节点有连通关系的节点 遍历过程中需要遵循一定的遍历规则 常见的有深度优先遍历和广度优先遍历 深度优先
  • ECCV2022 多目标跟踪(MOT)汇总

    一 Towards Grand Unification of Object Tracking 作者 Bin Yan1 Yi Jiang2 Peize Sun3 Dong Wang1 Zehuan Yuan2 Ping Luo3 and Hu
  • 在windows下面使用flex和bison编写文件解析器

    本文的目的是介绍如何解决在windows下使用flex和bison编写文件解析器的一些问题 我水平不高 对与flex bison gnu linux也没有什么深刻的理解 只是觉得对于这方 面的具体的问题好像没有人提及 所以把自己在使用过程中