0

我传递给 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 处理程序中访问适当的令牌?

我是否需要单独跟踪我在标记器中的位置并在语法错误中查看它?我意识到标记器在遇到语法错误时可能会领先于解析器。

4

2 回答 2

1

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

于 2013-01-09T18:29:42.990 回答
0

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

于 2013-01-09T08:30:46.120 回答