我正在尝试使用 golang's yacc tool 创建解析器.我找到了 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{}
}
是否有推荐的/更好的方法来获取解析器的结果?
(因为这感觉有点滥用生成器...)
最佳答案
不,访问 stack[1]
不能可靠地工作。一旦堆栈需要增长到超过其初始大小 16,它就不会包含任何结果。 (参见 #16163。)
yystack
标签之后的 if
语句会创建一个新堆栈,并完全忘记保存在 yyParserImpl
中的堆栈。
我做了以下事情。
向词法分析器类型添加一个result
字段:
type ShellLexer struct {
/* … */
result *ShellProgram
}
在最开始按以下规则扩展语法:
start : program {
shyylex.(*ShellLexer).result = $$
}
(这取决于 Parse
方法的参数名称(可以有自定义前缀),但我认为没问题。)
关于parsing - 访问 golang yacc 生成的解析器的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36822702/