이것은 간단한 문제로 언급 한 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();}
;
문법을 들여다 보면, 나는 이미 2 개의 오류를 보았습니다 :'module' 규칙에서'^'를 보았습니다. 옵션에'output = AST'가없고, 'specification' 규칙은'-' (빼기 부호)로 끝납니다. –
죄송합니다. stackoverflow에 코드를 복사 한 후 트리 재 작성을 제거하고이를 잊어 버렸습니다. –