从Poly/ML中的源代码字符串获取解析树

eat*_*hil 5 sml polyml

我正在尝试编译一串源代码并使用Poly/ML打印解析树.以下代码编译,但解析树为空:

fun main () =
    let
        val stream = TextIO.openString "let val a = \"abc\"; val b = \"def\"; val c = a ^ b in print c end";
        val _ = PolyML.compiler (fn () => TextIO.input1 stream, []);
        val (_, parseTree) = !PolyML.IDEInterface.parseTree
    in
        PolyML.print (parseTree);
        PolyML.print (List.length parseTree);
        List.map PolyML.print (parseTree);
        ()
    end
Run Code Online (Sandbox Code Playgroud)

运行这个:

$ ./a.out
[...]
0
$
Run Code Online (Sandbox Code Playgroud)

从编译器获取解析树需要做什么?我还尝试使用CPCompilerResultFun编译器参数进行变体.但这也不起作用:

fun main () =
    let
        fun useTree (NONE, _) () =
            (PolyML.print "not parsed"; ())
          | useTree (SOME parseTree, _) () =
            (PolyML.print "parsed"; PolyML.print parseTree; ());

        val stream = TextIO.openString "let val a = \"abc\"; val b = \"def\"; val c = a ^ b in print c end";
        val _ = PolyML.compiler (fn () => TextIO.input1 stream, [PolyML.Compiler.CPCompilerResultFun useTree]);
    in
        ()
    end
Run Code Online (Sandbox Code Playgroud)

运行它不会产生任何输出.

Ion*_*tan 3

我可以通过提供PolyML.Compiler.CPCompilerResultFun编译器选项来获取它。它允许您访问和保存解析树。但是,我不能过多谈论解析树的实际表示方式。这里有一些文档(该网站对我来说已经关闭),但我还无法理解它。

val resultTrees : PolyML.parseTree list ref = ref [];

fun compilerResultFun (parsetree, codeOpt) =
  let
    val _ =
      case parsetree of
        SOME pt => resultTrees := !resultTrees @ [pt]
      | NONE => ()
  in
    fn () => raise Fail "not implemented"
  end;

val stream = TextIO.openString "val a = 1";

val _ = PolyML.compiler (fn () => TextIO.input1 stream, [
  PolyML.Compiler.CPCompilerResultFun compilerResultFun
]);

val [(a, [PolyML.PTfirstChild b])] = !resultTrees;
val (_, [PolyML.PTfirstChild c, PolyML.PTparent d, PolyML.PTprint e]) = b ();
Run Code Online (Sandbox Code Playgroud)