0

我目前happy用来解析一种语言,但我认为解析器不相关,只是说它是一个 LALR 解析器。这是语法的一小段摘录:

ArithExpr -> ArithExpr + ArithExpr
ArithExpr -> ( ArithExpr )
ArithExpr -> ...

BoolExpr -> ArithExpr == ArithExpr
BoolExpr -> ( BoolExpr )
BoolExpr -> ...

问题是我遇到了减少减少冲突。我认为当我尝试解析以下内容时会出现问题:

( ( 2 + 3 ) == ( 4 + 5 ) ) 

只有一种方法可以解析这个表达式,但问题是我认为即使在第一个括号中解析器也开始出现问题。我认为是这种情况的原因是解析器不知道它在未来是面对 aArithExpr还是面对 a BoolExpr,并且由于它只有一个前瞻标记,它必须做出可能是错误的任意选择。

反正有没有重写语法来接受这种语言?或者我真的应该在类型检查期间将两者都解析ArithExprBoolExpr一个制服Expr并处理实际类型吗?

4

1 回答 1

1

您应该Expr在语义分析期间解析并进行类型检查。否则,您将很难处理带括号的表达式(直到为时已晚才知道它们是什么类型)或一流的布尔值(变量可能具有布尔值,不是吗?)。

请在此处查看我的答案以获取替代方案(但最终给出了相同的建议);我提供完整链接只是因为我真的不相信该答案中描述的技术的价值,但我认为这本质上是使用不同的 LALR 解析器生成器的相同问题。

于 2017-05-08T14:41:18.597 回答