error-handling - 在丢失的 token 上输出适合上下文的错误消息

标签 error-handling antlr

我有一个语法来解析一些源代码:

document
  : header body_block* EOF
    -> body_block*
  ;

header
  : header_statement*
  ;

body_block
  : '{' block_contents '}'
  ;

block_contents
  : declaration_list
  | ... other things ....

文档有没有正文的标题或没有标题的正文是合法的。

如果我尝试解析一个看起来像
int i;

然后 ANTLR 提示它找到了 int当它期待 EOF .这是真的,但我想说它期待 { .也就是说,如果输入在标题和 EOF 之间包含不是 body_block 的内容。 ,那么我想向用户建议他们打算将该文本包含在 body_block 中.

我已经做了一些几乎可行的尝试,如果这很有启发性,我可以发布,但我希望我只是错过了一些简单的事情。

最佳答案

不漂亮,但这样的事情会做到这一点:

body_block
 : ('{')=> '{' block_contents '}'
 | t=.
   {
     if(!$t.text.equals("{")) {
       String message = "expected a '{' on line " + $t.getLine() + " near '" + $t.text + "'";
     }
     else {
       String message = "encountered a '{' without a '}' on line " + $t.getLine();
     }
     throw new RuntimeException(message);
   }
 ;

(未经测试,可能包含语法错误!)

所以,每当 '{' ... '}'不匹配,掉到 . 1 并产生更易于理解的错误消息。



1 请注意,.在解析器规则中匹配任何标记,而不是任何字符!

关于error-handling - 在丢失的 token 上输出适合上下文的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11547581/

相关文章:

android - 显示异常的 'nicer' 方式?

C 编程错误处理

reactjs - 在 React 中处理 Axios 错误

java - ANTLR 解析未找到正确的词法分析器部分

recursion - Antlr 何时/为何会发生互左递归?

parsing - 使用 lex/yacc 替代方案的原因?

matlab - 执行mex文件时MATLAB崩溃

javascript - 基于输入的 URL 重定向,但如果输入 url 不存在,则不重定向,无法使 PHP 工作

c# - 使用 ANTLR 将 vbscript 翻译成 C#

antlr - 在Antlr4中使用text属性时如何保留空白