2017-05-08 44 views
0

我目前使用happy来解析语言,但我不认为解析器是相关的,只是说它是一个LALR解析器。这里是从语法的一小部分摘录:使用括号和不同类型的表达式进行解析

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

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

问题是,我得到减少减少冲突。我想,当我试图解析类似下面的问题出现了:

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

只有一种解析这个表达方式,但问题是,我认为即使在解析器开始有一些麻烦,第一个括号。我认为这种情况的原因是,该分析器不知道是否它面临ArithExpr或在未来BoolExpr,并且因为它是只得到了超前的一个标记它使这可能是错误的任意选择。

反正是有重写语法接受这种语言?或者我应该真的只是来解析这两个ArithExprBoolExpr就像一个统一的Expr和类型检查期间与实际类型处理?

回答

1

你应该只解析Expr,做类型语义分析期间检查。否则,你将有真的很难对付任何括号表达式(你不能告诉他们是什么类型的,直到为时已晚)或一流的布尔值(一个变量可能有一个布尔值,不是吗?)。

参见my answer here一种替代(但它最终给予同样的建议);我只是提供了完整性的链接,只是因为我确实不相信这个答案中描述的技术的价值,但我认为它与不同的LALR解析器生成器本质上是相同的问题。

相关问题