0

我正在为我的编译器和解释器课程做一个学校作业,我们当前的任务是使用 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() 函数,这里没有列出来节省空间。我不是在寻找任何人为我做我的工作,我只需要一些关于如何让这个工作的指导,提前谢谢你。

4

2 回答 2

2

首先,我认为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 );
  }
于 2020-10-03T17:24:00.343 回答
0

Norvell 教授给您的答案是基于使用一个非常旧的、过时的 JavaCC 版本。如果您打算使用旧版 JavaCC,他建议您做事的方式可能是最好的方式。

然而,JavaCC 的最高级版本是JavaCC 21,它以非常干净、优雅的方式直接开箱即用地处理这种用例。有关这方面的具体信息,请参见此处

如您所见,您可以在语法文件中添加注释,从而生成和使用各种 Token 子类。

此外,JavaCC 21 具有代码注入功能,允许您将代码直接注入到任何生成的文件中,包括 Token 子类。旧版 JavaCC 中也根本不存在该功能。但是使用它,您可以将您的方法直接注入computeValue到适当的 Token 子类中。

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

你把它放在你的语法中,然后这个computeValue方法就被插入到生成的 NewToken.java 文件中。

顺便说一句,最近在 dzone.com 上出现了一篇关于 JavaCC 21 的文章。

于 2020-10-04T20:25:53.717 回答