问题标签 [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.
c# - 讽刺的是:如何让 KeyTerm 优先于变量?
Irony语法的相关块:
问题是“标签”和“变量”都可以出现在同一个地方。我希望我的解析器更喜欢标签而不是变量,但它总是更喜欢变量。我该如何改变呢?
我试过改成tag_blk.Rule
,PreferShiftHere() + html_tag_kw + attr_args_opt + block;
但ImplyPrecedenceHere(-100) + html_tag_kw + attr_args_opt + block;
没有任何帮助。解析器甚至不会抱怨歧义。
parsing - bison/yacc 语法消歧
我有以下野牛语法(作为更复杂语法的一部分):
/code>
问题是 1 移位/减少冲突,由嵌套匹配的歧义引起,如下例所示:
/code>
规则是匹配块与最近的函数相关,如在上面的示例中显示为缩进。
我的问题是 - 我怎样才能重写这个语法来消除这种歧义(不使用 %left %right yacc 指令)?
c# - GPPG (bison) - 如何实现一个“表达表达”的概念
我们正在使用 GPPG(本质上是 C# 的野牛)为编程语言生成解析器。一切都很好,除了一个非常讨厌的地方。我们正在解析的语言有一种“隐式比较”规则,其中“表达式表达式”应该被解释为“表达式 == 表达式”。
例如,这是一个完全有效的陈述:
这显然在解析器生成期间引入了各种冲突。我第一次尝试解决它们是沿着这些思路进行的(为简洁起见进行了编辑)。我试图对规则进行一些重构,它似乎不再模棱两可了,但我一定只是遗漏了一些明显的东西。
这是一个非常小的语法,显示了我遇到的冲突,以及我如何尝试解决它,但不起作用
任何帮助将不胜感激
javascript - 需要关于一个 LALR(1) 解析的帮助
我正在尝试解析一种无上下文的语言,称为Context Free Art。我使用类似 YACC 的 JS LALR(1) 解析器生成器JSCC在 Javascript 中创建了它的解析器。
以下面的 CFA (Context Free Art) 代码为例。此代码是有效的 CFA。
注意上面的A
and s
。s
是缩放 的命令CIRCLE
,但A
只是此规则的名称。在语言的语法中,我设置s
为标记SCALE
并A
属于标记STRING
(我有一个正则表达式来匹配字符串,它位于所有标记的底部)。
这工作正常,但在以下情况下它会中断。
这也是一个完全有效的代码,但是由于我的解析器在标记s
之后标记rule
为SCALE
标记,所以它错误地指出它正在期待STRING
.
现在我的问题是,是否有任何方法可以重写解析器的生产规则来解决这个问题?相关的生产规则是:-
我能想到的一个简单的解决方案是创建上述规则的副本,STRING
替换为SCALE
,但这只是需要此类修复的许多类似规则之一。此外,还有许多其他终端可以匹配到STRING
。所以这意味着太多的规则!
parsing - LL(1)、LR(1)、LR(0)、LALR(1) 文法的例子?
是否有一个很好的在线资源,其中包含一些主要解析算法(LL(1)、LR(1)、LR(0)、LALR(1))的语法集合?我发现许多属于这些家族的单独语法,但我不知道有人写过大量示例语法的好资源。
有人知道这样的资源吗?
parsing - Lemon LALR 解析器的简单语法
一段时间以来,我一直坚持这一点。我想解析一些简单的东西:
喜欢:word1 word2 .. wordN 讨厌:word1 word2 .. wordN
我正在使用柠檬+Flex。目前我的语法看起来像这样:
但这仅适用于前 2 个单词。显然我做错了什么,可能在递归定义中?任何提醒表示赞赏:)
c++ - Bison 中的操作顺序
我正在尝试使用 Bison 在 C++ 中生成解析器。语法很好,但我在操作上遇到了一些麻烦。这是一个简单的示例:
据我所知,这是一件很正常的事情。我的问题是哪个先派生。例如,如果我有一个看起来像的输入
Bison 是否将我的行为称为
或者
我正在尝试构建此处调用的规则的链接列表,并且我想保持列表与输入的顺序相同。现在,我有
编辑:好的,所以我可以这样做:
bison - Bison-移位/减少冲突
我知道在 Bison 代码中,会出现一些移位/减少冲突,而正常的 C 语法会产生一个 for if/else
. 但是,我的语法会产生330个其他移位/减少冲突。这是否表明我的语法存在严重问题?我应该花时间寻找每个冲突并尝试解决或验证它的正确性吗?我正在使用常规的 LALR 解析器。
编辑:
这是我的语法,我去掉了所有的动作和其他东西。
我取得了一点进展。你是对的——这是一次又一次的冲突。原来,我试图通过注释掉规则的内容(特别是 var 规则)来从语法中删除一个关键字,所以每当 Bison 遇到曾经使用它的东西时,它不知道是否要减少空规则。现在我只有三个 shift/reduce... 和两个 reduce/reduce... 冲突。
所以我想我对原始问题的回答是肯定的,有 330 次移位/减少冲突是一个非常糟糕的信号。
c - 将节点放入不应该存在的解析树中
我正在为一种语言编写解析器,而扫描仪旨在
- 要么也返回不需要的终端(例如空格)要么
- 不这样做
基于布尔标志。
现在,在解析器中,我不想用所有这些终端来混淆语法,它们应该被我正在构建的解析树以某种方式“自动”吞下。
为了做到这一点“魔术”,我想我会链接终端(简单链接的循环列表),这样我就可以迭代它们并在减少发生时“填补空白”(我使用的是 LALR(1) 解析器生成器) .
这听起来像是一个理智的想法,尽管有一个问题。还记得我说过“要么返回……要么不返回”吗?在场景(2)中,我会释放终端,因为谁知道接下来会发生什么?而且我不想要任何内存泄漏。
但是在场景 (1) 中,我无法释放终端,因为基于它们,我将进一步减少“填空”过程应该停止的位置。
我也不能有条件地释放它,原因相同:我不知道接下来会发生什么。如果不会触发任何“填空”过程怎么办?如果根本不会进一步减少怎么办?
你有过类似的问题吗?你是怎么解决的?
注意:这都是我的想法,我可能解释得不够清楚,请提问,我会编辑我的问题。这个场景实际上有点复杂,我不是从头开始写的,我可以在这里发挥我的想象力,我正在将它整合到其他东西中,所以我很可能会回答“我不能那样做因为环境限制”。
附录
我想到的唯一真正好的想法是分叉和改进解析器生成器,我已经在一些小地方做过,以克服我上面提到的一些限制。
grammar - 歧义语法(使用 Bison)
我有一个模棱两可的语法问题。我有这个:
这是我真正的语法的一个子集,可以单独编译。目前,它在遇到流之间function_call
和function_definition
遇到流时会产生 S/R 冲突identifier (
。我试图通过统一函数调用和函数定义的语法来说服 Bison,直到令牌流的后期才需要做出决定。换句话说,如果它遇到调用和定义共同的东西,它可以减少它而不需要知道哪个是哪个,如果它遇到其他东西,其他东西会清楚地标记哪个是哪个。这甚至可能吗?如果可以,我该怎么做?如果可能的话,我真的宁愿避免改变输入流的结构。