2014-11-05 1 views
0

SQL 문에 대한 파서를 작성 중입니다. 내가 같이 입력을 통과 한ANTLR 파서 일치하는 토큰이 아닌 식별자

IDENTIFIER 
    : 
    (LETTER | '_') (NAMECHAR)* 
    ; 

REAL_NUMBER 
    : NUMBER_VALUE ('e' (PLUS | MINUS)? DIGIT)? 
    ; 

fragment 
NUMBER_VALUE 
    : {numberDotValid()}?=> DIGIT DOT DIGIT? 
    | DOT DIGIT 
    | DIGIT 
    ; 

fragment NAMECHAR 
    : LETTER | DIGIT | '.' | '-' | '_' |'%' 
    ; 

fragment DIGIT 
    : '0' .. '9' ('0' .. '9')* 
    ; 

fragment LETTER 
    : 'a'..'z' 
    | 'A'..'Z' 
    ; 

tokens 
{ 
CREATE = 'create'; 
TABLE = 'table'; 
YEAR = 'year'; 
NAME = 'name'; 
... 
} 

및 식별자 : 나는 같은 키워드에 대한 토큰을 정의 (표 nulll하지 SMALLINT)

만들기 테이블 EMP;

식별자가 일치하지 않는 입력이 일치하지 않습니다. 오류는 (Table smallint ...) 부분에 있습니다. 토큰 우선 순위가 파서 규칙보다 높고 현재 토큰 테이블과 일치한다는 것을 알고 있습니다. 그러한 유형의 문제를 처리하는 올바른 방법은 무엇입니까?

도와주세요.

답변

1

나는 그것이 토큰 '테이블'그 토큰은 당신이 만들 수있는, 동일하지 않습니다 대문자 'T'를 유의 식별자로 인식되고 '표'에 다른 beacuse 추측 뭔가 같은 :

TABLE : 'table' | 'Table' | 'TABLE'; 

또는 상부 및 하부 케이스의 조합을 방지하기 위해, 뭔가 같은 : 등등

TABLE: TABLE; 
fragment T: 
't' | 'T'; 
fragment A: 
'a' | 'A'; 

하고, 그것은 또한 당신이 렉스 만 대문자를 사용할 수 있습니다 ANTLR 너무

+0

가 사용하는 접근 방식 er 토큰을 사용하고 대소 문자를 구분하지 않는 렉서를 사용하십시오. –

+0

내 언어 파서에서 식별자가 될 수있는 많은 토큰이 있기 때문에 너무 복잡합니다. 따라서 모든 토큰에 대해 이렇게하는 것이 좋지 않습니다. – user82504

+0

아니요, 핵심어 일뿐입니다. antrl이 만든 방식이기도합니다. – Jersono