我正在使用Bison 2.7编写GLR解析器并打开%error-verbose选项。当我运行解析器时,它给了我"语法不明确"错误。有没有一种方法,Bison可以给我更详细的语法在何处/如何模糊不清?
答案 0 :(得分:3)
如果您希望生成有意义的错误消息,您可能需要制作自己的函数来报告歧义。 bison
确实为您提供了一个基本工具:custom %merge
function。
如手册中所示(请参阅上面链接末尾的段落),您可以在制作中使用%merge
子句指定自定义合并功能,这可能会导致含糊不清。合并函数可以做很好的事情,包括信号错误,但是有一些限制:
合并函数的参数是语义值(YYSTYPE
),它将是模糊生成的子类型。模糊右侧的语义动作将在调用合并函数之前执行,因此如果语义动作改变全局解析器状态,则该状态可能不一致并且合并函数将必须清理。 (因此,建议此类语法中的语义操作不会修改全局状态。)合并函数必须返回相应类型的语义值。
如果可能有歧义的产品有不同的类型,你可能需要为每种类型创建一个不同的合并函数,因为除非你编码,否则无法知道语义联合的哪个元素适合特定的联合值进入YYSTYPE
本身。这样做的一个简单方法是创建一个有区别的联盟"通过包含枚举标记作为每个联合成员的第一个元素。 (C/C++
允许您使用任何工会成员访问此类标记,但必须在此开始才能使用此工具。)
使用两个语义值调用merge函数。因此,如果有两个以上可能的解析,它将被多次调用。
合并功能无法访问位置信息,除非该信息包含在语义类型中(这相当于失去了拥有单独位置堆栈IMHO的观点,但当然您只需要包含位置可能参与歧义的类型信息。)
答案 1 :(得分:0)
添加以下定义:
#define YYDEBUG 1
,Bison将显示所有可能导致语法不明确的解析选项。