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

前端之家收集整理的这篇文章主要介绍了c# – 可视化使用ANTLR创建的AST(在.Net环境中)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于一个宠物项目,我开始厌恶ANTLR.在遵循一些教程之后,我正在尝试为我自己的语言创建语法,并生成一个AST.

现在我在ANTLRWorks中大部分都在搞乱,但是现在我已经验证了解析树似乎很好,我想(反复地,因为我还在学习,还需要对最终结构作出一些决定的树)创建AST.似乎antlrworks不会可视化(或至少不使用“解释器”功能,Debug不能在我的任何机器上工作).

底线:用于手动方式可视化AST的唯一方式,遍历/显示或将字符串表示形式的树打印到控制台?

我正在寻找的是一个简单的方式从输入,语法 – >视觉AST表示ANTLRWorks的“解释器”功能.有任何想法吗?

解决方法

正确的,解释器只显示在解析过程中使用的规则,并忽略任何AST重写规则.

您可以使用StringTemplate创建一个Graphviz DOT-file.创建这样一个DOT-file后,您可以使用一些第三方查看器来显示该树(图).

这是Java中的一个快速演示(我很少知道C#,对不起).

采取以下(过于简单的)表达语法,产生一个AST:

  1. grammar ASTDemo;
  2.  
  3. options {
  4. output=AST;
  5. }
  6.  
  7. tokens {
  8. ROOT;
  9. EXPRESSION;
  10. }
  11.  
  12. parse
  13. : (expression ';')+ -> ^(ROOT expression+) // omit the semi-colon
  14. ;
  15.  
  16. expression
  17. : addExp -> ^(EXPRESSION addExp)
  18. ;
  19.  
  20. addExp
  21. : multExp
  22. ( '+'^ multExp
  23. | '-'^ multExp
  24. )*
  25. ;
  26.  
  27. multExp
  28. : powerExp
  29. ( '*'^ powerExp
  30. | '/'^ powerExp
  31. )*
  32. ;
  33.  
  34. powerExp
  35. : atom ('^'^ atom)*
  36. ;
  37.  
  38. atom
  39. : Number
  40. | '(' expression ')' -> expression // omit the parenthesis
  41. ;
  42.  
  43. Number
  44. : Digit+ ('.' Digit+)?
  45. ;
  46.  
  47. fragment
  48. Digit
  49. : '0'..'9'
  50. ;
  51.  
  52. Space
  53. : (' ' | '\t' | '\r' | '\n') {skip();}
  54. ;

首先让ANTLR从中生成词法分析器和解析器文件

  1. java -cp antlr-3.2.jar org.antlr.Tool ASTDemo.g

然后创建一个解析表达式“12 *(5 – 6); 2 ^ 3 ^(4 1)”的小测试工具;并将输出DOT-file

  1. import org.antlr.runtime.*;
  2. import org.antlr.runtime.tree.*;
  3. import org.antlr.stringtemplate.*;
  4.  
  5. public class MainASTDemo {
  6. public static void main(String[] args) throws Exception {
  7. ANTLRStringStream in = new ANTLRStringStream("12 * (5 - 6); 2^3^(4 + 1);");
  8. ASTDemoLexer lexer = new ASTDemoLexer(in);
  9. CommonTokenStream tokens = new CommonTokenStream(lexer);
  10. ASTDemoParser parser = new ASTDemoParser(tokens);
  11. ASTDemoParser.parse_return returnValue = parser.parse();
  12. CommonTree tree = (CommonTree)returnValue.getTree();
  13. DOTTreeGenerator gen = new DOTTreeGenerator();
  14. StringTemplate st = gen.toDOT(tree);
  15. System.out.println(st);
  16. }
  17. }

编译所有.java文件

  1. // *nix & MacOS
  2. javac -cp .:antlr-3.2.jar *.java
  3.  
  4. // Windows
  5. javac -cp .;antlr-3.2.jar *.java

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

  1. // *nix & MacOS
  2. java -cp .:antlr-3.2.jar MainASTDemo > ast-tree.dot
  3.  
  4. // Windows
  5. java -cp .;antlr-3.2.jar MainASTDemo > ast-tree.dot

文件ast-tree.dot现在包含:

  1. digraph {
  2.  
  3. ordering=out;
  4. ranksep=.4;
  5. bgcolor="lightgrey"; node [shape=Box,fixedsize=false,fontsize=12,fontname="Helvetica-bold",fontcolor="blue"
  6. width=.25,height=.25,color="black",fillcolor="white",style="filled,solid,bold"];
  7. edge [arrowsize=.5,style="bold"]
  8.  
  9. n0 [label="ROOT"];
  10. n1 [label="EXPRESSION"];
  11. n1 [label="EXPRESSION"];
  12. n2 [label="*"];
  13. n2 [label="*"];
  14. n3 [label="12"];
  15. n4 [label="EXPRESSION"];
  16. n4 [label="EXPRESSION"];
  17. n5 [label="-"];
  18. n5 [label="-"];
  19. n6 [label="5"];
  20. n7 [label="6"];
  21. n8 [label="EXPRESSION"];
  22. n8 [label="EXPRESSION"];
  23. n9 [label="^"];
  24. n9 [label="^"];
  25. n10 [label="^"];
  26. n10 [label="^"];
  27. n11 [label="2"];
  28. n12 [label="3"];
  29. n13 [label="EXPRESSION"];
  30. n13 [label="EXPRESSION"];
  31. n14 [label="+"];
  32. n14 [label="+"];
  33. n15 [label="4"];
  34. n16 [label="1"];
  35.  
  36. n0 -> n1 // "ROOT" -> "EXPRESSION"
  37. n1 -> n2 // "EXPRESSION" -> "*"
  38. n2 -> n3 // "*" -> "12"
  39. n2 -> n4 // "*" -> "EXPRESSION"
  40. n4 -> n5 // "EXPRESSION" -> "-"
  41. n5 -> n6 // "-" -> "5"
  42. n5 -> n7 // "-" -> "6"
  43. n0 -> n8 // "ROOT" -> "EXPRESSION"
  44. n8 -> n9 // "EXPRESSION" -> "^"
  45. n9 -> n10 // "^" -> "^"
  46. n10 -> n11 // "^" -> "2"
  47. n10 -> n12 // "^" -> "3"
  48. n9 -> n13 // "^" -> "EXPRESSION"
  49. n13 -> n14 // "EXPRESSION" -> "+"
  50. n14 -> n15 // "+" -> "4"
  51. n14 -> n16 // "+" -> "1"
  52.  
  53. }

可以使用many viewers之一查看.甚至有在线观众.以此为例:http://graph.gafol.net/

当给它的内容物时,会产生以下图像:

alt text http://img19.imageshack.us/img19/4836/expression.png

猜你在找的C#相关文章