【问题标题】:Defining a left-associative parser with PetitParser使用 PetitParser 定义左关联解析器
【发布时间】:2013-01-28 13:33:20
【问题描述】:

http://pharobooks.gforge.inria.fr/PharoByExampleTwo-Eng/latest/ 中,定义了一个ExpressionGrammar。但是,它是右关联的

parser parse: '1 + 2 + 6'.    ======> #(1 $+ #(2 $+ 6))

我怎样才能让它左关联,以便

parser parse: '1 + 2 + 6'.

结果

#(#(1 $+ 2) $+ 6)

?

【问题讨论】:

    标签: smalltalk pharo petitparser


    【解决方案1】:

    对于左结合文法,使用:

    term := (prod sepratedBy: $+ asParser trim) foldLeft: [ :a :op :b |
    

    ...]

    对于右结合语法使用:

    raise := (prod sepratedBy: $^ asParser trim) foldRight: [ :a :op :b |
    

    ...]

    或者,您可能想查看PPExpressionParser,它会自动为您处理所有细节。您只需告诉它哪些运算符是左关联、右关联、前缀或后缀运算符。请查看课程评论以进行深入讨论。

    【讨论】:

      【解决方案2】:

      看看 PPExpressionParser 类。

      它就是为此而设计的,你在课堂评论中有一个很好的例子

      【讨论】:

        猜你喜欢
        • 2021-07-01
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        相关资源
        最近更新 更多