Parsing 如何从ANTLR中具有标记化的代码中获取ID Lexer
我有一个lexer类,它决定了令牌ID lexer。代码是:Parsing 如何从ANTLR中具有标记化的代码中获取ID Lexer,parsing,antlr,token,lexer,Parsing,Antlr,Token,Lexer,我有一个lexer类,它决定了令牌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 = 7
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生成。代码是这样的
公共类你好{
公共静态void main(字符串参数[]){
System.out.print(“Hello World”);}
}
现在,是我创建的ANTLR lexer拍摄的时候了
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
幸运的是,我得到如下输出:
因此,问题是:
如何从代币中获取ID?。例如,公共类hello
是
public
=87,
类
=70,
hello
is identifier=164。
所以,也许输出是这样的
8770164
谢谢你的帮助 将对象附加到
StringBuilder
(或StringBuffer
,您可能不应该使用该对象)时,它会调用对象上的ToString()
,并附加结果文本。如果要以另一种方式设置列表的格式,则需要迭代元素并以所需格式追加文本
在本例中,所需的格式似乎是Token.getType()
巴特·基尔斯先生,有什么想法吗?我不知道如何修改类中的getTokenshelp@FadlyMassere
CommonTokenStream
不是令牌。为什么它要实现Token.getType()
方法?这个问题真的不清楚你在找什么。280Z28先生,令牌不能转换为对象。因此,循环是不可能的。有什么建议吗?你是救命恩人。@fadlymasse一切都可以在Java中转换为对象。如果您需要进一步的帮助,您将不得不发布一个完整的工作项目供我们编译和运行。没有人理解你的问题,因为他们目前写的。你有一封电子邮件@Mr.280Z28,我会给你发送我的项目
boolean first = true;
for (Token token : tokens.getTokens()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(token.getType());
}