2014-09-29 39 views
0

使用ANTLR4和Netbeans平台我创建了一个语法,在该语法中我在Netbeans平台应用程序中实现了语法高亮显示。一切工作正常,当我试图改变我的代码。IlegalStateException当我将未完成的代码键入支持语法高亮的JEditorPane中时

grammar MyRule; 

my_rule : '(' my_rule ')' 
      | binary 
      | binary_hyst 
      | my_rule (AND my_rule)+ 
      | my_rule (OR my_rule)+ 
      ; 

binary : '(' binary ')' 
     | unary (EQ | NE) unary 
     ; 

binary_hyst : '(' binary_hyst ')' 
      | unary hyst? (GT | LT | GTE | LTE) unary hyst? 
      ; 

hyst : (HYST '(' unary ')'); 

unary : '(' unary ')' 
     | NUMBER 
     | STRING 
     | (MOV | DEC | INC) '(' unary ',' NUMBER ')' 
     | unary '*' unary 
     | unary '/' unary 
     | unary '+' unary 
     | unary '-' unary 
     ; 


// TOKENS 
HYST : ('hyst'); 
MOV  : ('mov'); 
INC  : ('inc'); 
DEC  : ('dec'); 

AND : ('&&'); 
OR : ('||'); 

EQ : ('=='); 
NE : ('!='); 

GT : ('>'); 
LT : ('<'); 
GTE : ('>='); 
LTE : ('<='); 

NUMBER 
    : '-'? INT '.' [0-9]+ // 1.35, 0.3, -4.5 
    | '-'? INT    // -3, 45 
    ; 


fragment INT : '0' | [1-9] [0-9]* ; // no leading zeros 
STRING : '"' (ESC | .)*? '"' ; 
ID : [a-zA-Z_]+; 
fragment ESC: '\\' [btnr"\\] ; 

WS : [ \t\n\r]+ -> channel(HIDDEN) ; 

此语法允许这样的代码:("some_string" >= 20)。但是,当我试图改变我的代码(即("some_id" >= 20) && ("some_other_id < 10)我收到一个IllegalStateException:

java.lang.IllegalStateException: Lexer  de.nor[email protected]181848 
     returned null token but lexerInput.readLength()=2 
     lexer-state: null 
     tokenStartOffset=20, readOffset=22, lookaheadOffset=23 
    Chars: "&\n" - these characters need to be tokenized. 
    Fix the lexer to not return null token in this state. 
     at   org.netbeans.lib.lexer.LexerInputOperation.checkLexerInputFinished(LexerInputOperation.java:457) 
     at org.netbeans.lib.lexer.LexerInputOperation.nextToken(LexerInputOperation.java:217) 
     at org.netbeans.lib.lexer.inc.TokenListUpdater.relex(TokenListUpdater.java:627) 
     at 

... 

    line 1:1 token recognition error at: '&\n' 

这种情况权当我输入第一个“&”为“& &”令牌看来,Netbeans的要分析我的。代码和词法分析器认识到这不是一个有效的标记,这是正确的。如果我简单地复制并粘贴一个'& &'它工作正常,并且Netbeans不会引发异常所以这似乎来自我键入如何解决此问题?

回答

2

您需要确保创建令牌为所有可能的输入序列。最直接的方法是在您的词法分析器的末尾添加一个ERR_CHAR规则。

ERR_CHAR 
    : . 
    ; 

这允许语法高亮器工作,并将错误报告给解析阶段。

+0

完美地工作,谢谢! – padde 2014-09-30 06:36:27