我正在为我的编译器和解释器课程做学校作业,我们当前的任务是使用JavaCC创建扫描器和一组令牌。我对JavaCC的工作方式有相当扎实的了解,但我的问题是在遇到困难时可以在线查找资源以帮助我。我正在创建一个自定义Token类,我们将其称为NewToken.Java。我知道基本的Token类具有一个图像变量和一个kind变量,但是我想实现自己的变量“ value”。此外,我想弄清楚如何分配该值。我希望value变量保存所扫描内容的文字值,例如,我的NewToken与以下内容匹配
< IDENTIFIER:(< LETTER >)+ ( < LETTER > | < DIGIT >)* >
< #LETTER:["a" - "z"] >
< #DIGIT: ["0" - "9"] >
因此,将捕获Name123Name沿线的内容,并且在执行此操作时,我想将字符串“ Name123Name”存储到NewToken对象的'value'变量中。我希望这是有道理的,我还是JavaCC的新手,可能在这里用错误的名称来调用东西。
public NewToken(){}
public NewToken(int kind){
this(kind,null);
}
public NewToken(int kind, String image){
this.kind=kind;
this.image=image;
this.value=image;
}
public String toString(){
return 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);
}
}
上面是我的NewToken类代码的一部分,我让它扩展了Token并实现了java.io.serializable。我是使用为Token.java生成的代码创建的。我也有我的变量声明和getValue()函数(此处未列出以节省空间)。我并没有要找任何人为我工作,我只需要一些有关如何工作的指导,请先谢谢您。
答案 0 :(得分:2)
首先,我认为mongoose.set("useUnifiedTopology", true);
例程应返回类型newToken
而不是NewToken
的对象。
Token
(我认为您不需要第二种方法。但是,我不确定,因此我将其保留。)
我不清楚您希望 public static Token newToken(int ofKind, String image){
return new NewToken(ofKind, image);
}
public static Token newToken(int ofKind){
return new NewToken(ofKind, null);
}
与value
有何不同,但我将假设您可以从{{ 1}}和image
。而且,我进一步假设您已将此功能实现为静态方法。
value
删除前两个构造函数,其余应为:
image
答案 1 :(得分:0)
Norvell教授给您的答案基于使用非常老旧的JavaCC版本。如果您要使用旧版JavaCC,他建议您采用的方式可能是最好的方式。
但是,JavaCC的最高级版本是JavaCC 21,它以非常干净,优雅的方式直接处理这种用例。有关具体信息,请参见here。
如您所见,您可以在语法文件中添加注释,以使各种Token子类得以生成和使用。
此外,JavaCC 21具有code injection,可让您直接将代码注入到任何生成的文件中,包括Token子类。该功能在旧版JavaCC中也不存在。但是使用它,您可以将computeValue
方法直接注入到相应的Token子类中。
INJECT NewToken :
{
private static String computeValue(int kind, String image) {...}
}
将其放在语法中,computeValue
方法将被插入生成的NewToken.java文件中。
顺便说一下,最近在dzone.com上出现了an article about JavaCC 21。