2013-01-09 33 views
0

我傳遞給檸檬的所有令牌都是附有行號信息的結構。如何在生成的解析器中捕獲語法錯誤的行號

看那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處理程序中訪問相應的信息?

我是否需要單獨跟蹤我在標記器中的位置並在語法錯誤中查看它?我意識到標記器在語法錯誤時可能會在解析器之前。

回答

1

LALR(1)解析器永遠不會消耗(移位)與生產不匹配的令牌,儘管它們可能會執行錯誤的減少。因此,您提供給解析器的最後一個令牌是觸發語法錯誤的令牌(最後一個令牌是先行令牌;如果它不能移動,則是語法錯誤)。因爲這兩個標記可能被任意數量的空白和註釋分隔開來,所以知道前一個標記的位置也可能是有用的。 (例如,如果某個命令缺少終結符,並且後面跟有長註釋,則錯誤標記可能會有一定的距離。)

+0

按照此建議,我現在保留最後兩個標記的滑動窗口parser_context。出現語法錯誤時,如果它們不同,我給出兩條消息(這裏是「或這裏」的錯誤),否則如果它們在同一個文件/行上,我省略第二條消息。很好,謝謝。 – doug65536

0

是的,你需要跟蹤標記器。既可以作爲「全局」變量,也可以作爲令牌的屬性。

相關問題