goyacc:获取yacc解析器的上下文/否`%param`

时间:2019-04-29 05:40:28

标签: go yacc

goyaccyacc解析器中获取某种形式的上下文的最惯用的方法是什么,即在传统的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中不存在。
  • 出于某些显而易见的原因,我想避免使用.gosed对生成的perl文件进行后处理。
  • 我希望能够一次解析(y)多个文件,因此不可能使用全局变量(而且全局变量很难理解)。

这里最惯用的解决方案是什么?我一直以为我一定会错过一些简单的东西。

1 个答案:

答案 0 :(得分:0)

我自己的解决方案是修改goyaccsee this PR),它添加了一个%param指令,允许将一个或多个字段添加到$$ParserImpl结构中(可以通过{访问代码中的{1}}。这似乎是最惯用的路线。这不仅允许传递上下文,还允许用户使用$$rcvr作为接收者添加其他func()的能力。