Ловить" всех остальных " персонажей в ANTLR
Я пытаюсь интегрировать определяемую ANTLR грамматику в NetBeans, и до сих пор действительный синтаксис работает нормально. Однако в настоящее время, если вы вводите какой-либо символ, который не определен в языке где-либо (например,'?'character) пользовательский редактор немедленно завершает работу, потому что он не может найти правило для этого символа.
Есть ли способ в ANTLR поймать и пропустить каждый символ, который не соответствует правилу (и, возможно, вывести сообщение об ошибке), не имея всего лексера разбиться и сгореть? Я бы хотел просто отметить недопустимые символы, пропустить их и продолжить лексику, что-то вроде:
//some rules + tokens
invalidCharacter
: <<catch all other characters>>
{System.out.println("undefined character entered!")}
;
Любая помощь будет оценена.
1 ответ:
Если вас интересуют только нелегальные символы внутри лексера, что-то настолько простое, как это, может сделать трюк для вас:
Как вы можете видеть, принимаются только целые числа и слова ascii, все остальные символы вызовут ошибку, которая будет добавлена кgrammar T; @lexer::members { public List<String> errors = new ArrayList<String>(); } parse : .* EOF ; INT : '0'..'9'+ ; WORD : ('a'..'z' | 'A'..'Z')+ ; SPACE : ' ' {$channel=HIDDEN;} ; INVALID : . { errors.add("Invalid character: '" + $text + "' on line: " + getLine() + ", index: " + getCharPositionInLine()); } ;
List
внутри лексера. При разборе строки типа"abc 123 ? foo !"
с тестовым классом:import org.antlr.runtime.*; public class Main { public static void main(String[] args) throws Exception { TLexer lexer = new TLexer(new ANTLRStringStream("abc 123 ? foo !")); CommonTokenStream tokens = new CommonTokenStream(lexer); tokens.toString(); // dummy call to toString() which causes all tokens to be created if(!lexer.errors.isEmpty()) { for(String error : lexer.errors) { System.out.println(error); } } else { TParser parser = new TParser(tokens); 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