Всем доброго времени суток!
Используя http://www.antlr.org/ пытаюсь разработать лексер (для начала только лексер) для подсветки синтаксиса. Столкнулся с такой бедой. После генерации лексера почти все работает так как нужно, однако как только ввожу символы многострочного комментария валится экзепшн. Ниже определение комментариев в граммере:
Код | TOKEN_COMMENT1 : '(*' ( . )* '*)';
|
Код | TOKEN_COMMENT2 : '{' ( . )* '}' ;
|
Все это добро разрабатывается, как модуль к NetBeans. Вот вырезка кода лексера
Код |
import org.antlr.runtime.*; import org.netbeans.spi.lexer.Lexer; import org.netbeans.spi.lexer.LexerRestartInfo;
public class MyLexer implements Lexer<MyTokenId> { private LexerRestartInfo<MyTokenId> info;
private MyScriptLexer lexer;
public MyLexer(LexerRestartInfo<MyTokenId> info) { this.info = info; AntlrCharStream charStream = new AntlrCharStream(info.input(), "My Script Editor"); lexer = new MyScriptLexer(charStream); }
public org.netbeans.api.lexer.Token<MyTokenId> nextToken() { Token token = lexer.nextToken(); if (token.getType() != MyScriptLexer.EOF) { MyTokenId tokenId = MyLanguageHierarchy.getToken(token.getType()); return info.tokenFactory().createToken(tokenId); } return null; } ...
|
Проблема, насколько мне удалось понять, связана с тем, что лексер фиксирует начало комментария, но не может найти его конец. в результате валится экзепшн:
Цитата | SEVERE [global] java.lang.IllegalStateException: Lexer com.lexer.MyLexer@c91010 returned null token but lexerInput.readLength()=91 lexer-state: null tokenStartOffset=14, readOffset=105, lookaheadOffset=106 Chars: "(*)\nprocedure simple(temp1:integer;temp2,temp3:string);\nbegin\n //do somthing\nend;\n\nEnd.\n" - these characters need to be tokenized. Fix the lexer to not return null token in this state.
|
При попытке ввести сочетание "(*" вот в этом коде
Код | (* procedure simple(temp1:integer;temp2,temp3:string); begin //do somthing end;
End.
|
Если же предварительно где-то ввести символы закрывающие многострочный комментарий, то ошибки не возникает
Ну а вопрос в том, можно ли как-то изменить определение многострочного комментария в граммере ANTLR чтобы не писать код обработки в классе лексера.
Пересмотрел много буржуйных ресурсов, однако так и не удалось найти конкретного решения этой проблемы. Надеюсь, хотя и не сильно, что кто-то сталкивался с подобной ошибкой при разработкой синтаксических анализаторов используя ANTLR =)
|