问题标签 [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.
thread-safety - 使用 Flex 编写可重入词法分析器
我是弯曲的新手。我正在尝试使用 flex 编写一个简单的可重入词法分析器/扫描器。词法分析器定义如下。我遇到编译错误,如下所示(yyg 问题):
可重入的.l:
编译错误:
windows - Flex(Lex,而不是 actionscript 或其他)错误
我对 flex 完全陌生。
使用 flex 时出现构建错误。也就是说,我使用 flex 生成了一个 .c 文件,并且在运行它时,我收到了这个错误:
这是我正在使用的 lex 文件(从这里获取):
同样,为什么我必须在 lex 语法代码中放置一个“主”函数?我想要的是能够调用 yylex(); 从另一个c文件。
c - 使用 Flex+Bison 识别尾递归函数并将代码转换为迭代形式
我正在编写一个能够接受新函数定义的计算器。意识到新手需要尝试斐波那契等递归函数,我希望我的计算器能够使用 Flex + Bison 识别尾递归函数并将代码转换为迭代形式。我正在使用 Flex & Bison 来完成这项工作。如果您有任何提示或想法,我热烈欢迎。谢谢!
编辑:
我们不用担心 Flex & Bison 的 C 或 C++ 输出。主要是我想要一个想法或提示。谢谢。
grammar - Bison:单个规则中的可选标记
我正在使用 GNU Bison 2.4.2 为我正在研究的一种新语言编写语法,我有一个问题。当我指定规则时,假设:
例如,如果我对规则有变化
哪里(来自弹性扫描仪规则):
(并且 T_IDENT_LIST 是逗号分隔标识符的规则)。
有没有办法只在一个规则中指定所有这些,以某种方式将“T_EXTENDS T_IDENT_LIST”设置为可选?我已经尝试过
但是 Bison 给了我一个错误。
谢谢
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()
,但是我无法通过继续解析工作来获得“内联”替换......
grammar - Flex,多行规则
嗨,我的词法分析器定义中有一个 flex 规则:
有没有办法将这个规则拆分为更多行以使其更清晰?我尝试使用 \ 就像宏一样,但它似乎不被 flex 接受:(
PS:我不想将规则拆分为更多的子规则,而只是将其正则表达式拆分为更多行以保持代码更清晰。
visual-c++ - 在 vc++ 下编译 bison & flex 程序时 unistd.h 相关的困难
我正在使用带有 vc++ 的 bison 和 flex(通过 cygwin 下载)。当我编译程序时出现错误:
flex生成的文件中对应的代码是:
如果我在 flex 文件(.l)中定义 YY_NO_UNISTD_H,这个错误就会消失,但我会得到其他几个错误:
我该如何解决这个问题?
所有这些错误都发生在 flex 生成的扫描仪中。
我知道这是因为 unistd.h 在 Windows 中不存在。我必须编写自己的 unistd.h 吗?如果是这样,如何编写它以消除这些错误?
c++ - 使用 Flex 和 Bison 在脚本引擎中实现 eval 和 load 函数
嗨,伙计们,我正在开发一个带有 flex 和 bison 的脚本引擎,现在我正在为这种语言实现 eval 和 load 函数。举个例子,语法如下:
所以,在我的词法分析器中,我实现了这个功能:
但这似乎不起作用。好吧,确实如此,但是当字符串(从文件加载或直接评估)完成时,我得到一个 sigsegv :
您可能会注意到,sigsegv 是由 flex/bison 代码生成的,而不是我的……任何提示,或者至少有任何关于如何实现这些功能的示例?
PS:我已经成功实现了 include 指令,但是我需要 eval 和 load 来工作,而不是在解析时而是在执行时(PHP 的 include/require 指令的一种)。
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 中创建/保存节点的方式,那就太好了。代码可以被剪断,只是为了让我明白。
如果您知道现有的(可能很简单)示例,我也将不胜感激。
感谢大家的时间和帮助!
flex-lexer - MinGW gcc 错误:“未定义对‘yylloc’的引用”
我在哪里可以找到 yylloc?我在 gcc 命令行中包含了 libfl.a (-lfl),将 GnuWin32/bin 和 GnuWin32/lib 目录添加到系统变量 LIB,搜索了 GnuWin32 中的所有文件 - 我和 gcc 都找不到它。