2009-09-11 80 views
29

Tôi biết và sử dụng bison/yacc. Nhưng trong phân tích thế giới, có rất nhiều tiếng vang xung quanh phân tích cú pháp.Phân tích cú pháp là gì?

Nó là gì? Có đáng để học?

Trả lời

3

Pyparsing là thư viện phân tích cú pháp tinh khiết Python hỗ trợ phân tích cú pháp gói, vì vậy bạn có thể xem cách triển khai phân tích gói. Pyparsing sử dụng một kỹ thuật ghi nhớ để lưu các lần phân tích cú pháp trước đó cho một biểu thức ngữ pháp cụ thể tại một vị trí cụ thể trong văn bản đầu vào. Nếu ngữ pháp liên quan đến việc thử lại biểu thức tương tự ở vị trí đó, nó bỏ qua logic phân tích tốn kém và chỉ trả lại kết quả hoặc ngoại lệ từ bộ nhớ đệm ghi nhớ.

Có thêm thông tin tại đây tại FAQ page của wiki pyparsing, cũng bao gồm các liên kết quay lại luận án ban đầu của Bryan Ford về phân tích gói.

27

Phân tích cú pháp gói là cách cung cấp hiệu suất tốt hơn tiệm cận cho parsing expression grammars (PEG); đặc biệt cho PEG, có thể đảm bảo phân tích cú pháp linear time.

Về cơ bản, phân tích cú pháp Packrat chỉ có nghĩa là bộ nhớ đệm cho dù các biểu thức con khớp với vị trí hiện tại trong chuỗi khi chúng được kiểm tra - điều này có nghĩa là nếu nỗ lực hiện tại phù hợp với chuỗi thành biểu thức không thành công. các biểu thức có thể được hưởng lợi từ sự vượt qua/thất bại của các biểu thức con đã biết tại các điểm trong chuỗi mà chúng đã được kiểm tra.

+3

Sửa lỗi nếu tôi sai, nhưng khả năng cố gắng khớp một vài biểu tượng nonterminal khác nhau tại một vị trí nhất định (tính năng của PEG) ngụ ý cũng không giới hạn lookahead. Điều này có nghĩa rằng bạn có thể cần giữ lại các phần quan trọng của đầu vào được mã hóa trong bộ nhớ. Đúng? – Honza

+2

@ Honza: Đó là một sự cân bằng thời gian/không gian cổ điển. Bạn có khả năng theo dõi N con đường một cái khác trước khi tìm đúng, hoặc bạn có khả năng theo N đường dẫn cùng một lúc giữ mỗi trong bộ nhớ. Dù bằng cách nào, nếu bạn nhìn về phía trước quá xa nó hút, và nếu bạn không nhìn về phía trước ở tất cả không có chi phí. Tôi chắc chắn rằng 2G ram lappy của tôi sẽ không đổ mồ hôi nếu tôi nhìn về phía trước 1 mã thông báo, 2 thẻ, 3 thẻ ... miễn là bạn không cố gắng phân tích ngôn ngữ tự nhiên, bạn nên ổn. – efrey

+0

Nếu sử dụng 'lazy vals' (Scala Parser Combinators), thì phân tích cú pháp' packrat' đã đạt được chưa? Nói cách khác, nếu tôi đang sử dụng 'lazy val''s cho cache đã được phân tích cú pháp, thì tôi đã sử dụng' phân tích cú pháp gói' chưa? –

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