2011-10-09 154 views
1

对于我在ANTLR中的语法,我的java代码可以捕获并打印包含“$”的输入的错误。在我的实施中,我需要打印出成功输入的“成功”。所以,我按照我的Java代码,大于0为我的情况下,输入错误

CharStream charStream = new ANTLRFileStream(filePath); 
myLexer lexer = new myLexer(charStream); 
TokenStream tokens = new CommonTokenStream(lexer); 
myParser parser = new myParser(tokens); 

/*if there is an error throws an exception message*/ 
parser.program(); 

/*if there is an error find how many, if 0 then print success,*/ 
int errorsCount = parser.getNumberOfSyntaxErrors(); 
if(errorsCount == 0){ 
    System.out.println("parsing successful"); 
} 

getNumberofSyntaxErrors回报数字。对于“int i;”,输出只是;

parsing successful 

当我运行我的代码,如int $一个输入我;, java代码打印出错误消息“解析成功”,因为getNumberofSyntaxErrors()返回0;

line 1:4 no viable alternative at character '$' /*this is what I expect to see*/ 
parsing successful /*this is not what i expect to see*/ 

回答

1

词法分析器(或分析器)可能试图从(轻微)错误中恢复并继续进行标记或解析。如果你想在发生某些非法字符时终止,最简单的方法是创建某种“贯通”规则,放在所有词法分析器规则的末尾,如果没有上面的词法分析器规则匹配,这些规则将匹配,并且让这个规则抛出一个例外:

grammar T; 

// parser rules 

// lexer rules 

/* last lexer rules */ 
FALL_THROUGH 
    : . {throw new RuntimeException("Illegal character: " + getText());} 
    ; 
+0

巴特,非常感谢。 –

+0

不客气John。 –