2014-04-09 4 views
1

이 오류하게 내 문법의 일부입니다ANTLR3 NoViableAltException

expr : func_name '(' constant (',' constant)* ')' ; 

constant 
    : '"' (~'"')* '"'; 

WS  :  (' '|'\t')+ {skip();} ; 

그리고 오류가 텍스트의이 부분에 관한 것입니다 : ANTLRWorks의 인터프리터가 나에게 다음 잎을 줄

"w9ygS99Qp_", "vuPfq6YcbX" 

, 부모 노드 상수가있는 노드 :

" 
w9ygS99Qp_", 
" 

그런 다음 NoViableAltException 오류입니다.

일반적으로, 그것은이 잎이 있어야합니다

" 
w9ygS99Qp_ 
" 

분명히, 문제는 _이 앞에있는 "나는 억제하려하기 때문에 _하지만 테 파서는 다음을 만날 때 같은 오류가 나타납니다 _ "

+0

ANTLRWorks 1.x 인터프리터는 신뢰할 만합니다. 동일한 문법에 대해 ANTLR 3이 수행하는 것과 동일한 결과를 생성하지 않으므로 성공 또는 오류 경우에 사용할 수있는 출력을 고려하지 않아야합니다. –

+0

좋아요, 따라서 Java에서 문법을 컴파일하고 Java에서 테스트해야합니다. 잘 이해한다면? – Pico

+0

ANTLRWorks를 올바르게 사용하려면 ANTLR4를 사용해야합니까? – Pico

답변

0

constant은 구문 분석기 규칙이 아니라 렉서 규칙이어야합니다. 구문 분석기 규칙 내에서 ~'"'과 일치하며 큰 따옴표 이외의 모든 토큰과 일치합니다. 이 아니며이 일치합니다. double_tote-char을 제외한 임의의 문자입니다. 예

expr : func_name '(' Constant (',' Constant)* ')' ; 

Constant 
    : '"' (~'"')* '"'; 

OK, thus I have to compile the grammar in Java, and then test it in Java, if I understood well?

, 또는 대신 ANTLRWorks '디버거를 사용

이 대신처럼 마십시오. 디버거는 매력처럼 작동합니다.

일반 자바 테스트하려면 같은 것을 할 : 당신이 ANTLR3 또는 ANTLR4 중 하나를 사용할 수있는 선택의 여지가있는 경우

import org.antlr.runtime.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
    TLexer lexer = new TLexer(new ANTLRStringStream("name(\"w9ygS99Qp_\", \"vuPfq6YcbX\")")); 
    TParser parser = new TParser(new CommonTokenStream(lexer)); 
    parser.expr(); 
    } 
} 

Maybe should I use ANTLR4, to be able to use ANTLRWorks correctly?

후 ANTLR4에 대한 이동합니다. ANTLR4 문법에 대한 ANTLRWorks의 새로운 (재 작성된) 버전이 있습니다. http://tunnelvisionlabs.com/products/demo/antlrworks

+0

당신이 제안한 것은 잘하지만, 문제는 내가 3 개의 잎을 가지고 있고, 2 개는 ", 하나는 주석을 포함하고, 하나의 렉서 규칙은이 결과를 얻을 수 없다는 것입니다. – Pico

+0

당신은 할 수 있습니다. 합리적으로, 당신의 렉서 안에 지저분한 고리가 많이 생기지 않으면 서 그것을 할 수 있습니다. 가장 좋은 방법은 제가 제안한대로하는 것입니다. 그리고 '' ''(~ ' "') * '' ' AST를 따라 가면서 setText (getText(). substring (1, getText(). length() - 1)); –

+0

다음과 같습니다 : 'CONSTANT :' "(~ '"') * ' "'{0} {0} {0} ~ {{0} ~ {1} 이전과 똑같은 것을 만들어 내기 위해, "여전히 휴가 중입니다. – Pico