pigeon -- Go 的 PEG 解析器生成器
pigeon 命令基于 解析表达式语法(PEG) 生成解析器。它的语法和语法受到 PEG.js 项目 的启发,而实现则松散地基于 C# 3.0 的解析表达式语法 文章。它解析以 UTF-8 编码的 Unicode 文本。
有关详细用法,请参阅 godoc 页面。另外,请查看 Pigeon Wiki,了解有关 Pigeon 和 PEG 的更多信息。
发布
- v1.0.0 是原始实现的标记版本。
- 已经开始在 v2.0.0 上进行一些计划中的重大更改。
Github 用户 @mna 于2015年4月创建了该软件包,@breml 是该软件包的维护者,截至2017年5月。
自 v1.0.0 以来的重大变化
由于 golang.org/x/tools/imports 的要求,删除了对 Go < v1.9 的支持,该更新是为了反映最近版本 go 的变化。这分别符合 Go Release Maintenance 的 Go Release Policy ,后者声明支持每个主要版本,直到有两个较新的主要版本。
安装
如果正确安装了 $GOPATH 和 $GOBIN 环境变量集,那么运行
$ go get -u github.com/mna/pigeon
这将安装或更新包,并且 pigeon 命令将安装在 $GOBIN 目录中。这个包和这个命令生成的解析器都不需要任何第三方依赖项,除非在语法的代码块中使用这种依赖项。
基本用法
$ pigeon [选项] [PEG_GRAMMAR_FILE]
默认情况下,从stdin读取输入语法,并将生成的代码打印到stdout。 您可以使用-o标志将其保存在文件中。
示例
给定以下语法:
{
// part of the initializer code block omitted for brevity
var ops = map[string]func(int, int) int {
"+": func(l, r int) int {
return l + r
},
"-": func(l, r int) int {
return l - r
},
"*": func(l, r int) int {
return l * r
},
"/": func(l, r int) int {
return l / r
},
}
func toIfaceSlice(v interface{}) []interface{} {
if v == nil {
return nil
}
return v.([]interface{})
}
func eval(first, rest interface{}) int {
l := first.(int)
restSl := toIfaceSlice(rest)
for _, v := range restSl {
restExpr := toIfaceSlice(v)
r := restExpr[3].(int)
op := restExpr[1].(string)
l = ops[op](l, r)
}
return l
}
}
Input <- expr:Expr EOF {
return expr, nil
}
Expr <- _ first:Term rest:( _ AddOp _ Term )* _ {
return eval(first, rest), nil
}
Term <- first:Factor rest:( _ MulOp _ Factor )* {
return eval(first, rest), nil
}
Factor <- '(' expr:Expr ')' {
return expr, nil
} / integer:Integer {
return integer, nil
}
AddOp <- ( '+' / '-' ) {
return string(c.text), nil
}
MulOp <- ( '*' / '/' ) {
return string(c.text), nil
}
Integer <- '-'? [0-9]+ {
return strconv.Atoi(string(c.text))
}
_ "whitespace" <- [ \n\t\r]*
EOF <- !.
生成的解析器可以解析简单的算术运算,例如:
18 + 3 - 27 * (-18 / -3) => -141
可以在 examples/ 子目录中找到更多示例。
有关详细用法,请参阅 godoc 页面。
贡献
请参阅CONTRIBUTING.md文件。
许可
BSD 3-Clause license 许可。 请参阅 LICENSE 文件。
(First edition: vz edited at 2019.08.25)

