【发布时间】:2018-06-26 22:35:41
【问题描述】:
我使用Megaparsec 使用简单的一元解析器在 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]*
前面提到的快捷方式是左递归的。我不知道如何将其转换为右递归语法,以便可以由传统的递归下降解析器处理。
我知道存在更强大的解析技术可以处理左递归语法,但我想保持它是右递归的,以便在不久的将来留下手动实现解析器的可能性。
【问题讨论】: