Parsing 用Happy解析函数应用

Parsing 用Happy解析函数应用,parsing,haskell,happy,Parsing,Haskell,Happy,我将如何解析如下内容 f x y 进入 用快乐?现在我有一条规则说 %left APP Expr : Expr Expr %prec APP { APPLY $1 $2 } 但是上面的分析是 APPLY f (APPLY x y) 可以使用语法规则对左/右关联性进行编码 例如,看看这个基本的lambda演算解析器: 可操作的产品有: Expr : let VAR '=' Expr in Expr { App (Abs $2 $6) $4 } | '\\' VAR '-&g

我将如何解析如下内容

f x y
进入

用快乐?现在我有一条规则说

%left APP
Expr : Expr Expr %prec APP { APPLY $1 $2 }
但是上面的分析是

APPLY f (APPLY x y)

可以使用语法规则对左/右关联性进行编码

例如,看看这个基本的lambda演算解析器:

可操作的产品有:

Expr : let VAR '=' Expr in Expr    { App (Abs $2 $6) $4 }
     | '\\' VAR '->' Expr          { Abs $2 $4 }
     | Form                        { $1 }

Form : Form '+' Form               { Binop Add $1 $3 }
     | Juxt                        { $1 }

Juxt : Juxt Atom                   { App $1 $2 }
     | Atom                        { $1 }

Atom : '(' Expr ')'                { $2 }
     | NUM                         { Num $1 }
     | VAR                         { Var $1 }

公认的答案并不令人满意

解决此问题的正确方法是:

%nonassoc VAR LPAREN -- etc...
%nonassoc APP

Expr : Expr Expr %prec APP { APPLY $1 $2 }
即:

  • 添加名为
    APP
    的重影优先令牌,无需将其设置为
    left
    right
    ,因为它不相关,所以您可以将其保留为
    nonassoc
    ,以避免错误的直觉认为它很重要

  • %prec APP
    标记您的
    Expr
    规则

  • 最重要也是经常被遗忘的,您需要为所有可能作为
    Expr
    产品的第一个标记出现的标记赋予低于
    APP
    的优先级,通常通过在上面某处列出它们来实现,或者使用
    ,或
    nonassoc
    用于不关联的

你的审判失败的原因可能是你错过了最后一步

需要最后一步的原因是,在决定是移动下一个令牌还是减少
APP
规则时,算法将比较
APP
规则的优先级与传入令牌的优先级。默认情况下,您未提及的标记具有较高的优先级。因此,当面对:

Expr Expr . LPAREN VAR RPAREN
例如,它会将
APP
规则的优先级(to reduce)与
LPAREN
的优先级(to shift)进行比较,除非您正确设置它,否则它将移位,并执行错误的操作



你的语法很难看,也很令人不快。

这对我很有帮助。谢谢。@Paulotorens如果你想得到更深入的解释,我写了一篇关于这个问题的博文:
Expr Expr . LPAREN VAR RPAREN