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

c - 用柠檬解析条件

我想解析以下脚本

我可以解析的第一行str="HELLO"并保存变量以供使用。可以运行脚本

并获得输出HELLO

但我还不能做条件 if 语句。所以我想知道我应该如何处理条件语句。我试着定义这个柠檬语法

expr(A) ::= IF '[' expr(B) EQEQ expr(C) '];then' expr(C) 'fi'.

但这给了我一个错误,即报价是非法字符。所以我不知道如何编写 if 语句的语法。我的整个语法

我的循环如下所示。

问题是我不知道如何在 if 语句的语法中声明方括号。if 语句是条件的“复合”语句,如果条件为真,则要评估的表达式,因此将涉及至少 2 或 3 个表达式。我已经定义了有效的相等表达式:

expr(A) ::= expr(B) EQEQ expr(C). {if(B==C) {A=1;} else A=0;}

但是当我尝试在引号中加上方括号时,我得到了来自柠檬的编译器错误,如果我不使用引号,那么我会得到另一个错误:

Illegal character on RHS of rule: "[".

如果我尝试声明上述错误:

expr(A) ::= IF [ expr(B) EQEQ expr(C) ];then expr(C) 'fi'.

0 投票
2 回答
98 浏览

c - 如何避免使用全局变量?

使用全局变量可以吗?我正在使用全局变量,我知道这并不理想。看起来像这样

我正在为我的自定义 shell 使用我的柠檬语法中的变量:

expr(A) ::= IF LSBR expr(B) RSBR SEMICOLON THEN expr(C) SEMICOLON FI. { setresult2(B); A=C; }

现在我想知道是否有比使用全局变量更好的方法?

整个代码都可以在我的 github 上找到。全局变量的目的是处理 shell 扩展和 shell 脚本中的 if 语句,以便我的 shell 可以读取和执行 if 语句。

上下文中的代码是使用更新全局变量的语法的 if 语句的解析,这是在语法和我的 C 之间进行通信的唯一方法:

0 投票
2 回答
299 浏览

c++ - Lemon Parser 跳过了一些事情(或者我的误解)

更新了更多信息

我在用 Lemon 解析一个简单的元素数组时遇到问题。有人可以启发我吗?

我正在尝试使用 mygrammar 定义解析这个字符串“[0 0 612 792][100 200]”,解析器总是跳过第一个数组元素并复制最后一个......知道吗?

语法文件是

我使用 re2c 来获取令牌,并且为每个令牌调用解析器的代码是

对于输入字符串“[ 0 -100 612 792][100 200]”,输出为:

如您所见,第一个元素没有出现,而最后一个元素是重复的。

柠檬的语法是:

示例字符串的输出跟踪是:

我被这个错误困住了,我很确定这是一个我不理解的概念错误。任何帮助表示赞赏。

谢谢

0 投票
1 回答
100 浏览

grammar - Bison/Lemon 文件的语法或规范

我需要为 Bison 和 Lemon 语法文件编写解析器。我正在寻找这些文件格式的规范或语法。任何链接都会有所帮助。

0 投票
1 回答
267 浏览

c - 获取柠檬解析器冲突

我正在尝试使用柠檬编写一个简单的解析器,用于类似 javascript 的语言。我无法解决冲突错误,我怀疑这是一个无法解决的问题。

冲突发生在以下语法之间:

第一个是包含赋值语句的语句块,第二个是定义对象的表达式语句。

解析它们的语法会导致冲突。最小代码如下:

输出文件显示以下内容:

任何有关我如何解决此问题的建议将不胜感激。谢谢。

0 投票
2 回答
1343 浏览

parsing - 如何克服 LALR 语法中的 shift-reduce 冲突

我正在尝试解析正数和负数小数。

包含前两个规则会产生移位/减少冲突,但我不知道如何编写语法以使冲突永远不会发生。我正在使用柠檬解析器。

编辑:来自 .out 文件的冲突

编辑 2:导致问题的最小语法

0 投票
1 回答
37 浏览

parsing - 我们是否必须假设解析器提前预读令牌?

多年后回到词法分析器和解析器,出于上下文的目的,我发现自己对状态变化的概念感到困惑。我使用 Lemon 作为解析器,并把我自己的词法分析器放在一起。

让我们看一个像这样的输入示例:

所以“syscon:”和“sysmemremap:”看起来一样,但一个是 GROUPNAME,另一个是 REGISTERNAME。[groups] 和 [registers] 之间的上下文变化决定了每个令牌在现实中是什么。

是最适合进行上下文更改的解析器吗?由于解析器没有分段语法,其中一组语法适用于一组情况,另一组适用于不同的情况,我认为词法分析器应该是决定“syscon:”如果模式是这样它应该。

编辑:刚刚在维基百科中发现了总结问题的“词法分析器黑客”条目:

如果没有添加上下文,词法分析器无法区分类型标识符和其他标识符,因为所有标识符都具有相同的格式。.... 解决方案通常包括将语义符号表中的信息反馈回词法分析器。也就是说,不是作为从词法分析器到解析器的纯单向管道,而是从语义分析返回到词法分析器的反向通道。

除了(这是我的问题)你能假设解析器预读令牌是什么?如果解析器向前冲并读取更多标记以进行更好的匹配——我希望它至少在某种程度上会这样做,它很可能会遇到解析器中的状态更改对于词法分析器来说为时已晚的情况,因为它已经遇到并处理了该令牌!

还是我想多了?

0 投票
2 回答
92 浏览

sqlite - 如果一组只有一个条目,则柠檬解析器断言失败

这可能是我对解析器如何减少的误解,而不是 SQLite 的柠檬解析器中的潜在错误。我一直在试验数据库输入文件的简单语法。该数据库由至少一个条目集的列表组成,例如“命令”或“地图”或...

这是一个不起作用的语法 - 我已经开始创建条目集,到目前为止我只有一个“命令”:

如果我使用只输入令牌的测试程序运行它,我会得到:

如果我给入口集一个额外的选择:

然后整个事情按预期工作。我认为也许您不允许创建 a::=b 和 b::=c 的情况。你必须有 b ::= c | d 至少。我想了解这是否是我的理解错误。

0 投票
1 回答
231 浏览

parsing - 柠檬解析器减少错误

我正在尝试编写一个语法来解析英文句子中的数字,并且我可以成功解析多达 999 个。一旦我添加了支持数千位的逻辑,我就会遇到reduce解析冲突,我很难过了解是什么原因造成的。

我附上了柠檬生成的 parser.out 文件的一部分,我希望有人能对这个问题有所了解。我还包含了大部分语法,行下的所有内容都可以自行运行,但是一旦我添加了行上数千的逻辑,我就开始遇到问题。

我的想法是我遇到了一个类似于“悬空其他”的问题,但我的分隔符。但是,这通常表现为一个shift-reduce错误,而看起来我只是一个reduce错误。Lemon 文档有点稀疏,我不确定如何读取 parser.out 文件的内容。例如,在 lineHYPHEN reduce 15 ** Parsing conflict **中,15even 指的是什么?

任何帮助将不胜感激!


我的语法文件的一部分:

有错误的 parser.out 部分:

0 投票
2 回答
145 浏览

parsing - 交替和重复解析语法

通过遵循这个问题,我能够为我的解析器的语法添加对交替字符(例如ababa或)的支持。baba

我现在希望通过允许重复字符来扩展它。

例如,我希望能够支持abaaababaababaaa以及。在我的特殊情况下,只a允许重复,但允许重复的解决方案b也很有用。

鉴于另一个问题的规则:

...我尝试将其扩展为支持重复,如下所示:

...但是这种语法是模棱两可的。是否有可能明确这一点,如果可以,有人可以帮我消除歧义吗?

我正在使用柠檬解析器,它是一个 LALR(1) 解析器。