#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);
}
}
}