对于一个宠物项目,我开始厌恶ANTLR.在遵循一些教程之后,我正在尝试为我自己的语言创建语法,并生成一个AST.
现在我在ANTLRWorks中大部分都在搞乱,但是现在我已经验证了解析树似乎很好,我想(反复地,因为我还在学习,还需要对最终结构作出一些决定的树)创建AST.似乎antlrworks不会可视化(或至少不使用“解释器”功能,Debug不能在我的任何机器上工作).
底线:用于手动方式可视化AST的唯一方式,遍历/显示或将字符串表示形式的树打印到控制台?
我正在寻找的是一个简单的方式从输入,语法 – >视觉AST表示ANTLRWorks的“解释器”功能.有任何想法吗?
解决方法
正确的,解释器只显示在解析过程中使用的规则,并忽略任何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();}
- ;
- 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,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/
当给它的内容物时,会产生以下图像:
alt text http://img19.imageshack.us/img19/4836/expression.png