Tôi đang viết một trình dịch từ Lisp sang C và tôi gặp vấn đề với việc xử lý các chuỗi. Đây là một mã biến đổi hàm Lisp đơn nhất thành một hàm C tương đương:Lướt một danh sách các chuỗi trong Prolog
define(F) --> fun_unary(F), !.
fun_unary(F) --> "(define (", label(Fun), spaces, label(Arg1), ")", spaces, expr(Body), ")",
{swritef(F, "data *%t(data *%t) { return(%t); }", [Fun, Arg1, Body])}, !.
funs([F]) --> define(F), !.
funs([F|Fs]) --> define(F), spaces, funs(Fs), !.
Bây giờ tôi muốn đọc bất kỳ số hàm nào và trả về dưới dạng một chuỗi. Trên đây funs
là tốt nhất mà tôi có thể đưa ra, nhưng nó hoạt động như thế này:
?- funs(F, "(define (carzero l) (= (car l) 0)) (define (zero n) (= 0 n))", []).
F = ["data *carzero(data *l) { return(eq(car(l), make_atom_int(0))); }", "data *zero(data *n) { return(eq(make_atom_int(0), n)); }"].
Trong khi tôi muốn một cái gì đó như thế này:
F = "data *carzero(data *l) { return(eq(car(l), make_atom_int(0))); }\n\ndata *zero(data *n) { return(eq(make_atom_int(0), n)); }".
để tôi có thể độc đáo swritef
là vào một chương trình hoàn chỉnh , giữa #include
s và chính(). Một giải pháp thay thế là sửa đổi trình dịch cấp cao nhất để xử lý danh sách. Nó trông giống như sau:
program(P) --> define(F), {swritef(P, "#include \"lisp2c.h\" \n\n%t \nint main() { return 0; }", [F])}, !.
Làm cách nào để thực hiện một trong hai cách này? Tôi đang sử dụng SWI Prolog.
Đối tượng đề cập Prolog, trong khi cơ thể của câu hỏi hỏi về bản dịch "Lisp to C". Giúp tôi phân loại những gì ở đây. Các đoạn mã trông hơi giống Prolog, có lẽ vì cú pháp DCG đặc biệt đang bị nhầm lẫn với cú pháp cơ bản hơn của Prolog cho các quy tắc. Trong khi dòng chủ đề hỏi về "một danh sách các chuỗi trong Prolog", có vẻ như phân tích các chuỗi có chứa mã Lisp có liên quan. Việc kết hợp một danh sách các chuỗi là một nhiệm vụ tương đối đơn giản trong Prolog. Ví dụ mẫu của bạn ** funs/2 ** gợi ý bạn muốn ném vào một vài ký tự dòng mới giữa ... – hardmath
... chuỗi liên tiếp được ghép nối. Nếu đó là phạm vi của câu hỏi, tôi có thể trả lời nó, và chúng ta có thể phân loại sự nhầm lẫn của các cú pháp (nếu cần). – hardmath
Lisp to C dịch là những gì chương trình hiện. Chương trình được viết bằng Prolog, sử dụng cú pháp DCG để dịch từng trường hợp. Hầu hết các mã parse Lisp được xác định trước, với đối số của chúng là mã C kết quả. Tôi muốn hai dòng mới giữa các chuỗi nối. Hy vọng là vậy. – Igor