我目前happy
用来解析一种语言,但我认为解析器不相关,只是说它是一个 LALR 解析器。这是语法的一小段摘录:
ArithExpr -> ArithExpr + ArithExpr
ArithExpr -> ( ArithExpr )
ArithExpr -> ...
BoolExpr -> ArithExpr == ArithExpr
BoolExpr -> ( BoolExpr )
BoolExpr -> ...
问题是我遇到了减少减少冲突。我认为当我尝试解析以下内容时会出现问题:
( ( 2 + 3 ) == ( 4 + 5 ) )
只有一种方法可以解析这个表达式,但问题是我认为即使在第一个括号中解析器也开始出现问题。我认为是这种情况的原因是解析器不知道它在未来是面对 aArithExpr
还是面对 a BoolExpr
,并且由于它只有一个前瞻标记,它必须做出可能是错误的任意选择。
反正有没有重写语法来接受这种语言?或者我真的应该在类型检查期间将两者都解析ArithExpr
为BoolExpr
一个制服Expr
并处理实际类型吗?