问题标签 [flex-lexer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
19965 浏览

bison - flex 究竟是如何支持野牛定位的?

我正在尝试使用 flex 和 bison 创建过滤器,因为我想从复杂语言中获取某些语法元素。我的计划是使用 flex + bison 来识别语法,并转储出感兴趣元素的位置。(然后使用脚本根据转储的位置获取文本。)

我发现 flex 可以支持名为 bison-locations 的野牛功能,但它是如何工作的。我尝试了 flex 文档中的示例,似乎 yylloc 不是由 flex 自动设置的,我总是得到(1,0)-(1,0). flex 可以自动计算每个令牌的位置吗?如果没有,定义了哪些接口函数供我实现?有什么例子吗?

关于工具有更好的解决方案吗?

最好的问候,凯文

编辑:

现在yylex的界面变成了:

野牛手册未指定词法分析器应如何实现以正确设置 yylloc_param。对我来说,很难手动跟踪每个令牌的列号。

0 投票
7 回答
9203 浏览

parsing - 词法分析器/解析器工具

哪个词法分析器/解析器生成器对于 C 或 C++ 来说是最好的(最容易使用、最快的)?我现在正在使用 flex 和 bison,但 bison 只处理 LALR(1) 语法。我正在解析的语言实际上并不需要无限前瞻,但无限前瞻会使解析变得容易得多。我应该尝试 Antlr 吗?可可/R?猎鹿犬?还有什么?

0 投票
2 回答
3387 浏览

c++ - Bison 似乎无法正确识别 C 字符串文字

我的问题是我试图运行一个我使用 flex-bison 扫描仪解析器编码的问题。我的程序应该做的是接受用户输入(在我的例子中,查询我正在设计的数据库系统)、lex 和解析,然后执行相应的操作。实际发生的是我的解析器代码没有正确解释我提供给它的字符串文字。

这是我的代码:

我的输入,按照“查询:”提示:

查询:插入 abc(5);
输入:1.0-5:语法错误,意外字符串,预期文件结尾或行尾或 INSERT 或 ';'

现在,如果我从第 130 行的 parser.yy 代码中删除“INSERT”字符串文字,程序运行得很好。事实上,在存储输入数据(即“abc”和整数 5)后,它会正确返回给我。

起初,我认为这是字符编码的问题。Bison 代码需要使用相同的编码进行编译和运行,这应该不是问题,因为我正在从同一个终端编译和运行。

我的系统详情:

Ubuntu 8.10 (Linux 2.6.24-16-generic)
flex 2.5.34
bison 2.3
gcc 4.2.4

如果您需要更多信息或代码,请告诉我!

0 投票
2 回答
1700 浏览

c - 使用 unput 错误

我创建了 test.l,输入到 flex,它以 main 函数结束。

当 main 函数实现为:

我没有问题。

我想诱使解析器相信第一个字符始终是分号,所以我将 main 实现为

以上导致段故障。

为什么使用 unput 会导致段错误?

0 投票
1 回答
1510 浏览

parsing - 使用 yyparse() 制作两遍汇编程序?

我正在为正在开发的自定义微控制器编写汇编程序。我已经让汇编器达到了将指令汇编成二进制的程度。

但是,我现在在让标签工作时遇到问题。目前,当我的汇编程序遇到一个新标签时,它会存储标签的名称和它所引用的内存位置。当一条指令引用一个标号时,汇编器查找该标号并用适当的值替换该标号。

这很好,很漂亮,但是如果标签是在引用它的指令之后定义的呢?因此,我需要让我的解析器对代码运行两次。

这是我目前的主要功能:

我在 flex/bison 配置中使用它。

0 投票
4 回答
1082 浏览

parsing - 同一个应用程序中是否可以有两个或多个 Lex/Yacc 解析器

我有一个应用程序,其中我已经有一个用于一种语法的解析器,我需要为另一个目的添加第二种不同的语法。

是否可以拥有多个?

如果是这样,你如何获得另一个入口点?

谢谢

大卫艾伦芬奇

0 投票
1 回答
1548 浏览

bison - Lex/Yacc:输入前打印消息

我试图弄清楚在使用 lex/yacc (flex/bison) 时如何显示消息/提示。

例如, main 看起来像这样:

哪个调用yacc,哪个调用yylex()。这会产生一个在 STDIN 上等待的空行。我怎样才能显示类似...的消息

代替

其中下划线表示光标位置,等待来自 STDIN 的输入...

忘了提,我希望重复打印提示......所以在每次 lex/yacc 从标准输入请求输入之前......

0 投票
5 回答
24018 浏览

c++ - 如何在 flex 和 bison 中使用 C++?

我有一个学校项目,我们需要使用 flex 和 bison。我想使用 C++,以便可以访问 STL 和我自己编写的类。我们获得了以下 Makefile:

scan.l 和 parse.y 有一些初始的 flex/bison 东西来生成扫描器和解析器。我需要将我自己的东西添加到这些文件中。symtab.{h, c} 应该是符号表的实现。attr.{h, c} 用于某些属性魔法。我想制作 symtab.ca .cc 文件,这样我就可以使用 STL。我还有其他想要使用 C++ 的原因。

我尝试使用 parse.ypp 文件,以便生成 .cpp 文件。但问题是我没有得到正确的 .h 文件。我将 Makefile 更改为如下所示:

有人可以告诉我需要添加什么或做什么才能使 C++ 正常工作吗?应该注意的是,我在 .y(或 .ypp)文件中添加了一些东西来处理从 C 到 C++ 的迁移。特别是,我不得不将一些东西声明为 extern。我的主要问题是,当我运行 make 时,scan.l 有一堆语法错误,它们似乎是因为它不能包含 parse.tab.h(因为它永远不会生成)。

0 投票
8 回答
35055 浏览

c - 弹性词法分析器的字符串输入

我想使用 flex/bison 解析器创建一个 read-eval-print 循环。麻烦的是,flex 生成的词法分析器需要 FILE* 类型的输入,我希望它是 char*。有没有办法做到这一点?

一个建议是创建一个管道,向它提供字符串并打开文件描述符并发送到词法分析器。这相当简单,但感觉很复杂,而且不是很独立于平台。有没有更好的办法?

0 投票
5 回答
801 浏览

parsing - 解析类 C 定义字符串的最有效方法?

我有一组用类 C 语言编写的函数定义,其中一些附加关键字可以放在一些参数之前(例如,与“无符号”或“寄存器”相同),我需要分析这些行以及一些函数存根并从中生成实际的 C 代码。

  • Flex/Yacc 是最合适的方法,这对吗?

  • 如果我对分析器/解析器的经验为零,它是否会比使用正则表达式编写 Shell 或 Python 脚本慢(我想,如果附加关键字的数量变得更大并且它们的效果会相当不同,这可能会变得很痛苦) (虽然我知道 LALR 是如何工作的)?

  • Lex/Yacc 上是否有涵盖类似问题的好材料?我能找到的所有论文都使用相同的“玩具”计算器的原始示例。

任何帮助将不胜感激。