2014-10-10 3 views
1

년, 월, 일,시, 분 및 초로 지정된 기간을 일치시키는 규칙이 있습니다. 나는 적어도 하나가있는 한 이것들의 어떤 조합이라도 허용하고 싶다. 그리고 그것들은 그 순서대로 나타난다. 예를 들어ANTLR4 하나 이상의 옵션 *에 대한 규칙 *

:

  • 3 년, 오일
  • 2개월, 17초

아니라 :

  • 일일 1 개월
  • 5 분, 2 시간

내 현재 규칙은 다음과 같습니다

period 
    : years=INTEGER YEARS (LIST_DELIM months=INTEGER MONTHS)? (LIST_DELIM days=INTEGER DAYS)? (LIST_DELIM hours=INTEGER HOURS)? (LIST_DELIM minutes=INTEGER MINUTES)? (LIST_DELIM seconds=INTEGER SECONDS)? 
    | months=INTEGER MONTHS (LIST_DELIM days=INTEGER DAYS)? (LIST_DELIM hours=INTEGER HOURS)? (LIST_DELIM minutes=INTEGER MINUTES)? (LIST_DELIM seconds=INTEGER SECONDS)? 
    | days=INTEGER DAYS (LIST_DELIM hours=INTEGER HOURS)? (LIST_DELIM minutes=INTEGER MINUTES)? (LIST_DELIM seconds=INTEGER SECONDS)? 
    | hours=INTEGER HOURS (LIST_DELIM minutes=INTEGER MINUTES)? (LIST_DELIM seconds=INTEGER SECONDS)? 
    | minutes=INTEGER MINUTES (LIST_DELIM seconds=INTEGER SECONDS)? 
    | seconds=INTEGER SECONDS 
    ; 

이 중복의 공정한 금액 것 같은 느낌이 든다. 이것을 단순화 할 수있는 방법이 있습니까?

답변

1

문법에 더 느슨하게 일치하고 청취자 또는 방문자에서 유효성 검사를하는 것 외에는 규칙을 단순화 할 수있는 방법이 없습니다.

period 
: years (',' months)? (',' days)? (',' hours)? (',' minutes)? (',' seconds)? 
| months (',' days)? (',' hours)? (',' minutes)? (',' seconds)? 
| ... 
| seconds 
; 

years 
: INTEGER YEARS 
; 

months 
: INTEGER MONTHS 
; 

... 

LIST_DELIM : ','; 

이와 관련된 Q &을 : : 쉽게 읽을

, 당신은 당신이 그들을 레이블 필요가 없도록 별도의 파서 규칙을 만들 수 있습니다 ANTLR4: Matching all input alternatives exaclty once

관련 문제