【问题标题】:How to Get ID Lexer from code that has tokenize in ANTLR如何从在 ANTLR 中标记化的代码中获取 ID Lexer
【发布时间】:2014-06-14 11:30:58
【问题描述】:

我有一个词法分析器类来确定令牌 ID Lexer。代码是:

public class Antlr3JavaLexer extends Lexer {
public static final int PACKAGE=84;
public static final int PUBLIC=87;
public static final int STATIC=90;
public static final int IDENT=164;
public static final int CLASS = 70;  
}

现在我有一个名为 hello.java 的 java 类,它将由 ANTLR 生成。代码是这样的 public class hello{ public static void main(String args[]){ System.out.print("Hello World");} }

现在,是时候让我创建的 ANTLR 词法分析器中弹了..

BufferedReader in = null;
try {
        in = new BufferedReader(new FileReader(mainFile.getAbsolutePath())); // Assumption this is to read the hello.class
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    final Antlr3JavaLexer lexer = new Antlr3JavaLexer();

    try {
        lexer.setCharStream(new ANTLRReaderStream(in));
    } catch (IOException e) {
        e.printStackTrace();
        // return false;
    }

    final CommonTokenStream tokens = new CommonTokenStream();
    tokens.setTokenSource(lexer);

    Antlr3JavaParser parser = new Antlr3JavaParser(tokens); 
    System.out.println(tokens + "and" + "\n"); //First Print
    System.out.println(tokens.getTokens); // Second Print

幸运的是,我得到这样的输出: https://www.dropbox.com/s/tsogz10eouo9f9h/ID%20Token.bmp

所以,问题是: 如何从令牌中获取 ID?例如public class hellopublic = 87, class = 70, hello 是标识符 = 164。 所以,也许是这样的输出

8770164 

感谢 4 的帮助...

【问题讨论】:

  • 先生。巴特·基尔斯,有什么想法吗?
  • 不知道如何修改CommonTokenStream类中的getTokens,请帮忙

标签: parsing antlr token lexer


【解决方案1】:

当您将对象附加到StringBuilder(或StringBuffer,您可能不应该使用它)时,它会在对象上调用ToString() 并附加结果文本。如果您想以其他方式格式化列表,则需要遍历元素并以所需格式附加文本。

在这种情况下,所需的格式似乎是Token.getType()

boolean first = true;
for (Token token : tokens.getTokens()) {
  if (first) {
    first = false;
  } else {
    sb.append(", ");
  }

  sb.append(token.getType());
}

【讨论】:

  • @FadlyMassere CommonTokenStream 不是令牌。为什么要实现Token.getType() 方法?这个问题真的不清楚你在寻找什么。
  • 280Z28 先生,Token 无法转换为 Object。所以,循环是不可能的。有什么建议吗?你是救生员..
  • @FadlyMassere Java 中的一切都可以转换为对象。如果您需要进一步的帮助,您将不得不发布一个完整的工作项目供我们编译和运行。没有人能理解你目前写的问题。
  • 有你的邮箱@280Z28先生,我会把我的项目发给你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多