我尝试了几种不同的解析器生成器(Bison、DParser 等),它们声称能够生成 GLR 解析器,即可以处理不明确的语法的解析器。这是我正在讨论的类型的一个非常简单的二义性语法:
START: A | B;
A: C | D;
B: C | D;
C: T1 | T2;
D: T3 | T4;
T1: 't1';
T2: 't2';
T3: 't3';
T4: 't4';
Run Code Online (Sandbox Code Playgroud)
我可以很好地生成解析器,但是当我提供应该有效的解析器输入时,我会遇到“未解决的歧义”错误或直接崩溃。当我将语法更改为明确的版本时,不会出现任何类型的问题。
我对 GLR 解析器有什么不理解的地方?我认为重点是,在歧义的情况下,所有可能的解析都会被跟踪,直到它们合并或到达死胡同。我所需要的只是一个解析器,它可以告诉我输入是否有任何有效的解析。
谢谢你的帮助。
编辑:
这令人沮丧。使用 %dprec 和 %merge 我已经能够让 Bison 处理不明确的规则和终端,但它仍然对我需要处理的那种非常简单但高度病态的伪英语语法感到窒息:
S: NP VP | NPA VP;
NPA: D N | NP PP;
NP: D N | NP PP | NPA;
VP: V NP | VP PP;
PP: P NP;
D: "the" | "a";
P: "in" …Run Code Online (Sandbox Code Playgroud) 我在Python 2.7中运行以下代码
import numpy
a = numpy.ndarray(shape=(2,2), dtype=float, order='F')
print numpy.mean(a)
numpy.savetext('foo.txt', a)
Run Code Online (Sandbox Code Playgroud)
并得到这个结果
[me@foo bar]$ python f.py
8.79658981512e-317
Traceback (most recent call last):
File "f.py", line 4, in <module>
numpy.savetext('foo.txt', a)
AttributeError: 'module' object has no attribute 'savetext'
Run Code Online (Sandbox Code Playgroud)
怎么了?