使用括号和不同类型的表达式进行解析
Parsing with parenthesis and different types of expressions
我目前正在使用 happy
来解析一种语言,但我不认为解析器是相关的,只是说它是一个 LALR 解析器。这是语法的一小段摘录:
ArithExpr -> ArithExpr + ArithExpr
ArithExpr -> ( ArithExpr )
ArithExpr -> ...
BoolExpr -> ArithExpr == ArithExpr
BoolExpr -> ( BoolExpr )
BoolExpr -> ...
问题是我遇到了减少-减少冲突。我认为当我尝试解析如下内容时会出现问题:
( ( 2 + 3 ) == ( 4 + 5 ) )
只有一种方法可以解析这个表达式,但问题是我认为即使在第一个括号处,解析器也开始出现问题。我认为是这种情况的原因是解析器不知道它将来是否面临 ArithExpr
或 BoolExpr
,并且由于它只有一个前瞻标记,所以它必须进行任意选择哪个可能是错误的。
有没有重写语法来接受这种语言?或者我真的应该将 ArithExpr
和 BoolExpr
都作为一个统一的 Expr
来解析,并在类型检查期间处理实际类型吗?
您应该只解析 Expr
并在语义分析期间进行类型检查。否则,您将很难处理带括号的表达式(直到为时已晚才知道它们是什么类型)或 first-class 布尔值(变量可能具有布尔值,不是吗?) .
参见 的替代方案(但它最终给出了相同的建议);我提供 link 只是为了完整性,因为我真的不相信该答案中描述的技术的价值,但我认为它与不同的 LALR 解析器生成器本质上是同一个问题。
我目前正在使用 happy
来解析一种语言,但我不认为解析器是相关的,只是说它是一个 LALR 解析器。这是语法的一小段摘录:
ArithExpr -> ArithExpr + ArithExpr
ArithExpr -> ( ArithExpr )
ArithExpr -> ...
BoolExpr -> ArithExpr == ArithExpr
BoolExpr -> ( BoolExpr )
BoolExpr -> ...
问题是我遇到了减少-减少冲突。我认为当我尝试解析如下内容时会出现问题:
( ( 2 + 3 ) == ( 4 + 5 ) )
只有一种方法可以解析这个表达式,但问题是我认为即使在第一个括号处,解析器也开始出现问题。我认为是这种情况的原因是解析器不知道它将来是否面临 ArithExpr
或 BoolExpr
,并且由于它只有一个前瞻标记,所以它必须进行任意选择哪个可能是错误的。
有没有重写语法来接受这种语言?或者我真的应该将 ArithExpr
和 BoolExpr
都作为一个统一的 Expr
来解析,并在类型检查期间处理实际类型吗?
您应该只解析 Expr
并在语义分析期间进行类型检查。否则,您将很难处理带括号的表达式(直到为时已晚才知道它们是什么类型)或 first-class 布尔值(变量可能具有布尔值,不是吗?) .
参见