【问题标题】:Does ply's YACC support the Extended Backus-Naur Form?ply 的 YACC 是否支持扩展的 Backus-Naur 形式?
【发布时间】:2016-12-08 23:11:59
【问题描述】:

The examples I've seen 始终使用“简单”BNF。这是我愚蠢的开发的一部分的示例:

def p_expression(p):
    """expression : NUMBER
                | NAME
                | NEGATION
                | INCREMENT
                | DECREMENT
                | expression operator expression"""

if __name__ == "__main__":
    lex.lex()
    yacc.yacc()
    data = "32 <+> 10 |"
    result = yacc.parse(data)

如果我想解析一个带括号的数学表达式以及它的整个递归地狱just like in this answer that uses the extended one,该怎么办?有可能吗?

【问题讨论】:

标签: python parsing yacc bnf ply


【解决方案1】:

不,PLY(如 yacc)不支持扩展 BNF。

您参考的页面提供了构建自顶向下解析器的策略,而由yacc(以及Bison、PLY和其他衍生产品)构建的解析器构建自底向上解析器。自底向上解析器的优势在于,用于解析的语法与语言的实际语法结构有更密切的对应关系,因此可以直接用于构建 AST(抽象语法树)。

BNF 中的算术表达式语法通常非常简单(尽管不像您问题中的模棱两可语法那么简单),特别是如果您使用 yacc(和 PLY)提供的运算符优先级声明。

【讨论】:

  • 我正在考虑作弊,定义一个“p_python_expression”并使用 eval()。这样,任何来自 Python 的表达式都可以工作。我是“编译器”的初学者,所以我首先选择了 Python 和 lex + yacc。
  • @EricsonWillians:如果你真的构建了 AST,你会学到更多。这并不难,并且有很多示例可以指导您。这些都不会阻止您将字符串表示重新连接在一起并调用 eval,但是通过 AST 进行评估也非常容易,甚至可能更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多