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