2016-02-23 16 views
5

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.

Odpowiedz

3

Udało mi się go uzyskać, udostępniając opcję kompilatora PolyML.Compiler.CPCompilerResultFun. To pozwala na access and save the parse tree. Jednak nie mogę powiedzieć zbyt wiele o tym, jak drzewo analizowane jest faktycznie reprezentowane. Jest pewna dokumentacja here (strona jest dla mnie niedostępna), ale nie mogłem jej jeszcze zrozumieć.

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(); 
+0

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

+1

@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. –

+1

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

Powiązane problemy