问题标签 [lalr]

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 回答
1110 浏览

c# - 讽刺的是:如何让 KeyTerm 优先于变量?

Irony语法的相关块:

问题是“标签”和“变量”都可以出现在同一个地方。我希望我的解析器更喜欢标签而不是变量,但它总是更喜欢变量。我该如何改变呢?

我试过改成tag_blk.RulePreferShiftHere() + html_tag_kw + attr_args_opt + block;ImplyPrecedenceHere(-100) + html_tag_kw + attr_args_opt + block;没有任何帮助。解析器甚至不会抱怨歧义。

0 投票
1 回答
988 浏览

parsing - bison/yacc 语法消歧

我有以下野牛语法(作为更复杂语法的一部分):

它描述了包含标识符、常量和具有模式匹配的 lambda 函数的表达式,如下所示:
/code> 问题是 1 移位/减少冲突,由嵌套匹配的歧义引起,如下例所示: /code> 规则是匹配块与最近的函数相关,如在上面的示例中显示为缩进。

我的问题是 - 我怎样才能重写这个语法来消除这种歧义(不使用 %left %right yacc 指令)?

0 投票
1 回答
782 浏览

c# - GPPG (bison) - 如何实现一个“表达表达”的概念

我们正在使用 GPPG(本质上是 C# 的野牛)为编程语言生成解析器。一切都很好,除了一个非常讨厌的地方。我们正在解析的语言有一种“隐式比较”规则,其中“表达式表达式”应该被解释为“表达式 == 表达式”。

例如,这是一个完全有效的陈述:

这显然在解析器生成期间引入了各种冲突。我第一次尝试解决它们是沿着这些思路进行的(为简洁起见进行了编辑)。我试图对规则进行一些重构,它似乎不再模棱两可了,但我一定只是遗漏了一些明显的东西。

这是一个非常小的语法,显示了我遇到的冲突,以及我如何尝试解决它,但不起作用

任何帮助将不胜感激

0 投票
1 回答
343 浏览

javascript - 需要关于一个 LALR(1) 解析的帮助

我正在尝试解析一种无上下文的语言,称为Context Free Art。我使用类似 YACC 的 JS LALR(1) 解析器生成器JSCC在 Javascript 中创建了它的解析器。

以下面的 CFA (Context Free Art) 代码为例。此代码是有效的 CFA。

注意上面的Aand ss是缩放 的命令CIRCLE,但A只是此规则的名称。在语言的语法中,我设置s为标记SCALEA属于标记STRING(我有一个正则表达式来匹配字符串,它位于所有标记的底部)。

这工作正常,但在以下情况下它会中断。

这也是一个完全有效的代码,但是由于我的解析器在标记s之后标记ruleSCALE标记,所以它错误地指出它正在期待STRING.

现在我的问题是,是否有任何方法可以重写解析器的生产规则来解决这个问题?相关的生产规则是:-

我能想到的一个简单的解决方案是创建上述规则的副本,STRING替换为SCALE,但这只是需要此类修复的许多类似规则之一。此外,还有许多其他终端可以匹配到STRING。所以这意味着太多的规则!

0 投票
4 回答
54693 浏览

parsing - LL(1)、LR(1)、LR(0)、LALR(1) 文法的例子?

是否有一个很好的在线资源,其中包含一些主要解析算法(LL(1)、LR(1)、LR(0)、LALR(1))的语法集合?我发现许多属于这些家族的单独语法,但我不知道有人写过大量示例语法的好资源。

有人知道这样的资源吗?

0 投票
2 回答
1140 浏览

parsing - Lemon LALR 解析器的简单语法

一段时间以来,我一直坚持这一点。我想解析一些简单的东西:

喜欢:word1 word2 .. wordN 讨厌:word1 word2 .. wordN

我正在使用柠檬+Flex。目前我的语法看起来像这样:

但这仅适用于前 2 个单词。显然我做错了什么,可能在递归定义中?任何提醒表示赞赏:)

0 投票
1 回答
401 浏览

c++ - Bison 中的操作顺序

我正在尝试使用 Bison 在 C++ 中生成解析器。语法很好,但我在操作上遇到了一些麻烦。这是一个简单的示例:

据我所知,这是一件很正常的事情。我的问题是哪个先派生。例如,如果我有一个看起来像的输入

Bison 是否将我的行为称为

或者

我正在尝试构建此处调用的规则的链接列表,并且我想保持列表与输入的顺序相同。现在,我有

编辑:好的,所以我可以这样做:

0 投票
1 回答
829 浏览

bison - Bison-移位/减少冲突

我知道在 Bison 代码中,会出现一些移位/减少冲突,而正常的 C 语法会产生一个 for if/else. 但是,我的语法会产生330个其他移位/减少冲突。这是否表明我的语法存在严重问题?我应该花时间寻找每个冲突并尝试解决或验证它的正确性吗?我正在使用常规的 LALR 解析器。

编辑:

这是我的语法,我去掉了所有的动作和其他东西。

我取得了一点进展。你是对的——这是一次又一次的冲突。原来,我试图通过注释掉规则的内容(特别是 var 规则)来从语法中删除一个关键字,所以每当 Bison 遇到曾经使用它的东西时,它不知道是否要减少空规则。现在我只有三个 shift/reduce... 和两个 reduce/reduce... 冲突。

所以我想我对原始问题的回答是肯定的,有 330 次移位/减少冲突是一个非常糟糕的信号。

0 投票
1 回答
170 浏览

c - 将节点放入不应该存在的解析树中

我正在为一种语言编写解析器,而扫描仪旨在

  1. 要么也返回不需要的终端(例如空格)要么
  2. 不这样做

基于布尔标志。

现在,在解析器中,我不想用所有这些终端来混淆语法,它们应该被我正在构建的解析树以某种方式“自动”吞下。

为了做到这一点“魔术”,我想我会链接终端(简单链接的循环列表),这样我就可以迭代它们并在减少发生时“填补空白”(我使用的是 LALR(1) 解析器生成器) .

这听起来像是一个理智的想法,尽管有一个问题。还记得我说过“要么返回……要么不返回”吗?在场景(2)中,我会释放终端,因为谁知道接下来会发生什么?而且我不想要任何内存泄漏。

但是在场景 (1) 中,我无法释放终端,因为基于它们,我将进一步减少“填空”过程应该停止的位置。

我也不能有条件地释放它,原因相同:我不知道接下来会发生什么。如果不会触发任何“填空”过程怎么办?如果根本不会进一步减少怎么办?

你有过类似的问题吗?你是怎么解决的?

注意:这都是我的想法,我可能解释得不够清楚,请提问,我会编辑我的问题。这个场景实际上有点复杂,我不是从头开始写的,我可以在这里发挥我的想象力,我正在将它整合到其他东西中,所以我很可能会回答“我不能那样做因为环境限制”。


附录

我想到的唯一真正好的想法是分叉和改进解析器生成器,我已经在一些小地方做过,以克服我上面提到的一些限制。

0 投票
2 回答
936 浏览

grammar - 歧义语法(使用 Bison)

我有一个模棱两可的语法问题。我有这个:

这是我真正的语法的一个子集,可以单独编译。目前,它在遇到流之间function_callfunction_definition遇到流时会产生 S/R 冲突identifier (。我试图通过统一函数调用和函数定义的语法来说服 Bison,直到令牌流的后期才需要做出决定。换句话说,如果它遇到调用和定义共同的东西,它可以减少它而不需要知道哪个是哪个,如果它遇到其他东西,其他东西会清楚地标记哪个是哪个。这甚至可能吗?如果可以,我该怎么做?如果可能的话,我真的宁愿避免改变输入流的结构。