问题标签 [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 投票
1 回答
7860 浏览

thread-safety - 使用 Flex 编写可重入词法分析器

我是弯曲的新手。我正在尝试使用 flex 编写一个简单的可重入词法分析器/扫描器。词法分析器定义如下。我遇到编译错误,如下所示(yyg 问题):

可重入的.l:

编译错误:

0 投票
2 回答
1255 浏览

windows - Flex(Lex,而不是 actionscript 或其他)错误

我对 flex 完全陌生。

使用 flex 时出现构建错误。也就是说,我使用 flex 生成了一个 .c 文件,并且在运行它时,我收到了这个错误:

这是我正在使用的 lex 文件(从这里获取):

同样,为什么我必须在 lex 语法代码中放置一个“主”函数?我想要的是能够调用 yylex(); 从另一个c文件。

0 投票
3 回答
631 浏览

c - 使用 Flex+Bison 识别尾递归函数并将代码转换为迭代形式

我正在编写一个能够接受新函数定义的计算器。意识到新手需要尝试斐波那契等递归函数,我希望我的计算器能够使用 Flex + Bison 识别尾递归函数并将代码转换为迭代形式。我正在使用 Flex & Bison 来完成这项工作。如果您有任何提示或想法,我热烈欢迎。谢谢!

编辑:

我们不用担心 Flex & Bison 的 C 或 C++ 输出。主要是我想要一个想法或提示。谢谢。

0 投票
3 回答
9863 浏览

grammar - Bison:单个规则中的可选标记

我正在使用 GNU Bison 2.4.2 为我正在研究的一种新语言编写语法,我有一个问题。当我指定规则时,假设:

例如,如果我对规则有变化

哪里(来自弹性扫描仪规则):

(并且 T_IDENT_LIST 是逗号分隔标识符的规则)。

有没有办法只在一个规则中指定所有这些,以某种方式将“T_EXTENDS T_IDENT_LIST”设置为可选?我已经尝试过

但是 Bison 给了我一个错误。

谢谢

0 投票
2 回答
3002 浏览

c - 在令牌替换之类的操作之后,如何让 yacc/bison 和/或 lex/flex 重新开始扫描?

在我用其他东西替换一些令牌后,有没有办法强制 bison 和/或 flex 重新开始扫描?

我的特定示例是替换特定的单词/字符串。如果我想hello用 替换一个词,echo hello我怎样才能让 flex 或 bison 替换hello然后重新开始解析(选择 2 个词而不是一个词)。所以它会像:

  • 获取token WORD(字符串类型)
  • 如果hello,将令牌值替换为echo hello
  • 重新开始解析整个输入(现在是echo hello
  • 获取令牌 WORD ( echo)
  • 获取令牌 WORD ( hello)

我见过非常诱人的函数yyrestart(),比如 非常感谢任何帮助,谢谢!

2010 年 4 月 23 日更新

我最终使用的一种 hack-and-slash 解决方案是针对每个word通过的,我检查一个“别名”数组。如果word有别名,我会替换单词的值(例如,使用strcopy($1,aliasval)),并标记一个aliasfound标志。

一旦整行输入被解析一次,如果aliasfound标志为真,我会使用yy_scan_string()扩展别名将缓冲区状态切换到输入,然后调用YYACCEPT.

然后它跳到主函数,我yyparse()再次调用,缓冲区仍然指向我的字符串。这一直持续到找不到别名为止。一旦我所有的语法动作都完成了,我就会打电话yyrestart(stdin)回到“正常”模式。

如果有人知道我如何使用它们的别名值有效地扩展我的单词,注入stdin(或其他方法),并在我进行时基本上扩展所有别名(甚至嵌套),那就太棒了。我正在玩yypush_buffer_state()and yypop_buffer_state(),以及yy_switch_to_buffer(),但是我无法通过继续解析工作来获得“内联”替换......

0 投票
1 回答
707 浏览

grammar - Flex,多行规则

嗨,我的词法分析器定义中有一个 flex 规则:

有没有办法将这个规则拆分为更多行以使其更清晰?我尝试使用 \ 就像宏一样,但它似乎不被 flex 接受:(

PS:我不想将规则拆分为更多的子规则,而只是将其正则表达式拆分为更多行以保持代码更清晰。

0 投票
8 回答
31493 浏览

visual-c++ - 在 vc++ 下编译 bison & flex 程序时 unistd.h 相关的困难

我正在使用带有 vc++ 的 bison 和 flex(通过 cygwin 下载)。当我编译程序时出现错误:

flex生成的文件中对应的代码是:

如果我在 flex 文件(.l)中定义 YY_NO_UNISTD_H,这个错误就会消失,但我会得到其他几个错误:

我该如何解决这个问题?

所有这些错误都发生在 flex 生成的扫描仪中。

我知道这是因为 unistd.h 在 Windows 中不存在。我必须编写自己的 unistd.h 吗?如果是这样,如何编写它以消除这些错误?

0 投票
1 回答
506 浏览

c++ - 使用 Flex 和 Bison 在脚本引擎中实现 eval 和 load 函数

嗨,伙计们,我正在开发一个带有 flex 和 bison 的脚本引擎,现在我正在为这种语言实现 eval 和 load 函数。举个例子,语法如下:

所以,在我的词法分析器中,我实现了这个功能:

但这似乎不起作用。好吧,确实如此,但是当字符串(从文件加载或直接评估)完成时,我得到一个 sigsegv :

您可能会注意到,sigsegv 是由 flex/bison 代码生成的,而不是我的……任何提示,或者至少有任何关于如何实现这些功能的示例?

PS:我已经成功实现了 include 指令,但是我需要 eval 和 load 来工作,而不是在解析时而是在执行时(PHP 的 include/require 指令的一种)。

0 投票
1 回答
4615 浏览

c++ - 在 C++(不是 C)中使用 bison 和 flex 创建简单的计算器

我想使用 bison 和 flex 创建简单的 C++ 计算器。请注意,我是创建解析器的新手。我已经在 bison/flex 中找到了一些示例,但它们都是用 C 编写的。

我的目标是创建 C++ 代码,其中类将包含值、操作、函数的节点 - 以创建 AST(评估将在创建整个 AST 之后完成 - 从根开始并继续前进)。

例如:

将被解析为:

第二个 AST 看起来像:

然后下面的伪代码反映了 AST:

其中exp是:

但不是这样:

因为这样我直接获得了操作的价值,而不是创建节点。

我相信节点应该包含类型(操作),val1(节点),val2(节点)。在某些情况下,val2 会是 NULL,就像上面提到的sqrt一样,它最后接受一个参数。对?

如果您能针对上述问题(包括 *.y 文件创建 AST)向我提出 C++ 框架(无需评估)以帮助我理解在 AST 中创建/保存节点的方式,那就太好了。代码可以被剪断,只是为了让我明白。

如果您知道现有的(可能很简单)示例,我也将不胜感激。

感谢大家的时间和帮助!

0 投票
1 回答
696 浏览

flex-lexer - MinGW gcc 错误:“未定义对‘yylloc’的引用”

我在哪里可以找到 yylloc?我在 gcc 命令行中包含了 libfl.a (-lfl),将 GnuWin32/bin 和 GnuWin32/lib 目录添加到系统变量 LIB,搜索了 GnuWin32 中的所有文件 - 我和 gcc 都找不到它。