首页 > 解决方案 > JavaCC 创建自定义 Token 类

问题描述

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

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

所以类似于 Name123Name 的东西会被捕获,当它发生时,我想将字符串“Name123Name”存储到我的 NewToken 对象的“值”变量中。我希望这是有道理的,我还是 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() 函数,这里没有列出来节省空间。我不是在寻找任何人为我做我的工作,我只需要一些关于如何让这个工作的指导,提前谢谢你。

标签: javacompiler-constructioninterpreterjavacc

解决方案


首先,我认为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与 有什么不同image,但我假设你可以valueimage和计算所需的值kind。我将进一步假设您已将此功能实现为静态方法。

private static String computeValue(int kind, String image) {...}

删除前两个构造函数,剩下的应该是:

  private NewToken(int kind, String image){
    this.kind = kind;
    this.image = image;
    this.value = computeValue( kind, image );
  }

推荐阅读