Tôi đang viết lexer (với re2c) và phân tích cú pháp (với Lemon) cho định dạng dữ liệu hơi phức tạp: CSV, nhưng với các loại chuỗi cụ thể tại những địa điểm cụ thể (ký tự chữ và số, ký tự chữ và số và dấu trừ) char ngoại trừ dấu ngoặc kép và dấu phẩy nhưng với dấu ngoặc ôm cân bằng, vv), các chuỗi bên trong dấu ngoặc và chuỗi trông giống như các cuộc gọi hàm với các dấu ngoặc mở và đóng có thể chứa các tham số.Hướng dẫn thiết kế cho trình phân tích cú pháp và lexer?
Ảnh đầu tiên của tôi ở đó là một lexer với nhiều trạng thái, mỗi trạng thái cung cấp định dạng chuỗi cụ thể. Nhưng sau nhiều tin nhắn "không mong muốn đầu vào" vô ích từ lexer (mà đã nhận rất lớn) tôi nhận ra rằng có lẽ nó đã cố gắng để làm công việc của trình phân tích cú pháp. Tôi loại bỏ lần thử đầu tiên của tôi và đi với một lexer chỉ với một trạng thái, nhiều thẻ ký tự và một trình phân tích cú pháp kết hợp các thẻ vào các loại chuỗi khác nhau. Điều này hoạt động tốt hơn, tôi nhận được nhiều lỗi cú pháp hữu ích hơn từ trình phân tích cú pháp khi có điều gì đó tắt, nhưng nó vẫn cảm thấy không hoàn toàn đúng. Tôi đang nghĩ đến việc thêm một hoặc hai trạng thái vào lexer, nhưng khởi tạo các trạng thái từ trình phân tích cú pháp, trong đó có một "tổng quan" tốt hơn về loại chuỗi nào được yêu cầu trong một cá thể đã cho. Nói chung tôi cảm thấy một chút ngu ngốc: (
Tôi không có nền CS chính thức và nhút nhát một chút so với lý thuyết toán học nặng. Nhưng có thể có một hướng dẫn hoặc cuốn sách ở đâu đó giải thích những gì một lexer nên (và không nên) Làm thế nào để xây dựng các mẫu mã thông báo tốt, khi nào sử dụng các trạng thái lexer, khi nào và làm thế nào để sử dụng các quy tắc đệ quy (với một trình phân tích cú pháp LALR), làm thế nào để tránh các quy tắc không rõ ràng. Các "Lex và YACC mồi/HOWTO" là tốt đẹp, nhưng không đủ.Vì tôi chỉ muốn phân tích một định dạng dữ liệu, sách về xây dựng trình biên dịch (giống như cuốn sách rồng đỏ) nhìn một chút quá khổ với tôi
Hoặc có thể ai đó có thể cho tôi một số quy tắc đơn giản ở đây.
Cảm ơn, điều này hữu ích. Tôi luôn bị cám dỗ để tạo ra các biểu thức thông minh cho các thiết bị đầu cuối của mình. Vì vậy, trong tương lai, tôi sẽ sử dụng nhiều quy tắc sản xuất hơn trong trình phân tích cú pháp của mình. – chiborg