【问题标题】:How would I implement parsing using operator precedence?我将如何使用运算符优先级实现解析?
【发布时间】:2010-11-12 12:58:29
【问题描述】:

我想使用运算符优先级来实现解析。我已经实现了 +、-、* 和 /。我将如何在不使用任何语法的情况下实现休息?这是一个大学项目,不允许使用 yacc 或 bison。

【问题讨论】:

  • 您可能会觉得这很有趣/有用:blogs.msdn.com/b/ericlippert/archive/2010/10/04/…
  • @Lazarus: "The homework tag...is now discouraged," 但是,@sanjoy,请(一如既往)遵循general guidelines:说明任何特殊限制,展示您迄今为止尝试过的内容,并询问具体是什么令人困惑你。
  • @Roger Pate:当然是现在,毕竟这会阻止人们逐字发布他们的家庭作业问题并且实际上必须学习。而且我认为工作场所的政治正确性已经过了荒谬的地步。
  • @Lazarus:逐字逐句的作业将带有或不带有 [homework] 标签;没有努力并因此过于模糊而无法合理回答的问题应该被否决并关闭,并说明如何更好地提出问题(我已经完成了所有三个here)。使用 [homework] 以某种方式表明其他回答者应该以特定方式做出回应是令人困惑和矛盾的,但更重要的是,它无助于 OP 学习,而且我相信,最终会对该目标产生积极的危害:说只要使用特定的标签,就可以毫不费力地发布一个模糊的问题。
  • 你的语法怎么样?它是一门成熟的语言,还是只是一些数学方程式?

标签: parsing operator-precedence


【解决方案1】:

您需要的是一个递归下降解析器(因为这是唯一可以轻松手动编写的解析器)。详情见维基百科,很简单。

所以,要获得正确的运算符优先级,您可以执行以下操作:

term = number
unary = ('-' | '+')* term
multiplication = unary ('*' | '/' unary)*
addition = multiplication ('+' | '-' multiplication)*
expression = addition

“表达式”是您的起始规则。

【讨论】:

  • 任何语法都可以通过运算符优先级解析来实现?
  • 不,可以通过任何合适的解析机制来实现语法(递归下降是一种方法)。运算符优先级只是语法的一个特性,与选择的解析方法无关。
【解决方案2】:

由于您不允许使用解析器生成器,我建议您阅读Recursive descent parser Dragon Book中包含了很好的介绍

【讨论】:

    【解决方案3】:

    如果您需要快速修复:

    http://www.codecodex.com/wiki/index.php?title=Recursive_descent_parsing

    更广泛的阅读:

    Basic Compiler Design

    GLHF!

    【讨论】:

      猜你喜欢
      • 2015-07-09
      • 2018-04-12
      • 2021-12-19
      • 2016-07-31
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2015-05-24
      • 2011-10-14
      相关资源
      最近更新 更多