JavaCC创建自定义令牌类

时间:2020-10-03 04:43:55

标签: java compiler-construction interpreter javacc

我正在为我的编译器和解释器课程做学校作业,我们当前的任务是使用JavaCC创建扫描器和一组令牌。我对JavaCC的工作方式有相当扎实的了解,但我的问题是在遇到困难时可以在线查找资源以帮助我。我正在创建一个自定义Token类,我们将其称为NewToken.Java。我知道基本的Token类具有一个图像变量和一个kind变量,但是我想实现自己的变量“ value”。此外,我想弄清楚如何分配该值。我希望value变量保存所扫描内容的文字值,例如,我的NewToken与以下内容匹配

< IDENTIFIER:(< LETTER >)+ ( < LETTER > | < DIGIT >)* >
< #LETTER:["a" - "z"] >
< #DIGIT: ["0" - "9"] >

因此,将捕获Name123Name沿线的内容,并且在执行此操作时,我想将字符串“ Name123Name”存储到NewT​​oken对象的'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()函数(此处未列出以节省空间)。我并没有要找任何人为我工作,我只需要一些有关如何工作的指导,请先谢谢您。

2 个答案:

答案 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

相关问题