【问题标题】:Parsing with parenthesis and different types of expressions用括号和不同类型的表达式解析
【发布时间】: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,并且由于它只有一个前瞻标记,它必须做出任意选择,这可能是错误的。

有没有重写语法来接受这种语言?还是我真的应该将ArithExprBoolExpr 都解析为一个统一的Expr 并在类型检查期间处理实际类型?

【问题讨论】:

    标签: parsing lalr happy


    【解决方案1】:

    您应该只解析Expr 并在语义分析期间进行类型检查。否则,您将很难处理带括号的表达式(直到为时已晚才知道它们是什么类型)或一流的布尔值(变量可能具有布尔值,不是吗?)。

    请参阅my answer here 以获取替代方案(但最终给出相同的建议);我提供完整链接只是因为我真的不相信该答案中描述的技术的价值,但我认为使用不同的 LALR 解析器生成器本质上是同一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 2011-01-08
      • 2015-12-30
      相关资源
      最近更新 更多