Tôi đã xác định tối thiểu Peg.js ngữ pháp sau:Tính năng backtracking hoạt động như thế nào trong peg.js (ví dụ)?
start = "A1"/"A123"
mà bạn có thể thử in the sandbox.
Tôi đã dự kiến sẽ khớp "A1" cũng như "A123" (theo ý niệm của tôi về cách hoạt động của backtracking). Nhưng đây không phải là trường hợp: ngữ pháp nhận ra "A1" nhưng không phải là "A123".
Lưu ý: Tôi không tìm kiếm lời khuyên "đảo ngược thứ tự các điều khoản của bạn" như trong câu hỏi có liên quan How to transform a simple grammar into something which works in PEG.js (expected "a" but "a" found). Thay vào đó, tôi đang tìm hiểu hành vi mà tôi thấy và lý do tại sao trường hợp này không thể áp dụng tính năng backtracking của Peg.js. Để giải thích lý do tại sao việc đảo ngược thứ tự các điều khoản của tôi không hiệu quả, hãy xem ví dụ thực tế hơn bên dưới.
Để biết ví dụ thực tế hơn, hãy xem xét phân tích đơn vị. Ngữ pháp nên nhận biết các đơn vị số liệu (như "m", "mol") với các tiền tố tùy chọn, như "mm", "mmol", cũng như các đơn vị không phải số liệu như "yr", "week" hoặc "mo".
Ngữ pháp Peg.js sau đây sẽ không nhận ra "mol" vì nó bị vấp phải "mo" và không quay lại. (Thay đổi thứ tự từ ngữ không giúp; hay đúng hơn, sẽ gây ra "mo" để được công nhận tại các chi phí của "mol" hoặc "mmol".)
start = nonmetric/metric/prefix metric
metric = "mol"/"l"/"m"/"g"
nonmetric = "yr"/"mo"/"week"/"day"/"hour"
prefix = "m"/"k"/"c"
tôi có thể làm điều analagous trong ANTLR với thành công tốt đẹp:
grammar units;
start : nonmetric | metric | prefix metric;
metric : 'mol' | 'l' | 'm' | 'g';
nonmetric : 'yr' | 'mo' | 'week' | 'day' | 'hour';
prefix : 'm' | 'k' | 'c';
Cảm ơn các ví dụ điển hình cho vấn đề này khi một người cố gắng tìm hiểu Peg.js đến từ Antlr. Nó thực sự giúp tôi hiểu được những gì địa ngục sai với ngữ pháp của tôi. – Mitja