c# – 可视化使用ANTLR创建的AST(在.Net环境中)

c# – 可视化使用ANTLR创建的AST(在.Net环境中),第1张

概述对于一个宠物项目,我开始厌恶ANTLR.在遵循一些教程之后,我正在尝试为我自己的语言创建语法,并生成一个AST. 现在我在ANTLRWorks中大部分都在搞乱,但是现在我已经验证了解析树似乎很好,我想(反复地,因为我还在学习,还需要对最终结构作出一些决定的树)创建AST.似乎antlrworks不会可视化(或至少不使用“解释器”功能,Debug不能在我的任何机器上工作). 底线:用于手动方式可视化 对于一个宠物项目,我开始厌恶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+)?  ;fragmentDigit  :  '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 & MacOSjavac -cp .:antlr-3.2.jar *.java// windowsjavac -cp .;antlr-3.2.jar *.java

然后运行主类并将其输出管道导入名为ast-tree.dot的文件:

// *nix & MacOSjava -cp .:antlr-3.2.jar MainASTDemo > ast-tree.dot// windowsjava -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",];    edge [arrowsize=.5,]  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

总结

以上是内存溢出为你收集整理的c# – 可视化使用ANTLR创建的AST(在.Net环境中)全部内容,希望文章能够帮你解决c# – 可视化使用ANTLR创建的AST(在.Net环境中)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1262735.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存