用于结构演算的递归下降解析器

时间:2018-06-26 22:35:41

标签: parsing haskell

我使用Megaparsec通过一个简单的monadic解析器在Haskell中实现了构造计算的类型检查器和归约器。现在,我想对其进行改进,以便它可以识别此语法快捷方式:

∀(x:A)->B (with x not free in B)  =  A -> B

此语法的语法如下:

<expr>
    = "(" <expr> ")"
    | <expr> <expr>
    | "λ" "(" <name> ":" <expr> ")" "→" <expr>
    | "∀" "(" <name> ":" <expr> ")" "→" <expr>
    | <expr> "→" <expr>
    | <name>
    | "*"

<name> = [_A-Za-z][_0-9A-Za-z]*

我当前的解析器使用此变体,并且消除了左递归(没有快捷方式):

<expr>
    = "(" <appl> ")"
    | "λ" "(" <name> ":" <appl> ")" "→" <appl>
    | "∀" "(" <name> ":" <appl> ")" "→" <appl>
    | <name>
    | "*"

<appl> = <expr>+

<name> = [_A-Za-z][_0-9A-Za-z]*

前面提到的快捷方式是左递归。我不知道如何将其转换为右递归语法,以便可以由常规递归下降解析器处理。

我知道有更强大的解析技术可以处理左递归语法,但是我想保持它的右递归,以免在不久的将来手动实现解析器。

1 个答案:

答案 0 :(得分:1)

短暂的休息之后,答案就显而易见了。使用与#!/bin/bash -e mvn -f connector/pom.xml versions:update-properties -Dincludes=a.b.c:* mvn -f connector/pom.xml versions:commit 完全相同的技巧,并将其扩展如下:

<appl>

如果有问题,我将保留此问题。