Próbuję skompilować ciąg kodu źródłowego i wydrukować drzewo analizy za pomocą Poly/ML. Poniższy kod kompiluje, ale drzewo parse jest pusty:Uzyskiwanie drzewa składni z kodu źródłowego w języku 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
Running to:
$ ./a.out
[...]
0
$
Co muszę zrobić, aby dostać drzewo parsującej od kompilatora? Próbowałem również wariację przy użyciu parametru kompilatora CPCompilerResultFun
. Ale to też nie zadziałało:
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
Uruchomienie tego nie daje żadnego wyniku.
Czy możesz pokazać wartości drzewa parsowania? Użyłem twojego kodu i spróbowałem drukowania (a, b, c, itp.) I wydrukowałem "fn" niezależnie. – eatonphil
@eatonphil Nie mogłem dowiedzieć się, jak przejść przez drzewo. Dziś wieczorem przyjrzę się głębiej. Wszystko, co mogę powiedzieć, to nie "PolyML.print" je, uruchomić skrypt wewnątrz REPL, zapewnia lepszy ładniejszy druk. –
Właściwie to odkryłem, co robiłem źle. Te wartości są funkcjami, których ładną wartością jest "fn". Zadzwoniłem do nich i byłem w stanie sprawdzić, czego się spodziewałem, trochę jaśniej. – eatonphil