如何捕获生成的解析器中的语法错误的行号

时间:2013-01-09 03:51:19

标签: c parsing syntax-error parser-generator lemon

我传递给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可能会先于解析器。

2 个答案:

答案 0 :(得分:1)

LALR(1)解析器从不使用(移位)与生产无法匹配的令牌,尽管它们可能会执行错误的缩减。因此,您提供给解析器的最后一个令牌是触发语法错误的令牌(最后一个令牌是前瞻令牌;如果它无法移位,那就是语法错误)。知道前一个令牌的位置可能很有用,因为这两个令牌可能被任意数量的空格和注释分开。 (例如,如果命令缺少终结符并且后面跟着长注释,则错误标记可能会向前一段距离。)

答案 1 :(得分:0)

是的,您需要在tokenizer中跟踪。作为“全局”变量,或作为令牌的属性。