为了自己的乐趣,我正在Haskell中构建一个小型的单文件解析器组合器库.我为这个库给自己带来的一个挑战是构建工具,以便我可以为Java函数签名创建解析器,例如将boolean isPrime(int n)
解析为语言不可知的表示,例如
Function {
returnType = Type {
typeName = "boolean",
subTypes = []
},
functionName = "isPrime",
args = ...
}
然而,当谈到解析Java类型时,我遇到了一个问题.像Tuple<Integer, List<Integer>>
这样的类型可以解析,因为它的语法可以在没有左回归的情况下表示:
javatype := identifier, subtypes
identifier := regex("[a-zA-Z_][a-zA-Z0-9_]*")
subtypes := ('<', javatype, (',', javatype) zero or more times, '>') | NOTHING
(对我糟糕的语法写作技巧和简化Java标识符规则表示歉意)
然而,数组类型引入了左回归,众所周知,解析器组合器很难处理左回归.对于数组类型,我们将javatype
规则更改为:javatype := (javatype, "[]") | (identifier, subtypes)
.这为我们提供了左回归.我们可以try 将规则重写为javatype := (identifier, subtypes) | (javatype, "[]")
,但这意味着对于像int[]
这样的类型,解析器只会解析"int"
而不是"[]"
.
如何重写类型语法规则以避免左回归,同时允许数组类型?