在goyacc
的yacc
解析器中获取某种形式的上下文的最惯用的方法是什么,即在传统的yacc
中模仿%param
命令?
我需要在某些上下文中解析我的.Parse
函数(在这种情况下,例如包括在何处构建其解析树)。
goyacc
.Parse
函数是declared
func ($$rcvr *$$ParserImpl) Parse($$lex $$Lexer) int {
我想到的事情:
$$ParserImpl
cannot be changed通过.y
文件,因此显而易见的解决方案(向其添加字段)是正确的,这很可惜。$$Lexer
是一个接口,因此我可以将解析器上下文填充到Lexer实现中,然后将类型$$lex
强制转换为该实现(假设我的解析器始终使用相同的lexer),但这似乎相当令人恶心(针对其为非习惯用语)。此外,(似乎)没有办法将用户生成的行放在Parse
之类的c := yylex.(*lexer).c
函数的顶部,因此在很多地方我想引用此变量,使用相当丑陋的形式yylex.(*lexer).c
而不是c
。yacc
/ C中使用%param
(还是,bison
),但是goyacc
中不存在。.go
或sed
对生成的perl
文件进行后处理。这里最惯用的解决方案是什么?我一直以为我一定会错过一些简单的东西。
答案 0 :(得分:0)
我自己的解决方案是修改goyacc
(see this PR),它添加了一个%param
指令,允许将一个或多个字段添加到$$ParserImpl
结构中(可以通过{访问代码中的{1}}。这似乎是最惯用的路线。这不仅允许传递上下文,还允许用户使用$$rcvr
作为接收者添加其他func()
的能力。