Parsing 使用括号和不同类型的表达式进行解析

Parsing 使用括号和不同类型的表达式进行解析,parsing,lalr,happy,Parsing,Lalr,Happy,我目前正在使用happy来解析一种语言,但我不认为解析器是相关的,只是说它是一个LALR解析器。下面是语法的一个小摘录: ArithExpr -> ArithExpr + ArithExpr ArithExpr -> ( ArithExpr ) ArithExpr -> ... BoolExpr -> ArithExpr == ArithExpr BoolExpr -> ( BoolExpr ) BoolExpr -> ... 问题是我正在减少冲突。我认为

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

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

BoolExpr -> ArithExpr == ArithExpr
BoolExpr -> ( BoolExpr )
BoolExpr -> ...
问题是我正在减少冲突。我认为当我试图解析如下内容时,问题就出现了:

( ( 2 + 3 ) == ( 4 + 5 ) ) 
解析这个表达式只有一种方法,但问题是,我认为即使在第一个括号中,解析器也会遇到一些问题。我认为这种情况的原因是解析器不知道它将来是面对ArithExpr还是BoolExpr,并且因为它只有一个前瞻标记,所以它必须做出可能是错误的任意选择

是否需要重写语法来接受这种语言?或者我真的应该将ArithExpr和BoolExpr作为一个统一的Expr进行解析,并在类型检查期间处理实际的类型吗?

您应该只解析Expr,并在语义分析期间进行类型检查。否则,您将很难处理括号内的表达式,直到太晚才知道它们是什么类型,或者一级布尔值变量可能有布尔值,否

寻找替代方案,但最终给出相同的建议;我之所以提供完整性链接,只是因为我真的不相信该答案中描述的技术的价值,但我认为,对于不同的LALR解析器生成器,这本质上是同一个问题