2012-08-30 7 views
7

매우 간단해야합니다. ANTLR을 사용하는 렉서 문법에 대해 연구 중이며 변수 식별자의 최대 길이를 30 자로 제한하려고합니다. 나는 (- ''일을 제외하고 - 일반 정규식 다음 구문)이 줄을이 작업을 수행하려고 시도 : 코드 생성에서ANTLR Regex의 범위 한정 기호 구문

ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,29} {System.out.println("IDENTIFIER FOUND.");} 
    ; 

아니 오류,하지만 편집은 간단했다 생성 된 코드의 라인으로 인해 실패 :

0,29

은 분명히 ANTLR은 괄호 사이에 텍스트의 부분을 복용하고 인쇄 라인과 함께 동의 상태 영역에 배치된다. 필자는 ANTLR 사이트를 검색했는데 이에 상응하는 표현식에 대한 예나 참조를 발견하지 못했습니다. 이 표현식의 구문은 무엇이되어야합니까?

답변

8

ANTLR은 한정자 구문 {m,n}을 지원하지 않습니다. ANTLR은 수량 표시자인 {}을 확인하고 동작을 둘러싼 {}과 별개로 말할 수 없습니다.

해결 방법 :

  1. 는 의미 적 제한을 적용합니다. 무제한 크기의 ID를 수집 한 다음 액션 코드의 일부로 또는 컴파일러에서 나중에 불평 /자를 수 있습니다.
  2. 수량화 규칙을 수동으로 생성하십시오.

이는 개인적으로 8

SUBID : ('a'..'z'|'A'..'Z'|'0'..'9'|'_') 
     ; 
ID : ('a'..'z'|'A'..'Z') 
    (SUBID (SUBID (SUBID (SUBID (SUBID (SUBID SUBID?)?)?)?)?)?)? 
    ; 

에 ID를 제한하는 수동 규칙의 예입니다, 내가 의미 솔루션 가고 싶어 (# 1). 요즘은 언어의 식별자를 제한 할 이유가 거의 없으며 그러한 규칙을 위반할 때 구문 오류 (컴파일이 조기 중단됨)가 발생하는 이유는 거의 없습니다.

+0

도움 주셔서 감사합니다. – user1634761

+1

ANTLR이 프로그래밍 언어 용 컴파일러를 생성하는 데만 사용 된 경우 한정 기호에는 거의 사용되지 않을 수 있습니다. 그러나 구조화 된 데이터의 유효성을 검사하기위한 문법 (스키마)은 확실히 필요합니다. 신용 카드 번호는 13 또는 25가 아닌 16 자리입니다. ANTLR4 책에는 JSON 및 XML 문법이 있지만 기본 토큰 제약 없이는 ANTLR 문법은 JSON Schema 및 XSD의 추상 (코덱 독립적 인) 버전입니다. – Dave

+0

"요즘에는 언어 식별자를 제한 할만한 이유가 거의 없습니다."- 제한된 식별자가있는 언어가 없거나 사람들이 파서를 쓸 수 있다는 것을 의미하지는 않습니다. –