【问题标题】:How to define association on rule without tokens?如何在没有令牌的情况下定义规则关联?
【发布时间】:2015-05-19 04:03:09
【问题描述】:

我有以下最小化语法

Exp : let var '=' Exp in Exp end                     { App (Fn $2 $6) $4 }
    | Exp Exp                                        { App $1 $2 }
    | Exp OpCode Exp                                 { Op $1 Add $3 }
    | '(' Exp ')'                                    { $2 }
    | num                                            { Num $1 }
    | var                                            { Ident $1 }
    | '\\' var '.' Exp                               { Fn $2 $4 }

Exp Exp 规则用于在值中应用函数。但如果我有类似myFunc 1 2 的东西,它默认优先于myFunc (1 2),这不是我想要的。我想要(myFunc 1) 2,用于柯里化。

但是如果我没有非终结符,我该如何定义关联呢?尝试做%left Exp 似乎没有帮助。

【问题讨论】:

    标签: parsing compiler-construction grammar yacc happy


    【解决方案1】:

    您不能真正应用优先级或关联性,除非您有一个要移位的终端,因为优先级和关联性规则用于解决移位/减少冲突。还原时不一定需要终端,因此可以使用假终端并编写:

    Exp: Exp Exp %prec CURRY
    

    但这对您没有帮助,因为没有可比较优先级的终端。优先级关系总是是前瞻符号(终端)的优先级和可能的缩减之间的比较(默认情况下,缩减的优先级基于规则中最右边的终端,但如上所述可以明确指定)。

    由于您不能以速记的方式进行操作,因此您需要退回到老式的风格,在这种风格中,您可以使用明确的优先规则编写明确的语法:

    Curry: Term
         | Curry Term
    

    (顺便说一下,这是左关联的。如果 func 1 2 被解析为 ((func 1) 2),那么应用程序将关联到左侧。)

    假设中缀比应用程序绑定得更紧密,那么您将拥有:

    Term: Value
        | Term Opcode Value
    
    Value: '(' Exp ')'
         | num
         | var
    
    Exp: Curry
    

    (您必须弄清楚如何将 lambdas 集成到其中。这取决于您希望它们如何分组,但希望上面的模型是清晰的。)

    【讨论】:

    • 为什么要使用 Term、Value 和 Exp?你能指点我读一些东西来帮助我更好地组织我的语法吗?
    • @fotanus:因为我没有提前计划。这些名字真的无关紧要:在复杂的语法中,我只是给它们编号。但它们本质上是不同的优先级。这是一个完整写出优先级的 C 语法示例:lysator.liu.se/%28nobg%29/c/ANSI-C-grammar-y.html
    猜你喜欢
    • 2020-02-27
    • 2018-10-17
    • 2020-09-24
    • 2018-10-04
    • 2018-11-13
    • 2019-01-18
    • 2016-12-25
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多