Расширение класса токенов в JavaCC

#java #javacc

#java #javacc

Вопрос:

Я работаю над проектом JavaCC, и у меня возникли некоторые проблемы с расширением класса токенов. Я хочу создать подкласс с классом idToken и переопределить его метод GetValue(). Ниже приведен мой код подкласса

 public class IDToken extends Token implements java.io.Serializable {
  private static final long serialVersionUID = 1L;
  public int kind;
  public int beginLine;
  public int beginColumn;
  public int endLine;
  public int endColumn;
  public String image;
  public Token next;
  public Token specialToken;
  public IDToken(){}
  public IDToken(int kind)
  {
    this(kind,null);
  }
  public IDToken(int kind, String image){
    this.kind=kind;
    this.image=image;

  }
  public String toString(){
    return this.image;
  }
  public static Token newToken(int ofKind, String image){
    switch (ofKind)
    {
      default: return new Token(ofKind, image);
    }
  }
  public static Token newToken(int ofKind){
    return newToken(ofKind, null);
  }
  @Override
  public Object getValue(){
    return "abcdefg";
  }
}
  

Однако переопределение, похоже, не работает, GetValue() возвращает null . Я думаю, что я должен использовать newToken() в Token .java для создания моего idToken, но я пока не смог понять, как это сделать.

Ответ №1:

Чтобы иметь возможность расширять Token класс и переопределять getValue() метод, вам необходимо установить TOKEN_FACTORY параметр для пользовательского класса, который имеет статический метод newToken(int, String) , возвращающий экземпляр Token :

 // Parser.jj
options {
    STATIC = false;
    JAVA_UNICODE_ESCAPE = true;
    UNICODE_INPUT = true;
    JDK_VERSION = "1.8";

    TOKEN_FACTORY = "FooBar";
}
  
 // FooBar.java
class MyCustomToken extends Token {
    @Override
    public Object getValue() {
        return 42;
    }
}

public class FooBar {
    public static Token newToken(int kind, String image) {
        switch (kind) {
            case 42:
                return new MyCustomToken();
            default:
                return new Token(kind, image);
        }
    }
}