ANTLR

2013-06-02 2 views
0
에 시계를 만들기

나는 양식 시간의 클럭 반환하는, ANTLR의 데이터 형식은 시간이라는 만들고있어 : 분을ANTLR

이 내 코드는 지금까지 모습입니다 :

grammar clock; 
clock: HOUR ':' MINUTE 

HOUR: '2'[0-3]|'1'[0-9]|[0-9]; 

MINUTE: [0-5][0-9] 

코드가 "HOUR"부분을 인식하지 못하고 분을 인식합니다. 나는 심지어 HOUR을 분과 같은 가치로 바꾸었고, 여전히 HOUR를 인식하지 못합니다. 정규 표현식이 잘못되었는지 확인하기 위해 HOUR와 MINUTE를 순서대로 바꿔서 MINUTE : HOUR를 수행하여 시간을 인식했지만 시간은 인식하지 않았습니다. 내가 빠진 것이 있습니까? HOUR는 절대로 파싱하지 않을 것이지만, 항상 MINUTE는 무엇입니까?

답변

2

ANTLR 렉서는 구문 분석기를 사용하기 전에 모호하지 않은 토큰 유형을 완전히 지정합니다. 여러 토큰 유형이 토큰과 일치 할 수있는 경우 문법에 나타나는 첫 번째 토큰은 사용 된 토큰 유형입니다. 문법의 경우 토큰은 HOUR 유형과 MINUTE 유형을 동시에 가질 수 없습니다. 입력 이후 12 일치 이러한 렉서 규칙의 모두는 문법에 나타나는 첫 번째는 너무 12항상HOUR결코MINUTE 수있을 것입니다 사용됩니다. 당신은 ANTLR 4를 사용하고 있기 때문에

clock : INT ':' INT; 

, 당신은을 확장 할 수 있습니다 : 다음 clock위한 파서 규칙은 다음과 같을 수

INT : [0-9]+; 

:

는 일반적으로 다음과 같은 규칙과 유사 정수를 생산 렉서 생성 된 클래스 ClockBaseListener을 사용하고 enterClock 메서드를 재정 의하여 추가 유효성 검사를 수행합니다 (구체적으로 첫 번째 INT이 시간 요구 사항을 충족하는지 확인하고 두 번째 INT은 분 요건을 충족합니다.