2016-09-01 2 views
0

모두. 내가 문자열을 구문 분석 할 때 나는 내 문제ANTLR4 문법, 규칙은 문장의 일부만을 받아들입니다.

을 발견 (그것이 더 큰 문법의 일부) 문법을 만든

00 */3,5 * * 5 미국/뉴욕

'/'입력에서 어떠한 대안 4 : I 예외를

라인 (1)을 다음 없었다

내가 발견 한 것처럼 문제는 하위 문자열 /3,5가 "with_step_value"규칙과 완전히 구문 분석된다는 것인데, 파서가 첫 번째 sybmbol 만 가져 오는 대신. 하지만 왜? 내가 이해할 수있는 한, 가능한 한 긴 문자열로 구문 분석하고 "with_step_value"규칙에 만족하는보기의 관점에서 "/3,5"를 부분 문자열로 사용하려고 시도합니다.

그래서 문제가 발생하는 이유는 무엇이며 어떻게 수정해야합니까?

감사합니다, 블라디미르

, 문법과 사진이 규칙을

/*File trigger validator lexer */ 
lexer grammar CronPartLexer; 


INT_LIST: INTEGER (COMMA INTEGER)* ; 
INTERVAL 
: 
    INTEGER DASH INTEGER 
; 

INTEGER 
: 
    [0-9]+ 
; 

DASH 
: 
    '-' 
; 


SLASH 
: 
    '/' 
; 

COMMA 
: 
    ',' 
; 

UNDERSCORE 
: 
    '_' 
; 


ID 
: 
    [a-zA-Z] [a-zA-Z0-9]* 
; 

ASTERISK:'*'; 

WS 
: 
    [ \t\r\n]+ -> skip 
; 


grammar CronPartValidator; 

options 
    { 
    tokenVocab = CronPartLexer; 
} 

cron_part 
: 
    minutes hours days_of_month month week_days time_zone?; 

    minutes 
: 
    with_step_value 
; 


time_zone 
: 
    timezone_part 
    (
     SLASH timezone_part 
    )? 
; 

timezone_part 
: 
    ID 
    (
     UNDERSCORE ID 
    )? 
; 


hours 
: 
    with_step_value 
; 
// 

// 

days_of_month 
: 
    with_step_value 
; 
// 

month 
: 
    with_step_value 
; 
// 

week_days 
: 
    with_step_value 
; 


with_step_value: 
    INT_LIST|ASTERISK|INTERVAL ((SLASH INT_LIST)?) 
; 

Parse Tree of the full string

Parse Tree of "with_step_value" "*/3,5"

+0

은'cron_part' 규칙은 무효이며 정의 된'minute' 규칙이 없다. 또한 두 이미지는 실제로 동일합니다. 게시 된 문법이 실제로보고 된 문제를 재현하는지 확인하십시오. – GRosenberg

+0

죄송합니다. "분"규칙이 적용됩니다. 나는 문법에있다. –

답변

0

노호 참조하십시오

with_step_value: INT_LIST|ASTERISK|INTERVAL ((SLASH INT_LIST)?) ; 
,536,

INT_LIST 또는 ASTERISK 또는 INTERVAL (SLASH INT_LIST)?과 일치합니다.

는 아마도 이것은 의도 된 것입니다 :

with_step_value 
    : (INT_LIST 
     | ASTERISK 
     | INTERVAL 
    ) (SLASH INT_LIST)? 
    ; 

enter image description here