2013-02-06 3 views
1

공백으로 자바에서는 슬로우ANTLR NoViableAltException 내가 ANTLR 3에 정의 된 간단한 문법을 ​​가지고

grammar StringProcessor; 

options { 
output=AST; 
} 

@header { 
package com.processor; 
} 

@rulecatch { 
    // ANTLR does not generate its normal rule try/catch 
    catch(RecognitionException e) { 
    throw e; 
} 
} 

truevalue : 'true'; 
falsevalue : 'false'; 
nullvalue : 'null'; 
simpleValue : truevalue | falsevalue | nullvalue | STRING | INTEGER | FLOAT; 
INTEGER  : '0'..'9'+; 
FLOAT  : INTEGER'.'INTEGER; 
QUOTE  : '"'; 
SPECIALCHAR : '-'|':'|';'|'('|')'|'£'|'&'|'@'|','|'!'|'['|']'|'{'|'}'|'#'|'^'|'*'|'+'|'='|'_'|'<'|'>'|'€'|'$'|'%'|'/'|'.'|'?'|'~'|'|'; 
STRING : QUOTE('a'..'z'|'A'..'Z'|INTEGER|SPECIALCHAR|WS)+QUOTE; 
WS  : (' '|'\t'|'\f'|'\n'|'\r')+ {skip();}; // handle white space between keywords 

나는 intrepreter에서 AntlrWorks에 다음 문자열 때 :

"5Java 개발자를 "

이것은 작동합니다. 공백이 포함됩니다. 그러나 Java 프로그램에서이 구문을 분석하려고하면 NoViableAltException이 throw됩니다. 나는 다른 게시물을 보았지만 그 해결책은 내 문제에 적용되지 않습니다. WS는 STRING의 일부입니다. 문제는 Java 프로그램이 공백이있는 구문을 분석하지 않는 반면 해석은 올바르게 표시된다는 것입니다. 데

public static void main(String[] args) throws Exception { 
    String input = ("\"5Java Developer\""); 
    StringProcessorParser parser = buildParser(input); 
    CommonTree commonTree = (CommonTree) parser.simpleValue().getTree(); // exception thrown 
} 

public static StringProcessorParser buildParser(String query) { 
    CharStream cs = new ANTLRStringStream(query); 
    // the input needs to be lexed 
    StringProcessorLexer lexer = new StingProcessorLexer(cs); 
    CommonTokenStream tokens = new CommonTokenStream(); 
    StringProcessorParser parser = new StringProcessorParser(tokens); 
    tokens.setTokenSource(lexer); 
    // use the ASTTreeAdaptor so that the grammar is aware to build tree in AST format 
    parser.setTreeAdaptor((TreeAdaptor) new ASTTreeAdaptor().getASTTreeAdaptor()); 
    return parser; 
} 

:이 작동하지 않는 이유

input = new String("\"5JavaDeveloper\""); correctly parses. 

어떤 생각

는 예외를 표시합니다.

편집 :

나는 또한 $ 채널 = HIDDEN을 추가하는 시도;

그러나 아직도 건너 뛰기()를 제거

WS : (' '|'\t'|'\f'|'\n'|'\r')+ { $channel = HIDDEN; skip();}; // handle white space between keywords 

답변

0

작동하지 않는 내 문제를 해결했다.