Ngôn ngữ lệnh shell POSIX không dễ phân tích cú pháp, chủ yếu là do khớp nối chặt chẽ giữa lexing và phân tích cú pháp.Phân tích cú pháp ngữ pháp biểu thức có phù hợp để phân tích cú pháp ngôn ngữ lệnh shell không?
Tuy nhiên, phân tích cú pháp ngữ pháp biểu thức (PEG) thường không cần quét. Bằng cách kết hợp lexing và phân tích cú pháp, có vẻ như tôi có thể tránh được những vấn đề này. Ngôn ngữ tôi đang sử dụng (Rust) có một thư viện PEG được duy trì tốt. Tuy nhiên, tôi biết ba khó khăn có thể khiến việc sử dụng thư viện này không thực tế:
- Vỏ phải có khả năng phân tích từng dòng, không đọc ký tự ở cuối dòng.
- biệt hiệu là hoàn toàn từ vựng, và có thể gây ra một mã thông báo để được thay thế bằng bất kỳ chuỗi các thẻ khác trong một số tình huống
- Shell từ dành riêng chỉ được ghi nhận trong một số tình huống
là một PEG phù hợp với phân tích cú pháp ngôn ngữ lệnh shell cho các yêu cầu này, hoặc là một trình phân tích cú pháp đệ quy-viết tay thích hợp hơn?
FWIW, bash sử dụng trình phân tích cú pháp được tạo bằng bison khá đơn giản, được kết hợp với một từ viết tay cực kỳ phức tạp. Tôi không biết PEG sẽ hoạt động tốt như thế nào, nhưng nếu bạn thử, hãy cho chúng tôi biết. – rici
Ba lý do: đó là GPL trong khi trình bao của tôi thuộc MIT/Apache 2, nó nằm trong C trong khi shell của tôi nằm trong Rust, và tôi sẽ không học được gì từ nó. – Demi
Có. Trình phân tích cú pháp PEG thực hiện quét. Ngôn ngữ ngữ pháp mạnh hơn các biểu thức thông thường và nhỏ gọn và tiện lợi. Tôi đã dịch vài ngữ pháp ANTLR sang Grako (PEG), và phần từ vựng đã dịch dễ dàng. Tuy nhiên, PEG sẽ kém hiệu quả hơn so với lexer dựa trên máy trạng thái. – Apalala