ANTLR语法开发问题:调用parser.init()提示无法解析方法求助
问题描述
我是编译器设计及ANTLR新手,正依照书本进行基础练习,期望实现验证大括号内逗号分隔数字的语法。但在调用生成的解析器时,Java代码中parser.init()一行提示“cannot resolve method init()”,我推测init是语法中定义的解析规则。
Java应用代码
import org.antlr.runtime.ANTLRInputStream; import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.tree.*; import java.io.IOException; public class Adamant{ public static void main(String[] args) throws Exception { ANTLRInputStream input = new ANTLRInputStream(System.in); testLexer lexer = new testLexer((CharStream) input); CommonTokenStream tokens = new CommonTokenStream(lexer); testParser parser = new testParser(tokens); ParseTree tree = parser.init(); System.out.println(tree.toStringTree(parser)); } }
语法文件(test.g4)
grammar test; init: '{' value (',' value)* '}'; value: init | INT ; INT : [0-9]+ ; WS : [\t\n\r] -> skip;
问题原因及解决方法
- 版本混用导致API不兼容:代码同时导入了ANTLR v3的
org.antlr.runtime.ANTLRInputStream和v4类,而你的语法是v4格式(使用-> skip语法),两者无法匹配。 - 输入流创建方式错误:ANTLR v4已废弃
ANTLRInputStream,需使用v4专属的CharStreams类生成输入流。
修正后的Java代码
import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.tree.*; public class Adamant{ public static void main(String[] args) throws Exception { CharStream input = CharStreams.fromStream(System.in); testLexer lexer = new testLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); testParser parser = new testParser(tokens); ParseTree tree = parser.init(); System.out.println(tree.toStringTree(parser)); } }
重新生成Lexer和Parser
使用ANTLR v4工具重新编译语法文件,确保生成的testLexer.java和testParser.java为v4版本:
antlr4 test.g4
验证方法存在性
重新生成后,检查testParser.java中是否包含public ParseTree init()方法——正常情况下ANTLR会根据语法规则自动生成对应的解析方法。
内容的提问来源于stack exchange,提问作者Niresh
相关产品推荐
相关产品推荐

