2012-07-10 2 views
1

이것은 간단한 문제로 언급 한 Antlr superfluous Predicate required?의 후속 질문이지만 거기에서 해결할 수는 없습니다.
다음 문법이 있으며 {true}?=> 술어를 삭제하면 텍스트가 더 이상 인식되지 않습니다. 입력 문자열은 MODULE main LTLSPEC H {} {} {o} FALSE;입니다. 후행 ;은 EOC로 토큰 화되지 않고 IGNORE로 표시됩니다. EOC 규칙 ;{true}?=>을 추가하면 EOC로 토큰 화됩니다.
antlr-v3.3 및 v3.4와 함께 명령 줄에서 차이점없이 시도해 보았습니다. 미리 감사드립니다. 도움을 주셔서 감사합니다.antlr gated 술어

grammar NusmvInput; 

options { 
    language = Java; 
}  
@parser::members{ 
public static void main(String[] args) throws Exception { 
    NusmvInputLexer lexer = new NusmvInputLexer(new ANTLRStringStream("MODULE main LTLSPEC H {} {} {o} FALSE;")); 
    NusmvInputParser parser = new NusmvInputParser(new CommonTokenStream(lexer)); 
    parser.specification(); 
    } 
}  
@lexer::members{ 
    private boolean inLTL = false; 
} 

specification : 
    module+ EOF 
    ; 
module : 
    MODULE module_decl  
    ; 

module_decl : 
    NAME parameter_list ; 
parameter_list 
    : (LP (parameter (COMMA parameter)*)? RP)? 
    ;  
parameter 
    : (NAME | INTEGER) 
    ;  
/************** 
*** LEXER 
**************/ 
COMMA 
    :{!inLTL}?=> ',' 
    ; 
OTHER 
    : {!inLTL}?=>('&' | '|' | 'xor' | 'xnor' | '=' | '!' | 
    '<' | '>' | '-' | '+' | '*' | '/' | 
     'mod' | '[' | ']' | '?') 
     ;  
RCP 
     : {!inLTL}?=>'}' 
     ;  
LCP 
     : {!inLTL}?=>'{' 
     ; 
LP 
    : {!inLTL}?=>'(' 
    ; 
RP 
    : {!inLTL}?=>')' 
    ; 
MODULE 
    : {true}?=> 'MODULE' {inLTL = false;} 
    ; 
LTLSPEC 
    : {true}?=> 'LTLSPEC' 
    {inLTL = true; skip(); } 
    ; 
EOC 
    : ';' 
    { 
     if (inLTL){ 
      inLTL = false; 
      skip(); 
     } 
    } 
    ; 
WS 
    : (' ' | '\t' | '\n' | '\r')+ {$channel = HIDDEN;} 
    ; 
COMMENT 
    : '--' .* ('\n' | '\r') {$channel = HIDDEN;} 
    ; 
INTEGER 
    : {!inLTL}?=> ('0'..'9')+ 
    ; 
NAME 
    :{!inLTL}?=> ('A'..'Z' | 'a'..'z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$' | '#' | '-')* 
    ; 
IGNORE 
    : {inLTL}?=> . {skip();} 
    ; 
+1

문법을 들여다 보면, 나는 이미 2 개의 오류를 보았습니다 :'module' 규칙에서'^'를 보았습니다. 옵션에'output = AST'가없고, 'specification' 규칙은'-' (빼기 부호)로 끝납니다. –

+0

죄송합니다. stackoverflow에 코드를 복사 한 후 트리 재 작성을 제거하고이를 잊어 버렸습니다. –

답변

1

이러한 토큰이 NAME 토큰 앞에 정의 된 경우에도 MODULELTLSPEC 전에 조건없이 NAME 그들보다 우선 순위를 얻을 것으로 보인다. 이것이 의도적이든 버그 든, 나는 모른다.

그러나 해결 방법은 다소 복잡해 보입니다. 지금까지 보았 듯이 LTLSPEC으로 시작하여 세미 콜론으로 끝나는 입력을 무시 (또는 건너 뛰기)하려고합니다. 왜 이런 식으로하지 마십시오 :

+0

이 예제에서는이 파일을 볼 수 없지만'LTLSPEC' _may_는';'로 끝납니다. 'MODULE' 또는 다른'LTLSPEC '에 의해 끝날 수도 있습니다. 내가'(~ (MODULE | LTLSPEC)) *'와 같은 것을 시도 할 때, 이상하게 작동하지 않는다. 지금 당장은 오류를 기억하지 못한다. –

+0

'LTLSPEC :'LTLSPEC '~ END * {skip();};' –

+1

'인공 지능'END' 토큰을 끝내기 전에'LTLSPEC : @HeinrichOdy는 부정 ('~')이 하나의 문자에서만 작동한다는 것을주의하십시오! (또는 단일 문자와 일치하는 규칙). 이 Q & A를 참조하십시오. http://stackoverflow.com/questions/8284919/negating-inside-lexer-and-parser-rules –