捕捉;所有其他;ANTLR中的字符

捕捉;所有其他;ANTLR中的字符,antlr,grammar,character,lexer,Antlr,Grammar,Character,Lexer,我正在尝试将ANTLR定义的语法集成到NetBeans中,到目前为止,有效语法运行良好。但是,当前如果您在某个地方输入语言中未定义的任何字符(例如“?”字符),自定义编辑器将立即崩溃,因为它无法找到该字符的规则 在ANTLR中是否有一种方法可以捕获和跳过与规则不匹配的每个字符(可能输出错误消息),而不会导致整个lexer崩溃和烧毁?我只想标记无效字符,跳过它们,然后继续词法分析,例如: //some rules + tokens invalidCharacter : <&l

我正在尝试将ANTLR定义的语法集成到NetBeans中,到目前为止,有效语法运行良好。但是,当前如果您在某个地方输入语言中未定义的任何字符(例如“?”字符),自定义编辑器将立即崩溃,因为它无法找到该字符的规则

在ANTLR中是否有一种方法可以捕获和跳过与规则不匹配的每个字符(可能输出错误消息),而不会导致整个lexer崩溃和烧毁?我只想标记无效字符,跳过它们,然后继续词法分析,例如:

//some rules + tokens

invalidCharacter
    :    <<catch all other characters>>
        {System.out.println("undefined character entered!")}
    ;
//一些规则+标记
无效字符
:    
{System.out.println(“输入了未定义的字符!”)}
;

任何帮助都将不胜感激。

如果您只对lexer中的非法字符感兴趣,那么像这样简单的操作可能会为您带来好处:

语法T;
@lexer::成员{
public List errors=new ArrayList();
}
作语法分析
:*EOF
;
国际的
:  '0'..'9'+
;
单词
:('a'..'z'|'a'..'z')+
;
空间
:''{$channel=HIDDEN;}
;
无效的
:  . {
错误。在第行添加(“无效字符:”+$text+”:+
getLine()+”,索引:“+getCharPositionInLine());
}
;
如您所见,仅接受整数和ascii字,所有其他字符将导致错误添加到lexer内的
列表中。当使用测试类分析类似于“abc 123?foo!”
的字符串时:

import org.antlr.runtime.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
TLexer lexer=newtlexer(newantlrstringstream(“abc123?foo!”);
CommonTokenStream令牌=新的CommonTokenStream(lexer);
tokens.toString();//对toString()的伪调用,导致创建所有令牌
如果(!lexer.errors.isEmpty()){
for(字符串错误:lexer.errors){
系统输出打印项次(错误);
}
}
否则{
TParser parser=新的TParser(令牌);
parser.parse();
}
}
}
将导致以下输出:

java -cp antlr-3.3.jar org.antlr.Tool T.g javac -cp antlr-3.3.jar *.java java -cp .:antlr-3.3.jar Main Invalid character: '?' on line: 1, index: 9 Invalid character: '!' on line: 1, index: 15 java-cp antlr-3.3.jar org.antlr.Tool T.g javac-cp antlr-3.3.jar*.java java-cp.:antlr-3.3.jar Main 第1行索引9上的无效字符“?”
无效字符:“!”在第1行,索引:15这似乎对孤立的字符很有效,但如果将许多字符串在一起,则会失败…例如,输入“!!?????~~~”@donnyton,对于
n
无效字符,它会创建
n
不同的消息。如果这不是您想要的,您需要进一步解释一下。当我尝试将新语法集成到NetBeans中时,它会正确地检测单个无效击键,但当我复制粘贴许多无效字符或打开包含许多无效字符的文件时,它会崩溃。然而,我已经找到了一个解决方案——将INVALID定义为一个片段,并制定一个“invalidSequence”规则来更深入地处理它们。