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

标签 parsing go yacc

我正在尝试使用 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/

相关文章:

parsing - 如何使用 STD.pm6 语法解析 Perl 6 代码?

go - 尝试在 golang 中读取 gzip 文件时出错

c - 获取 $$ 来保存 $1 和 $2 的串联

c++ - 编译器如何翻译后缀/前缀运算符?

C++上下文无关语法库

javascript不想解析文本超过两次

go - 字符串迭代编程

bison - flex/bison 将数字解释为 float

java - 我怎样才能在Android中解析这个JSON?

oracle - 在找不到 Oracle 数据库客户端库时避免 Go panic