2014-09-21 2 views
0

현재 내 벡터의 문법은 숫자, 문자열, 벡터 및 식별자 모음과 같습니다. 이제ANTLR4에서 동일한 토큰 유형 일치

vector: 
    '[' elements+=vector_members? (vector_delimiters elements+=vector_members)* ']' 
; 

vector_delimiters 
: 
    ',' 
; 

vector_members: 
    NUMBER 
    | STRING 
    | vector 
    | ID 
; 

, 벡터는 숫자 나 문자열 등과 같은 특정 유형의 요소를 포함 할 수 있도록 문법을 통해 시행 할 수있는 방법이

답변

3

물론,이 방법은 있지만, 아무튼 그게 좋은 생각이라는 뜻이야.

vector 
    : '[' ']' 
    | '[' elements+=NUMBER (vector_delimiters elements+=NUMBER)* ']' 
    | '[' elements+=STRING (vector_delimiters elements+=STRING)* ']' 
    | '[' elements+=ID  (vector_delimiters elements+=ID)*  ']' 
    | '[' elements+=vector (vector_delimiters elements+=vector)* ']' 
    ; 

보기에는 꽤 못생긴다.

이러한 유형의 유효성 검사는 문법의 일부가 아니어야합니다. 방문자를 구성하여 일관성 규칙을 확인하십시오. 이 코드는보다 간단하고 유지 보수가 용이하며 우려 원칙의 분리를 존중합니다. 파서가 구문 분석을하고 나중에 유효성 검사를 수행합니다. 보너스로 예상치 못한 토큰보다 나은 오류 메시지를 제공 할 수 있습니다.

부수적으로 초기 문법은 [ , 42 ]과 같은 구문을 허용합니다.

vector 
    : '[' ']' 
    | '[' elements+=vector_members (vector_delimiters elements+=vector_members)* ']' 
    ; 
+2

당신이 나쁜 생각 것에 대해 전적으로 옳습니다, 그러나 당신이 제공 한 코드가 정말 식별자 (자신의 구별 유형을하지 않는 한 모든 요소가 동일한 유형을 가지고 적용하지 않습니다 : 귀하의 vector 규칙이 아니라해야 그것은 꽤 이상 할 것이다). 이렇게하려면 여러 유형의 ID를 어떻게 든 구별해야합니다. 문법 규칙만으로는 가능하지 않다고 생각합니다. – sepp2k

+0

@ sepp2k 좋은 지적. 이것이 별도의 단계에서 검증 할 수있는 또 하나의 이유입니다. –