2013-04-02 3 views
0

내 용어가 꺼져 있으면 용서해주십시오.Antlr 서브 토큰 받기

내가 단순 문법이 비트가 있다고 가정하자 :

// parser 
expr : COMPARATIVE; 

// lexer 
WS : ('\t' | ' ' | '\r' | '\n'| '\u000C')+; 
COMPARATOR 
     : 'vs' 
    | 'versus' 
     ; 
ITEM 
     : 'boy' 
     | 'girl' 
     ; 
COMPARATIVE :ITEM WS* COMPARATOR WS* ITEM; 

그래서이 과정 매치 'boy vs girl' 또는 'girl vs boy' 등 의 의지하지만 내 문제는 내가 렉서를 만들 때 즉,

입니다
CharStream stream = new ANTLRInputStream("boy vs girl"); 
SearchLexer lex = new SearchLexer(stream); 
CommonTokenStream tokens = new CommonTokenStream(lex); 
tokens.fill(); 
for(Token token : tokens) { 
    System.out.print(token.getType() + " [" + token.getText() + "] "); 
} 

이렇게하면 다음과 같이 인쇄됩니다. 9 [소년 대 소녀], 즉 내 쿼리와 정확하게 일치하지만 현재는이 현재 토큰의 하위 토큰을 얻을 수 있기를 원합니다.

내 직감은 내가 나무를 사용해야한다고 말하지만 Antlr4에서 내 예제를 위해이 작업을 수행하는 방법을 실제로 알지 못합니다. 감사합니다.

답변

1

현재, COMPARATIVE은 규칙과 일치하는 모든 텍스트에서 하나의 토큰을 만드는 것을 의미하는 렉서 규칙입니다.

comparative : ITEM WS* COMPARATOR WS* ITEM; 

COMPARATIVE 때문에 더 이상 하나의 토큰으로 간주되지 않습니다, 대신 ITEM, WSCOMPARATOR 개별 토큰을 얻을 것이다 : 당신은 대신 파서 규칙 comparative을해야한다.

두 측면 노트 : 공백이 중요하지 않은 경우

  1. ,이 같은 파서 규칙에서 숨길 수 : 단순히 될

    WS : ('\t' | ' ' | '\r' | '\n'| '\u000C')+ -> channel(HIDDEN); 
    

    당신은 다음 comparative 파서 규칙을 단순화 할 수 있습니다 :

    comparative : ITEM COMPARATOR ITEM; 
    
  2. ANTLR 4에서는 문자를 단순화 할 수 있습니다. 새로운 구문을 사용하여 세트 :

    WS : [ \t\r\n\u000C]+ -> channel(HIDDEN); 
    
+0

감사에게 많은, 그래서 EXPR라는 규칙이 있다고 할 수 있으며 실제로 EXPR'처럼 많은 것을 일치합니다 (비교 | ACTION_VERB * WS * (LOCATION | ITEM) | COPULAR_VERB * WS * (나이 | 성별 | 시간) | TIME) +;'expr과 일치하는 좋은 방법이 있는가? 그렇다면 'COMPARATIVE'토큰을 쉽게 파싱 할 수 있을까? 또는 토큰이 'COMPARATIVE'인지 확인한 다음 해당 토큰의 텍스트를 기반으로 토큰 스트림을 생성해야합니까? –

+0

사이드 노트에! 큰 감사합니다! Antlr3에서이 작업을 수행 할 수 있지만 Antlr4에 대한 구문을 파악할 수 없다는 것을 알고있었습니다. :) –