对于一个宠物项目,我开始摆弄ANTLR。在完成一些教程之后,我现在正在尝试为我自己的语言创建语法并生成AST。
现在我主要在ANTLRWorks中乱搞,但现在我已经验证了解析树看起来很好我想(迭代地,因为我还在学习并且仍然需要做出一些关于树的最终结构)创建AST。似乎antlrworks不会将其可视化(或者至少不使用“Interpreter”功能,Debug不能在我的任何机器上工作)。
底线:是手动方式可视化AST的唯一方法,遍历/显示它还是以字符串表示形式将树打印到控制台?
我正在寻找的是一种简单的输入方法,语法 - >视觉AST表示和ANTLRWorks的“解释器”功能。有什么想法吗?
答案 0 :(得分:17)
正确,解释器只显示解析过程中使用的规则,并忽略任何AST重写规则。
您可以使用StringTemplate
创建Graphviz DOT-file。创建此类DOT-file后,您可以使用某些第三方查看器来显示此树(图表)。
这是Java的快速演示(我知道很少C#,对不起)。
采用以下(过于简单化)生成AST的表达式语法:
grammar ASTDemo;
options {
output=AST;
}
tokens {
ROOT;
EXPRESSION;
}
parse
: (expression ';')+ -> ^(ROOT expression+) // omit the semi-colon
;
expression
: addExp -> ^(EXPRESSION addExp)
;
addExp
: multExp
( '+'^ multExp
| '-'^ multExp
)*
;
multExp
: powerExp
( '*'^ powerExp
| '/'^ powerExp
)*
;
powerExp
: atom ('^'^ atom)*
;
atom
: Number
| '(' expression ')' -> expression // omit the parenthesis
;
Number
: Digit+ ('.' Digit+)?
;
fragment
Digit
: '0'..'9'
;
Space
: (' ' | '\t' | '\r' | '\n') {skip();}
;
首先让ANTLR从中生成词法分析器和解析器文件:
java -cp antlr-3.2.jar org.antlr.Tool ASTDemo.g
然后创建一个小测试工具,解析表达式"12 * (5 - 6); 2^3^(4 + 1);"
并输出DOT-file:
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;
public class MainASTDemo {
public static void main(String[] args) throws Exception {
ANTLRStringStream in = new ANTLRStringStream("12 * (5 - 6); 2^3^(4 + 1);");
ASTDemoLexer lexer = new ASTDemoLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
ASTDemoParser parser = new ASTDemoParser(tokens);
ASTDemoParser.parse_return returnValue = parser.parse();
CommonTree tree = (CommonTree)returnValue.getTree();
DOTTreeGenerator gen = new DOTTreeGenerator();
StringTemplate st = gen.toDOT(tree);
System.out.println(st);
}
}
编译所有.java
个文件:
// *nix & MacOS
javac -cp .:antlr-3.2.jar *.java
// Windows
javac -cp .;antlr-3.2.jar *.java
然后运行主类并将其输出传递给名为ast-tree.dot
的文件:
// *nix & MacOS
java -cp .:antlr-3.2.jar MainASTDemo > ast-tree.dot
// Windows
java -cp .;antlr-3.2.jar MainASTDemo > ast-tree.dot
文件ast-tree.dot
现在包含:
digraph {
ordering=out;
ranksep=.4;
bgcolor="lightgrey"; node [shape=box, fixedsize=false, fontsize=12, fontname="Helvetica-bold", fontcolor="blue"
width=.25, height=.25, color="black", fillcolor="white", style="filled, solid, bold"];
edge [arrowsize=.5, color="black", style="bold"]
n0 [label="ROOT"];
n1 [label="EXPRESSION"];
n1 [label="EXPRESSION"];
n2 [label="*"];
n2 [label="*"];
n3 [label="12"];
n4 [label="EXPRESSION"];
n4 [label="EXPRESSION"];
n5 [label="-"];
n5 [label="-"];
n6 [label="5"];
n7 [label="6"];
n8 [label="EXPRESSION"];
n8 [label="EXPRESSION"];
n9 [label="^"];
n9 [label="^"];
n10 [label="^"];
n10 [label="^"];
n11 [label="2"];
n12 [label="3"];
n13 [label="EXPRESSION"];
n13 [label="EXPRESSION"];
n14 [label="+"];
n14 [label="+"];
n15 [label="4"];
n16 [label="1"];
n0 -> n1 // "ROOT" -> "EXPRESSION"
n1 -> n2 // "EXPRESSION" -> "*"
n2 -> n3 // "*" -> "12"
n2 -> n4 // "*" -> "EXPRESSION"
n4 -> n5 // "EXPRESSION" -> "-"
n5 -> n6 // "-" -> "5"
n5 -> n7 // "-" -> "6"
n0 -> n8 // "ROOT" -> "EXPRESSION"
n8 -> n9 // "EXPRESSION" -> "^"
n9 -> n10 // "^" -> "^"
n10 -> n11 // "^" -> "2"
n10 -> n12 // "^" -> "3"
n9 -> n13 // "^" -> "EXPRESSION"
n13 -> n14 // "EXPRESSION" -> "+"
n14 -> n15 // "+" -> "4"
n14 -> n16 // "+" -> "1"
}
可以使用many viewers周围的其中一个进行查看。甚至还有在线观众。以此为例:http://graph.gafol.net/
在输入ast-tree.dot
的内容时,会生成以下图像:
alt text http://img19.imageshack.us/img19/4836/expression.png
答案 1 :(得分:0)
您必须将目标语言更改为Java才能使ANTLRWorks解释器正常工作,或者至少是我观察到的。