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

问题描述 投票:1回答:1

在qazxsw poi中为qazxsw poi解析器获取某种形式的上下文最常用的方法是什么,即在传统的yacc中模拟goyacc命令?

我需要解析我的%param函数的一些上下文(在这种情况下包括例如构建其解析树的位置)。

qazxsw poi qazxsw poi的功能是qazxsw poi

yacc

我想到的事情:

  • qazxsw poi qazxsw poi由qazxsw poi文件,因此明显的解决方案(添加字段)是正确的,这是一个遗憾。
  • 由于.Parse是一个接口,我可以将解析器上下文填充到Lexer实现中,然后强制类型转换goyacc到该实现(假设我的解析器总是使用相同的词法分析器),但这看起来非常恶心(读取非惯用的)。此外(似乎)没有办法将用户生成的行放在.Parse函数的顶部,如declared,所以在我想要引用这个变量的数十个地方,我必须使用相当丑陋的形式func ($$rcvr *$$ParserImpl) Parse($$lex $$Lexer) int { 而不是而不仅仅是$$ParserImpl
  • 通常我会在正常的cannot be changed / C(好吧,.y)中使用$$Lexer,但这在$$lex中不存在。
  • 我想避免使用qazxsw poi或qazxsw poi对我生成的qazxsw poi文件进行后处理,这是有希望的明显原因。
  • 我希望能够(go)yacc一次解析多个文件,因此全局变量是不可能的(并且全局变量几乎不是惯用的)。

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

go yacc
1个回答
0
投票

我自己的解决方案是修改Parsec := yylex.(*lexer).c),它添加了一个yylex.(*lexer).c指令,允许将一个或多个字段添加到c结构中(可在代码中以%param访问)。这似乎是最惯用的路线。这不仅允许传递上下文,而且还允许用户使用yacc作为接收器添加额外的bisons。

© www.soinside.com 2019 - 2024. All rights reserved.