我使用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]*
前面提到的快捷方式是左递归。我不知道如何将其转换为右递归语法,以便可以由常规递归下降解析器处理。
我知道有更强大的解析技术可以处理左递归语法,但是我想保持它的右递归,以免在不久的将来手动实现解析器。
答案 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>
如果有问题,我将保留此问题。