2013-04-03 1 views
2

기본적으로 token.getType() 메서드는 int을 반환하며 생성 된 *.tokens 파일을로드하고 구문 분석하지 않고 코드를 기반으로 코드를 작성하는 것은 거의 쓸모가 없습니다.Antlr4는 더 의미 있고 일관된 형식 이름을 만듭니다.

ANTLR 사용자는 대개 토큰 유형을 일관되게 사용하려고합니까? 일관성을 유지한다는 것은 문법을 변경하면 토큰 번호가 변경 될 가능성이 높다는 것입니다.

일반적으로 *.tokens 파일을로드하고 구문 분석하는 Utility 클래스를 생성합니까?

내 샘플 Search.tokens 파일

:

LOCATION=8 
TIME=5 
AGE=3 
WS=1 
COMPARATIVE=9 
GENDER=4 
PHRASE=2 

샘플 토큰 스트림 :

(token.getType(), token.getText()) 
9 [MegaBlocks vs Legos], -1 [<EOF>] 

현재 내가 뭘 뭔가 같은 :

public class TokenMapper { 

    private HashMap<Integer, String> tokens; 

    public TokenMapper(String file) { 
     tokens = new HashMap<Integer, String>(); 
     parse(file); 
    } 

    private void parse(String file) { 
     // trivial code that maps the Integer typeId to the String name 
    } 

    public Integer type(String type) { 
     for(Map.Entry<Integer, String> entry : tokens.entrySet()) { 
      if(entry.getValue().equals(type)) { 
       return entry.getKey(); 
      } 
     } 
     return null; 
    } 

    public String type(Integer type) { 
     return tokens.get(type); 
    } 

} 

그럼 난 항상 참조 할 수 있습니다 내 LOCATION 또는 GENDER과 같은 이름으로 토큰을 만들고 h 변경하려는 경향이있는 Integer 값에 대해 걱정할 필요가 없습니다.

답변

1

렉서 및/또는 파서를 생성하면 생성 된 클래스에는 토큰 파일을 통해 가져온 문법뿐만 아니라 문법에 선언 된 각 토큰 유형에 대한 상수가 포함됩니다.

예를 들어, 다음과 같은 문법이있는 경우 : 그들이 tokenVocab 옵션으로 인해 수입했기 때문에

lexer grammar SearchLexer; 

options { tokenVocab = Search; } 

... 

그런 다음 생성 된 SearchLexer.java 클래스는 상수 LOCATION에 대한 ( public static final int)와 GENDER 포함됩니다.

+0

와우, 나는 그것을 알아 채지 못했습니다! –

관련 문제