我正在尝试编译一串源代码并使用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
运行此:
$ ./a.out
[...]
0
$
从编译器获取解析树需要做什么?我还尝试使用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
运行它不会产生任何输出。
答案 0 :(得分:3)
我能够通过提供PolyML.Compiler.CPCompilerResultFun
编译器选项来获取它。它允许你access and save the parse tree。但是,我不能过多地说出解析树是如何实际表示的。有一些文档here(网站对我来说不起作用),但我还没有太多意义。
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 ();