问题标签 [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.

0 投票
1 回答
167 浏览

parsing - 对将模棱两可的语法转换为明确的语法感到困惑

给出了一个模棱两可的语法,我被要求重写语法以使其明确。事实上,我不知道为什么给定的语法是模棱两可的,更不用说将它重写为一个明确的语法了。

给定的语法是 S -> SS | 一个 | b ,我有四个选择:

对于每个选择,我已经知道 D 不正确,因为它根本不生成字符串,C 不正确,因为它只匹配字符串 'a' 和 'b'。

但是,我认为答案是 A 而正确答案是 BI 认为 B 是错误的,因为它只是一遍又一遍地生成 S,而 B 无法处理空字符串。

  1. 为什么给定的语法不明确?</p>

  2. 为什么A不正确而B正确?

0 投票
2 回答
485 浏览

c++ - 解析 int(x) 参数

这是一个带有一个int参数的简单函数:

这是另一个带有一个int参数的函数:

现在让我们定义x一个类型:

(这是我在 gcc 4.8.2 中观察到的行为)

解析器编写者如何处理这种情况?

似乎经典的管道 Lexer -> Parser -> Semantic Checker -> ... 在这里不起作用。

0 投票
1 回答
488 浏览

ambiguous-grammar - 帮助解决不明确的语法

证明下面的语法是不明确的。(为了证明一个文法是不明确的,你必须证明它可以为同一个字符串生成两个解析树。)`

0 投票
1 回答
389 浏览

shift-reduce-conflict - 具有讽刺意味的归约问题

我已经尝试解决这个问题将近 2 周了。起初是 shift-reduce 错误,现在是 reduce-reduce 问题。我已经尝试了很多方法,现在我已经到了需要帮助的地步。我已经编写了多种语言,并且几乎在 10 年前就开始了,这是我第一次真正发帖寻求帮助。

我正在尝试为流行的脚本引擎 Angel Script 编写语法类,我从解析器类中获得了 BNF 语法。您可以在此处找到语言参考http://www.angelcode.com/angelscript/sdk/docs/manual/doc_script.html

在我的课堂上,我为每条规则添加了一条关于我试图复制的 BNF 语法的评论。目前我实际上并没有使用我定义的关键字。一旦我可以让它在没有冲突的情况下工作,我会回去尝试清理它。这是我的课http://pastebin.com/FydCTqmU

您应该能够只创建一个 Dll 并使用语法资源管理器运行它,您将看到所有错误。似乎大多数错误都来自同一个问题,所以我想也许一旦我能解决这个问题,它几乎可以解决所有问题。我编写了一个应用程序来帮助我将语法拆分为更不具体的部分,但我认为这导致我遇到了更多的 reduce-reduce 问题。

我尝试压缩我的代码以希望通过reduce-reduce错误,但它似乎保持完全相同,只是看起来更加混乱。如果有人能帮我把它弄好,我会很乐意通过贝宝寄给他们几百美元。我正要放弃它已经超过 2 周的时间了。我的电子邮件是 Anth0ny229@live.com。

我已经从 shift-reduce 到 reduce-reduce 错误。似乎无论我做什么,我都会遇到问题。我只是无法绕过它,我真的需要帮助。正如我所提到的,我会更乐意向某人支付帮助,只需给我发电子邮件即可。我计划制作一个像 babelua 这样的 Visual Studio 扩展,这样人们就可以使用 Visual Studio 编写 Angel Script 脚本,并希望添加调试支持。它将是免费的,因为我认为这将是一个很好的补充。因此,如果有人能以任何方式提供帮助,只要它最终工作,我会更乐意确保他们得到回报。谢谢你。

状态 S0(不足)输入上的减少-减少冲突: const identifier void int8 int16 int32 int64 int uint8 uint16 uint32 uint64 uint float double bool ? auto :: 移位项目:

减少项目:

过渡:

0 投票
2 回答
274 浏览

grammar - 上下文无关文法 BNF

需要非扩展 BNF 语法的帮助:

例如,字符串 aba、cbc 和 abacbc 在语言中,但字符串 abcabc 不是。

这是我到目前为止所拥有的(正确吗?如果我错了,请纠正我):

s->asbsc|bsasc|ascsb|ɛ

0 投票
1 回答
532 浏览

antlr - Xtext 语法歧义(回溯不起作用)

我正在尝试使用 Xtext 设计一种简单的语言来对数字集进行操作。

以下是该语言中字符串的一些示例:

  • {2,1+6}(一组数字 2 和 7)
  • {1+3, 3+5} + {2..5}(集合 {4, 8} 和 {2, 3, 4, 5} 的并集)

我正在使用以下语法:

当我执行 MWE2 工作流时,我收到以下错误:

我确实在 mwe2 文件中启用了回溯。

我有这段代码:

并且在 mwe2 文件中没有其他提到 ANTLR 的片段。

我使用的 Xtext 版本是 Xtext 2.8.0,集成在 Xtext 网站上的 Full Eclipse 中。

如果已经启用,为什么 ANTLR 建议我启用回溯?我的语法有什么问题吗?

0 投票
2 回答
274 浏览

swift - Swift 如何消除泛型构造函数的歧义?

考虑以下 Swift 表达式

Generic<Foo, Bar>通常,人们会将其解读为对带有参数的构造函数的通用调用(1)

但是,当稍微重新排列标记时,它也可以表示两个单独的比较,例如 ifGenericFooare 一些命名不佳的数字变量:

在这里我们可以观察到,具有像这样的通用构造函数的表达式是高度模棱两可的,即使对人类来说也不容易消除歧义。这里的问题是 Swift 没有new构造函数的关键字,这使得它们在某些情况下与方法调用和操作符有歧义。因此,我对 Swift 编译器(解析器)如何设法消除上述表达式的歧义很感兴趣。它的解析方式是依赖于上下文(类型、变量、函数)还是可以由解析器解析?

0 投票
1 回答
395 浏览

parsing - 解决 LALR 歧义

我最近对 ​​LALR 的了解足以编写一个LALR 生成器,并且我正在尝试为它构建一个 java 或 c# 样式的语法(这里指定了它的开头)。

我知道编写解析器生成器需要付出额外的努力,比如重新发明轮子(为什么不使用 Antlr?),但我的目标是引导一个爱好操作系统,它可以在不依赖第三方工具链的情况下自行编译。我的问题不在于生成器,而在于语法。

我遇到了减少/减少语句和表达式的歧义。

我知道如何解决某些类型的歧义,例如 dangling-else,但是这几个对我来说并不直观,他们让我难过。

解决这些问题的最佳方法是什么?另外,是否有可以用来帮助可视化解决方案的原型制作工具?或者,我应该回到第一方并尝试为语法实现 GLR 解析器生成器吗?

这些声明是合法的:

这是它的设置方式:

因此,当解析器期待一个语句时,*LR(k) 项集内核是method-body -> { * stmts-opt }并且状态的完整项集看起来像这样:

当标识符移动时,下一个状态是:

它被解析或减少,并将下一个状态带到:

潜在的冲突。在父状态中,前瞻没有帮助,因为nested-nameand中有一个点primary-expr。哦,天哪,让我们尝试通过嵌套名称减少:

这里没什么可看的......现在,改为减少如何primary-expr

现在当我们 shift ++ 时,我们得到:

...另一个减少 - 减少冲突。

让我们尝试改变(而不是ident

ident将or(移到堆栈上时也会出现同样的问题。

这些只是我到目前为止遇到的那些。由于basic-name优先于rel-expr,我假设类似的东西x < n会被解释为basic-name -> ident < type-list *,如果它实际上是一个关系表达式,则会出错。

我的大脑已经到了可以真正需要一些帮助的地步。

0 投票
0 回答
121 浏览

xtext - XText:带有标识符的模棱两可的语法

我遇到了一个模棱两可的 Xtext 语法问题,但我找不到正确的解决方案。

我得到的问题是 RESET 语句可能有几个要 RESET 的字段;然而,当一个 ':=' 标记被定位时,解析器应该检测一个 AssignmentStatement 的开始。我曾尝试使用句法谓词,但我只能消除语法的歧义:

但是,您可能会注意到这不是预期的行为,例如:

在 ':=' 标记处返回错误。我尝试将谓词标记添加到 AssignmentStatement:

并且:

但没有成功。在所有情况下都会出现错误:

我很迷茫,所以任何提示都非常感谢。

0 投票
1 回答
531 浏览

grammar - 是否可以使这个 YACC 语法明确?表达式:... | expr expr

我正在yacc / bison中编写一个简单的计算器。

表达式的语法看起来有点像这样:

我已经声明了这样的运算符的优先级。

问题在于最后一条规则:

我想要这条规则,因为我希望能够像5(3+4)(3-24)在我的计算器中那样编写表达式。

是否有可能使这种语法明确?