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)