2010-06-30 19 views
10

Tôi đã cố gắng để phân tích Lisp đơn giản/đề án như mãBuilding Lisp/Đề án giống như với flex/bò rừng bizon

E.g. (func a (b c d)) 

và xây dựng một cây từ nó, tôi có thể làm phân tích trong C mà không cần sử dụng bison (tức là chỉ sử dụng flex để trả lại mã thông báo và xây dựng cây bằng đệ quy). Nhưng, với bison ngữ pháp, tôi không chắc chắn nơi để thêm mã vào tạo danh sách (tức là, quy tắc liên kết với thiết bị đầu cuối tích lũy biểu tượng và nơi liên kết danh sách được xây dựng cho nút chính).

Ngữ pháp của tôi giống với ngữ pháp ở đây: Lisp grammar in yacc ngữ pháp là chính xác và có thể nhận ra mã.

+1

Tôi đã gắn thẻ lại từ 'flex' thành' gnu-flex' bất chấp lời khuyên phản hồi tại đây: http://meta.stackexchange.com/questions/26460/tag-for-two-flexes/26708#26708 đơn giản vì nó là gây nhầm lẫn cho nhiều khách truy cập vào trang web để xem biểu tượng Adobe trên thẻ. Hy vọng rằng điều này sẽ sớm được sắp xếp. Tốt nhất của may mắn nhận được một câu trả lời cho câu hỏi của bạn. – bernie

+5

Bạn hầu như không cần flex hay bison để phân tích các biểu thức S đơn giản. Bạn sẽ có thể mã hóa nó như một trình phân tích cú pháp gốc đệ quy đơn giản với một lexer được cuộn bằng tay cho các nguyên tử, các dấu ngoặc đơn và một trình thu thập dấu cách trắng trong một thứ gì đó giống như một trăm dòng C hoặc ít hơn. Các thông dịch viên LISP ban đầu chắc chắn đã làm điều này chỉ với một chút mã. –

+2

Ira: Đúng là không cần một trình phân tích cú pháp, nhưng "lexer cuộn bằng tay" chỉ hoạt động cho các tập con đồ chơi thông thường mà mọi người thường kết thúc. Một số Lisps/Schemes có thẻ có thể nhận được * rất * lông. Đối với giải trí của bạn, đây là một ví dụ cho một hằng số hợp lệ trong [Racket] (http://racket-lang.org/): '# e # x + e # s + e @ -e # l-e'. –

Trả lời

3

Bạn đã thử đặt mã để thêm phần tử vào danh sách hiện tại trong từng nguyên tử và mã để quản lý một danh sách cây khi bạn xử lý dấu ngoặc vuông chưa? Có vẻ như cách dễ nhất trừ khi bạn gặp phải các vấn đề khác:

listend: members ')'  { cur = cur->parent; } 
     | ')'    { cur = cur->parent; } 
     ; 

list: '(' listend   { cur = newList(cur);} 
    ; 

atom: ID     { appendAtom(cur, "ID"); } 
    | NUM     { appendAtom(cur, "NUM");} 
    | STR     { appendAtom(cur, "STR");} 
    ; 

Giả định rằng bạn giữ nguyên điểm cha trong mỗi cấu trúc danh sách.

+0

Hi Amoss, tôi đã không thử với một con trỏ cha mẹ, sẽ thử phương pháp này. Cảm ơn. – vyom

+0

vjom: Nó có hoạt động không? Nếu vậy xin vui lòng cho Amoss của mình do bằng cách chấp nhận câu trả lời :) – Baggers

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