我目前使用happy
来解析语言,但我不认为解析器是相关的,只是说它是一个LALR解析器。这里是从语法的一小部分摘录:使用括号和不同类型的表达式进行解析
ArithExpr -> ArithExpr + ArithExpr
ArithExpr -> (ArithExpr)
ArithExpr -> ...
BoolExpr -> ArithExpr == ArithExpr
BoolExpr -> (BoolExpr)
BoolExpr -> ...
问题是,我得到减少减少冲突。我想,当我试图解析类似下面的问题出现了:
((2 + 3) == (4 + 5))
只有一种解析这个表达方式,但问题是,我认为即使在解析器开始有一些麻烦,第一个括号。我认为这种情况的原因是,该分析器不知道是否它面临ArithExpr
或在未来BoolExpr
,并且因为它是只得到了超前的一个标记它使这可能是错误的任意选择。
反正是有重写语法接受这种语言?或者我应该真的只是来解析这两个ArithExpr
和BoolExpr
就像一个统一的Expr
和类型检查期间与实际类型处理?