将令牌类型整数映射到 ANTLR4 中的字符串
Map token type integer to string in ANTLR4
我是 ANTLR4 的新手。我正在尝试处理一种名为 Mo 的玩具语言并打印标记文本及其类型。
以下是我的Mo.java文件:
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import static org.antlr.v4.runtime.CharStreams.fromFileName;
public class Mo {
public static void main (String [] args) {
CharStream cs = null;
try {
cs = fromFileName(args[0]); //load the file
} catch (Exception e) {
System.err.println("No input file: " + e.getMessage());
return;
}
MoLexer lexer = new MoLexer(cs); //instantiate a lexer
CommonTokenStream tokens = new CommonTokenStream(lexer); //scan stream for tokens
MoParser parser = new MoParser(tokens); //parse the tokens
ParseTree tree = parser.molang(); // parse the content and get the tree
MoWalker listener = new MoWalker();
ParseTreeWalker walker = new ParseTreeWalker();
walker.walk(listener,tree);
}
}
这是我的 MoWalker.java 文件:
public class MoWalker extends MoBaseListener {
public void enterMicrolang(MoParser.MolangContext ctx ) {
for (int i = 0; i<ctx.children.size()-1; i++){
Token representedToken = ((TerminalNodeImpl) ctx.getChild(i)).getSymbol();
System.out.print("Token: "+representedToken.getText());
int typee = representedToken.getType();
System.out.println(" --- "+typee);
}
}
public void exitMicrolang(MicroParser.MicrolangContext ctx ) {
System.out.println( "Exiting R" );
}
}
我的问题:
我不想将令牌类型打印为整数,而是想打印它的名称。 (即如果类型是 INTLITERAL(==4) 而不是打印 4 我想打印 INTLITERAL)
我这样 post,但它使用词汇 class。
有没有其他方法,比如getSymbolType(int type) ?
Vocabularyy.getSymbolicName
将标记类型作为整数,returns 将关联词法分析器规则的名称作为字符串。所以换句话说,它给你的正是你想要的。
要获取词法分析器的词汇表,您可以在词法分析器对象上调用 getVocabulary
或在词法分析器 class 上使用静态变量 VOCABULARY
。所以:
int typee = representedToken.getType();
String typeName = MoLexer.VOCABULARY.getSymbolicName(typee);
System.out.println(" --- " + typeName);
我是 ANTLR4 的新手。我正在尝试处理一种名为 Mo 的玩具语言并打印标记文本及其类型。
以下是我的Mo.java文件:
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import static org.antlr.v4.runtime.CharStreams.fromFileName;
public class Mo {
public static void main (String [] args) {
CharStream cs = null;
try {
cs = fromFileName(args[0]); //load the file
} catch (Exception e) {
System.err.println("No input file: " + e.getMessage());
return;
}
MoLexer lexer = new MoLexer(cs); //instantiate a lexer
CommonTokenStream tokens = new CommonTokenStream(lexer); //scan stream for tokens
MoParser parser = new MoParser(tokens); //parse the tokens
ParseTree tree = parser.molang(); // parse the content and get the tree
MoWalker listener = new MoWalker();
ParseTreeWalker walker = new ParseTreeWalker();
walker.walk(listener,tree);
}
}
这是我的 MoWalker.java 文件:
public class MoWalker extends MoBaseListener {
public void enterMicrolang(MoParser.MolangContext ctx ) {
for (int i = 0; i<ctx.children.size()-1; i++){
Token representedToken = ((TerminalNodeImpl) ctx.getChild(i)).getSymbol();
System.out.print("Token: "+representedToken.getText());
int typee = representedToken.getType();
System.out.println(" --- "+typee);
}
}
public void exitMicrolang(MicroParser.MicrolangContext ctx ) {
System.out.println( "Exiting R" );
}
}
我的问题: 我不想将令牌类型打印为整数,而是想打印它的名称。 (即如果类型是 INTLITERAL(==4) 而不是打印 4 我想打印 INTLITERAL) 我这样 post,但它使用词汇 class。
有没有其他方法,比如getSymbolType(int type) ?
Vocabularyy.getSymbolicName
将标记类型作为整数,returns 将关联词法分析器规则的名称作为字符串。所以换句话说,它给你的正是你想要的。
要获取词法分析器的词汇表,您可以在词法分析器对象上调用 getVocabulary
或在词法分析器 class 上使用静态变量 VOCABULARY
。所以:
int typee = representedToken.getType();
String typeName = MoLexer.VOCABULARY.getSymbolicName(typee);
System.out.println(" --- " + typeName);