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