问题标签 [ambiguous-grammar]
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.
bison - 如何解决这种模棱两可的语法?
我正在创建一个编译器,我正在使用 lex 和 bison。
这是我语法的一部分:
我已将上述内容更改为此,但它增加了减少/减少错误的数量。它减少了移位/减少错误的数量。
有什么办法可以让它们都减少吗?
谢谢!
grammar - 乔姆斯基语言:如何识别它们?
我对语言的识别有问题。例如,给定某种语言,如何根据乔姆斯基快速确定属于哪种类型?ancb2n, n > 0
我的想法是确定生成它的语法,然后确定语言,但这是一个漫长的过程。我认为还有另一种方法可以通过肉眼识别它,而无需编写语法或自动机。有人能帮我吗?
parsing - 左分解一个语法
所以我有这个语法(如下),我需要建立一个解析表。我需要使它适合预测解析器。我知道第一个想法是让它明确,但对我来说它已经明确(因为我找不到可以为其绘制 2 个不同解析树的字符串)。其次,我需要将其考虑在内。我把我的猜测放在原来的语法下面,我觉得我错过了一些东西,如果我错过了一些东西,有人可以指出。
我猜:
antlr - 我的 antlr 解析器语法出现左递归错误
我收到错误
我不确切知道我的语法的哪一部分引发了这个错误。和 1 个其他相同的错误,用于 alt 3,4
我不知道哪个部分需要重新排列以删除左递归,如果有人能指出这一点,我将不胜感激。
context-free-grammar - 我怎样才能证明这个语法是模棱两可的?
S → ASB | ab | SS
A → aA | ε
B → bB | ε
programming-languages - 解决语法歧义
我有这样的语法规则;
我可以发现这个语法有歧义,但是我该如何修改这个语法来解决歧义呢?
ambiguity - 语义导向的解析器组合器
我试过这个
带输出
如您所见,第二次解析失败。似乎第一次生产的失败不再尝试第二种选择。我实际上希望根据第一个标识符的值来选择这个或那个解析器继续。
parsing - Tcpdump BPF 语法歧义
在 tcpdump/libpcap 语法中观察这些 BPF 过滤器:
我认为主机 z 匹配上述所有内容(6 除外,因为它的语法无效)。我的问题是第 4 行。tcpdump 程序认为它等同于第 5 行,但我认为这不直观,因此不正确。第 5 行是明确的,第 3 行也是如此。但是,第 4 行可以同时表示两件事,这取决于你如何看待事物。我认为,因为你不能将 y 与“host”关键字分开,所以将第 4 行视为第 5 行是错误的。
这背后的解析逻辑是什么?谁能解释为什么 1 == 4 == 5 以及为什么 2 != 4 和 3 != 4 ?
grammar - 如何显示以下语法有歧义?
我定义了以下语法:
经过一段时间的工作,我仍然找不到一个字符串来构造一个独特的解析树来表明这个语法是模棱两可的。比如:aaabbb,abab等。看起来这个语法是明确的。有什么帮助吗?
antlr - XText Dangling Else - 另一个选项
所以我一直在使用 X-Text 和句法谓词。
经典的例子是悬空 else 问题,给出的解决方案是贪婪地解析 else 语句,即不要终止内部表达式,如下所示:
IfStatement:
'if' condition=Expression 'then' then=Expression
(=>'else' else=Expression)?;
我有一个进程语法,其中两个可以组合以使用二元运算符创建一个大进程,例如
process 1 + process 2
提供进程 1 和进程 2 之间的选择
此外,进程可能会调用其他进程:
process 1 -> process 2
表示先执行进程1,然后执行进程2。
在我的语法中,以下内容:
process 1 -> process 2 + process 3
应该解释为
(process 1 -> process 2) + process 3
但是,考虑到这是一个悬而未决的问题,每个人给出的解决方案都为我提供了错误的解决方案。那么,在 X-Text 中,我怎么能说,“如果有意义,并且程序仍在解析,请尽早跳出内部语句”
为了清楚起见,这是我的语法片段:
PProc:
PProcAtomic ({Binary.left = current} '+' right=Proc)?
;
PProcAtomic returns PProc:
dotted=Dotted (fields+=Field)* type="->" proc=Proc
| bool=Bool type="&" proc=Proc
| type="(" proc=Proc ")"
| type="||" (gens+=Gen)+ "@" "[" rset=Set "]" proc=Proc
| type="|~|" (gens+=Gen)+ "@" proc=Proc
| type="[]" (gens+=Gen)+ "@" proc=Proc
| type="|||" (gens+=Gen)+ "@" proc=Proc
| type=";" (gens+=Gen)+ "@" proc=Proc
| type="[|" rset=PSet "|]" (gens+=Gen)+ "@" proc=Proc
| type="|[" rset=PSet "]|" (gens+=Gen)+ "@" proc=Proc
| type="<->" (gens+=Gen)+ "@" "[" (exprs+=Expr)+ "]" proc=Proc
| type="STOP"
| type="SKIP"
| type="CHAOS" "(" rset=PSet ")"
;
Proc:
PProc
| "namedprocess"
;
显然,如果我将 '=>' 放在“+”上,那么它会贪婪地消耗它,从而导致错误的 AST。我如何让它“向前看”一个“+”符号,然后如果它看到的话,将语句分成两部分?