问题标签 [lemon]

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 投票
2 回答
855 浏览

c - 如何处理用于两件事柠檬解析器的相同符号

我正在开发一种特定领域的语言。语言的一部分与 C 表达式完全一样,解析判据和符号等语义。

我正在使用柠檬解析器。我遇到了一个问题,即同一个令牌被用于两种不同的事情,我无法分辨词法分析器中的区别。& 符号用于“按位与”和“地址”。

起初我认为这是一个微不足道的问题,直到我意识到它们没有相同的关联性。

如何给同一个令牌两个不同的关联性?我应该只使用 AMP(如与符)并使 addressof 和按位和规则使用 AMP,还是应该使用不同的令牌(例如 ADDRESSOF 和 BITWISE_AND)。如果我确实使用了单独的符号,我应该如何从词法分析器中知道哪个符号(如果不是解析器本身就无法知道!)。

0 投票
2 回答
507 浏览

c - 如何在生成的解析器中捕获语法错误的行号

我传递给 Lemon 的所有标记都是附加了行号信息的结构。

查看下面的 syntax_error 定义

但是我看不到如何报告错误是什么文件和行。我有所有令牌的信息,但是如何在 syntax_error 处理程序中访问适当的令牌?

我是否需要单独跟踪我在标记器中的位置并在语法错误中查看它?我意识到标记器在遇到语法错误时可能会领先于解析器。

0 投票
1 回答
228 浏览

parsing - 与后缀/中缀运算符的优先级冲突

这是为柠檬解析器生成器编写的语法:

尝试编译它时,生成器会产生以下冲突:

为什么会出现冲突,因为 PreIncrementation 和 PostDecrementation 的优先级和关联性已在语法中明确指定?

0 投票
1 回答
257 浏览

parsing - 如何让 Lemon 解析器在换行符上终止自身?

按照这个旧教程,我试图让柠檬解析器自动终止对EOL令牌的解析。解析器的相关部分如下所示:

下面是我使用 Flex 扫描的令牌执行解析器的方式:

我想消除在EOL此处检查令牌的需要,并让解析器确定何时完成。我怎么做?

谢谢!

0 投票
1 回答
414 浏览

sql - 用柠檬“部分解析”

我有一个使用柠檬解析器生成器构建的SQL 语法。解析命令的正常入口点是语句(如),因此该语句是我在语法中的非终结符。到目前为止一切正常。SELECT ...%start

现在我想做一个“部分解析”,例如只解析一个表达式或一个WHERE子句。基本上这意味着我希望%start非终端在运行时改变。我在文档中找不到任何内容。这可能在柠檬中吗?

如果不是,我正在考虑做一些事情,比如让解析在我的自定义起点失败。这感觉就像一个黑客,有没有更清洁的方法?

0 投票
2 回答
131 浏览

c - 解析器减少过早

我有一个基本上看起来像这样的语法:

它解析类似:

这确实是一个类似配置的名称。会发生什么:

name = "value" 导致 assignments ::= assignments 分配。减少。我希望 assignments 是一个常量值,但事实并非如此:

柠檬调试输出是http://pastebin.com/yHNkNRpf

这导致 name2 仅添加到列表中。我对此感到困惑。我理解减少,但不明白为什么分配者一直被设置为空。有办法解决这个问题,但我更喜欢适当的修复。

柠檬调试输出是http://pastebin.com/yHNkNRpf

有什么线索吗?

0 投票
1 回答
782 浏览

parsing - 表示语法中的语句终止换行符?

许多编程语言都有以行尾结尾的语句。但是,通常,如果解析器无法理解该行,则允许在语句中间使用行结尾。例如,

...将在 Ruby 和 Python* 中解析为 statement a = 3+4,因为a = 3+没有任何意义。换句话说,换行符会被忽略,因为它会导致解析错误。

我的问题是:如何使用标记器和解析器简单/优雅地完成相同的行为?我使用 Lemon 作为解析器生成器,如果它有任何区别(尽管我也将此问题标记为 yacc,因为我确信该解决方案同样适用于两个程序)。

这就是我现在的做法:允许在不存在语法歧义的任何情况下可选地出现语句终止符。换句话说,像

...换句话说,可以在加号之后使用换行符,因为这不会对语法的歧义产生任何影响。我担心这会增加语法的大小,我有很多机会错过案例或在语法中引入细微的错误。有没有更简单的方法来做到这一点?

编辑*:实际上,该代码示例不适用于 Python。但是,如果您传入这样的内容,Python 实际上会忽略换行符:

0 投票
1 回答
830 浏览

lex - Flex 和柠檬解析器

我正在尝试学习 flex 和柠檬,以解析(适度)复杂的文件格式。到目前为止,我有我的语法和 lex 文件,我相信它可以正确解析示例文件。现在,我想将使用 flex 扫描的令牌文本传递给柠檬。

flex YYSTYPE 定义为

柠檬令牌类型是

但是,如果我在柠檬中有一套规则:

输出将是

什么时候应该是

我的主要解析循环是:

cout 行正在打印正确的 lexCode/yylval 组合。

什么是最好的方法?我找不到任何有用的东西。

0 投票
2 回答
459 浏览

c - 柠檬解析器解析 0 令牌

我在使用(可重入)Flex + Lemon 进行解析时遇到问题。我在这里使用了一个简单的语法和词法分析器。当我运行它时,我会输入一个数字,后跟一个 EOF 标记 (Ctrl-D)。打印输出将显示:

第一行是我输入的数字。理论上,AST 值应该是我输入的所有内容的总和。

编辑:当我手动调用 Parse() 时,它运行正确。

atom ::= INT此外,即使标记为 0(停止标记),柠檬似乎也会运行规则。为什么是这样?我对这种行为感到非常困惑,我找不到任何好的文档。

0 投票
1 回答
155 浏览

c++ - 柠檬解析器 - 如何处理柠檬解析器的结果

http://linuxgazette.net/106/chirico.html 在示例 1 中,结果打印在 example1.y 中,但我想在 main.c 中处理该结果。我怎样才能做到这一点?