在JavaCC中扩展Token类



我正在处理一个JavaCC项目,在扩展Token类时遇到了一些问题。我想创建一个分类为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。我想我应该在Token.java中使用newToken((来创建我的IDToken,但我还没有弄清楚如何做到这一点。

为了能够扩展Token类并重新定义getValue()方法,您需要将TOKEN_FACTORY选项设置为具有返回Token:实例的静态方法newToken(int, String)的自定义类

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

最新更新