2016-02-23 15 views
5

Tôi đang cố gắng biên dịch một chuỗi mã nguồn và in cây phân tích bằng Poly/ML. Các mã sau biên dịch, nhưng cây phân tích cú pháp là rỗng:Lấy cây phân tích từ chuỗi mã nguồn trong 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 

Chạy này:

$ ./a.out 
[...] 
0 
$ 

gì tôi cần phải làm để có được cây phân tích cú pháp từ trình biên dịch? Tôi cũng đã thử một biến thể bằng cách sử dụng thông số biên dịch CPCompilerResultFun. Nhưng điều này không hoạt động:

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 

Chạy điều này không tạo ra bất kỳ đầu ra nào.

Trả lời

3

Tôi có thể lấy nó bằng cách cung cấp tùy chọn trình biên dịch PolyML.Compiler.CPCompilerResultFun. Nó cho phép bạn access and save the parse tree. Tuy nhiên, tôi không thể nói quá nhiều về cách cây phân tích thực sự được đại diện. Có một số tài liệu hướng dẫn here (trang web là xuống cho tôi), nhưng tôi đã không thể làm quá nhiều ý nghĩa của nó được nêu ra.

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

Bạn có thể chứng minh các giá trị của cây phân tích cú pháp không? Tôi đã sử dụng mã của bạn và đã thử in (a, b, c, v.v.) và nó được in "fn" bất kể. – eatonphil

+1

@eatonphil Tôi không thể tìm ra cách đi qua cây. Tối nay tôi sẽ xem xét kỹ hơn. Tất cả tôi có thể nói là không 'PolyML.print' họ, chạy kịch bản bên trong REPL, nó cung cấp tốt hơn khá in ấn. –

+1

Thực ra, tôi đã tìm ra những gì tôi đã làm sai. Các giá trị đó là các hàm có giá trị in đẹp là "fn". Tôi gọi cho họ và có thể kiểm tra những gì tôi mong đợi một chút rõ ràng hơn. – eatonphil

Các vấn đề liên quan