有没有人知道在ANTLRWorks中调试树语法的方法

Mik*_*gal 6 antlr antlrworks

ANTLR用法的推荐模式是让Parser构造一个抽象语法树,然后构建Tree walker(AKA树语法)来处理它们.

我试图深入了解为什么我的树语法不起作用,并且喜欢使用ANTLRWorks的调试器,就像我将它用于解析器本身一样.解析器的输入是"源代码",但树解析器的输入是解析器的AST结果.我不知道如何使其可用作测试树语法的输入.

目前尚不清楚是否有办法在ANTLRWorks中测试树语法.如果可以做到,那么正确的方向指针将非常受欢迎.

Sam*_*tin 6

ANTLRWorks调试器应该可以与您的树语法一起使用.如果我没记错的话,你需要使用带有"-debug"标志的ANTLR代码生成工具(我正在使用Java目标),然后,在创建树解析器实例的地方,使用带端口的调试构造函数一个论点.在我的情况下,默认端口不起作用,所以我随意选择了35505.

启动ANTLRWorks,打开树语法,单击"运行" - >"调试远程...",将端口设置为树解析器的构造函数中使用的相同值,您应该能够将调试器连接到您的运行应用程序 有关详细信息,请参阅ANTLR 3调试常见问题解答.

[ 更新 ]假设您正在使用Java目标(如果不是这样,请告诉我们),这里有关于入门的更详细信息:

当您在ANTLRWorks中测试非树解析器时,会有一个幕后流程从您的语法文件生成Java代码,然后使用该代码来解析您的输入.在自己的应用程序中使用解析器时,必须使用ANTLR(特别是类org.antlr.Tool)生成Java代码,然后将其包含在应用程序中.ANTLRWorks有一个菜单选项,可以帮助您入门.在我的例子中,我的ant构建文件中有一个目标,它从我的语法生成Java代码,并将这些Java源文件放在我的应用程序的其余部分可以找到它们的位置.我的蚂蚁目标看起来像这样:

<java classpath="${antlr.tool.classpath}" classname="org.antlr.Tool" failonerror="true">
    <arg value="-o" />
    <arg value="${antlr.out.dir}" />
    <arg value="${grammar.dir}/GrammarName.g" />
</java>
Run Code Online (Sandbox Code Playgroud)

该属性antlr.tool.classpath需要包含stringtemplate.jarantlr.jar,并且antlr.out.dir需要指向您希望生成的源代码所在的目录(例如build/antlr/src/org/myorg/antlr/parser,如果您的解析器语法指定了包org.myorg.antlr.parser).

然后,当您编译应用程序的其余部分时,您可以使用以下内容:

<javac destdir="${build.classes.dir}" debug="on" optimize="on" deprecation="${javac.deprecation}" source="${javac.source}" target="${javac.target}">
    <classpath refid="stdclasspath"/>
    <src path="${src.dir}" />
    <src path="${antlr.src.dir}" />
</javac>
Run Code Online (Sandbox Code Playgroud)

在这里,我们编译我们的应用程序源(in src.dir)以及生成的ANTLR代码(in antlr.src.dir,在本例中将是build/antlr/src).

至于在应用程序中使用生成的代码(即在ANTLRWorks之外),您需要执行以下操作:

String sourceText = "a + b = foo";
ANTLRStringStream inStream = new ANTLRStringStream(sourceText);

// your generated lexer class
MyLexer lexer = new MyLexer(inStream);
CommonTokenStream tokens = new CommonTokenStream(lexer);

// your generated parser class
MyParser parser = new MyParser(tokens);

// run the toplevel rule (in this case, `program`)
MyParser.program_return prog = parser.program();

// get the resulting AST (a CommonTree instance, in this case)
CommonTree tree = (CommonTree) prog.getTree();

// run a tree parser rule on the AST
MyTreeParser treeParser = new MyTreeParser(new CommonTreeNodeStream(tree));
treeParser.program();
Run Code Online (Sandbox Code Playgroud)

如果您打算使用ANTLR,我强烈建议您获取The Definitive ANTLR Reference的副本.所有这些都包含在内,有很多例子可以帮助您入门.