我传递给Lemon的所有令牌都是附有行号信息的结构。
查看下面的syntax_error定义
%name SinkParser
%token_prefix SINKPARSER_TOKEN_
%token_type {SinkParserNode*}
%extra_argument { SinkParserContext *parser_context }
%syntax_error {
SinkParser_SyntaxError(parser_context);
}
%token_destructor { SinkParserNode_Destruct($$); }
但是,我没有看到如何报告错误的文件和行。我有关于所有令牌的信息,但我如何在syntax_error处理程序中访问相应的令牌?
我是否需要单独跟踪我在tokenizer中的位置并在语法错误中查看它?我意识到,当它遇到语法错误时,tokenizer可能会先于解析器。
答案 0 :(得分:1)
LALR(1)解析器从不使用(移位)与生产无法匹配的令牌,尽管它们可能会执行错误的缩减。因此,您提供给解析器的最后一个令牌是触发语法错误的令牌(最后一个令牌是前瞻令牌;如果它无法移位,那就是语法错误)。知道前一个令牌的位置可能很有用,因为这两个令牌可能被任意数量的空格和注释分开。 (例如,如果命令缺少终结符并且后面跟着长注释,则错误标记可能会向前一段距离。)
答案 1 :(得分:0)
是的,您需要在tokenizer中跟踪。作为“全局”变量,或作为令牌的属性。