问题标签 [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 回答
345 浏览

haskell - 快乐语法中的移位/减少冲突

我有以下(严重剥离)快乐语法

它在模式中的标识符周围存在移位/减少冲突。默认情况下,Happy 选择转换,但在这种情况下,这不是我想要的:它会尝试将所有内容都硬塞进去constant expression,即使它可能是identifier pattern.

我读过优先级/关联性是解决此类问题的方法,但是我添加的任何内容都无法使语法朝着正确的方向发展(公平地说,我一直在黑暗中拍摄)。

使用一些明显的标记化,我想要:

  • x屈服identifier pattern
  • mut x屈服identifier pattern
  • std::pi屈服constant expression
  • point{..}屈服struct pattern
  • std::point{..}屈服struct pattern

基本上,除非有一个{::令牌等待被消费,否则一个标识符应该去identifier patterncase。


如果我的问题不清楚,我深表歉意 - 部分问题是我很难确定问题所在。:(

0 投票
0 回答
489 浏览

parsing - 表达式的语法。四个优先级。法学硕士(1)

我需要知道如何为表达式创建语法以创建解析器和 ast。我有四个优先级:

我做了这个:

我不确定这是否可行,因为当我在论文中制作树时,我没有得到正确的表达式形式,例如:

基本上是因为我先算了。我的语法必须是 LL(1) 并且向右递归,因为我的编译器将是自上而下的。

感谢您的帮助,对不起我的英语

编辑

对不起,我错了,我的意思是自上而下的解析器。我在纸上看到的问题是下一个。例如,我有下一个表达式“7*5+5”,我的 BNF 遵循的顺序是下一个:

Take 7 with Exp in Exps, 跟随 Val

转到 RExp 并继续 RExp3。

取“*”,然后返回 Exps。

我在纸上看到的树是下一个:

我应该拥有的树是下一个:

0 投票
2 回答
601 浏览

grammar - 我怎样才能证明这个语法是模棱两可的?

我想证明这个语法是模棱两可的,但我不确定我应该怎么做。我必须使用解析树吗?

0 投票
1 回答
420 浏览

grammar - 如何使用表达式 a>>b^c 表明具有位运算符的语法是不明确的

我正在尝试解决这个问题,但我真的不知道如何开始。我会很感激一些帮助。

下表中显示了一种语言的按位运算符和语法。运算符和语法规则的优先级从高到低。字符 a、b 和 c 代表语言中的终端。

语法表:

语法表

  1. 使用表达式证明语法是不明确的:a >> b ^ c
  2. 重写语法,使其明确。
0 投票
1 回答
963 浏览

parsing - 歧义语法和最右导数

歧义语法被定义为,“歧义语法是一种上下文无关的语法,其中存在一个字符串,该字符串可以具有多个最左边的派生或解析树。”

我的疑问是,

1)如果语法有多个最右派生词,这是否会使语法模棱两可?

2)如果语法有多个最右导数,这是否意味着它将有多个最左导数?

并且拥有多个最右导数对 LL(1)、LR(0) 解析器、LR(1) 解析器等的解析能力有任何影响,为什么?

一切都是基于最左导数定义和处理的。这可能是因为我们从左向右移动。但是我们能从最右导数中获得任何见解吗?

0 投票
1 回答
297 浏览

parsing - 遵循设置示例不遵循任何规则?

  1. S → asg
  2. S → 如果 C 则 SE
  3. C → 布尔
  4. E → 其他 S
  5. E → λ

所有小写​​字母和 λ 都是终端符号

我需要帮助来推导该语法的以下集合。我通常不会遇到这些问题,而且我知道规则,但是当我从书中练习这个例子时,这是我唯一能得到的:

0 投票
1 回答
473 浏览

grammar - 在我的语法中转移/减少 IF-ELSE 冲突

我正在尝试编写一个小型解析器。不幸的是,我遇到了“减少班次冲突”。语法不是我的强项,我只需要完成这件小事。这是产生错误的简化语法:

提供修改后的语法的解决方案将受到高度赞赏。

编辑:

我修改了适合@rici 答案的语法,但问题仍然存在。这是我的实际语法制作:

这是我正在测试的示例:

我在第一个中遇到错误ELSE。我还尝试按照@rici 的建议声明一个简单的优先级:

但这也没有解决错误。

0 投票
1 回答
80 浏览

grammar - 为什么这个语法模棱两可?

我正在使用 Antlr4。这是我的语法:

我知道这个语法是模棱两可的,而且我知道我应该在语法中添加一个元素,但我不知道如何使语法明确。

0 投票
1 回答
228 浏览

parsing - 语义谓词如何使用来自 ANTLR 4 的侦听器的早期信息?

我有一个基于 ANTLR 4 并使用侦听器而不是访问者的解析器。它已经识别并存储了函数、变量等的声明。

我正在尝试使用语义谓词解决一些语法歧义,例如在解析 VHDL 源代码时将函数调用与数组/向量访问分开。这对于避免完整语法的进一步复杂化很重要。

在以下示例中:

f(i)可以是f带参数的函数,也可以是由 index 访问i的数组。下面的简化示例显示了谓词如何帮助解决这种歧义:fi

侦听器解析声明并将函数和数组标识符存储在数据库中,这允许知道标识符ID是函数、数组还是未声明的(为了简单起见,我没有在此处显示这些声明的任何语法示例)。

谓词的一个例子是,在语法文件的顶部:

但是,我不能在谓词中使用该信息,因为在调用声明的侦听器来构建 ID 数据库之前,它们被调用得太早。如果我System.out.print在这些函数中以及在侦听器中添加 a,我会看到

  • 表达式谓词首先在被解析的整个文件上调用,
  • 然后才调用所有声明侦听器,即使声明在文件中的这些表达式之前也是如此。

我知道解析器正在向前看,但是有没有办法尽快加快声明侦听器的速度,以便为与文件其余部分中的表达式相关的谓词准备好它们的信息?

或者这是使用谓词的错误方式?我想尽可能避免语法中的源代码,例如在解析声明期间存储初步信息的解决方法,其中嵌入了语法文件中的代码。2-pass 解析器似乎有点尴尬。

0 投票
0 回答
592 浏览

java - 解析器堆栈溢出 LL(1)

我正在研究编译器设计,并且正在尝试手动实现 LL(1) 解析器。我已经完成了词法扫描器,它工作得很好。但是,我对消除左递归和左分解还是很陌生。我在 java 中创建了一个 parse() 方法,它正在输出一个 stackoverflow。我认为这是由于我的语法中某些东西的无限递归造成的。可能是什么原因造成的?这是我正在使用的语法:

其中大写字母单词是终端符号。谢谢!

这是一些java代码:

else 语句是我计划实现 eps 的地方