访问golang yacc生成的解析器的结果

Emi*_*l H 6 parsing yacc go

我正在尝试使用golang的yacc工具创建一个解析器.我发现nex可以简化创建词法分析器以提供解析器.我现在的问题是生成的解析器没有方法或字段来授予我访问解析结果的权限.我可以将解析结果存储在全局变量中,但这似乎是错误的.

目前,我已将以下内容添加为我的parser.y文件顶部的初始尝试:

type ResultParser interface {
  yyParser // Generated parser interface
  Result() s.Expr // s.Expr is an interface for the parsed result
}

func (p *yyParserImpl) Result() s.Expr {
  return p.stack[1].expr
}

func NewResultParser() ResultParser {
  return &yyParserImpl{}
}
Run Code Online (Sandbox Code Playgroud)

是否有一种推荐/更好的方法来获得解析器的结果?
(因为这感觉有点滥用发电机......)

Rol*_*lig 5

不,访问stack[1]不能可靠地工作.一旦堆栈需要增长到超过16的初始大小,它就不包含任何结果.(见#16163.)

标签之后的if语句yystack然后创建一个新的堆栈并完全忘记保存的那个yyParserImpl.


我做了以下.

result在lexer类型中添加一个字段:

type ShellLexer struct {
    /* … */
    result *ShellProgram
}
Run Code Online (Sandbox Code Playgroud)

在一开始就通过以下规则扩展语法:

start : program {
    shyylex.(*ShellLexer).result = $$
}
Run Code Online (Sandbox Code Playgroud)

(这取决于Parse方法的参数名称(可以有自定义前缀),但我认为没问题.)