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