मैं निम्नलिखित न्यूनतम Peg.js व्याकरण परिभाषित किया है:peg.js (उदाहरण के साथ) में बैकट्रैकिंग कैसे काम करता है?
start = "A1"/"A123"
जो आप in the sandbox कोशिश कर सकते हैं।
मैं "ए 1" के साथ-साथ "ए 123" (मेरे बैकट्रैकिंग कार्यों के बारे में मेरी धारणा के अनुसार) से मिलान करने की अपेक्षा करता। लेकिन यह मामला नहीं है: व्याकरण "ए 1" पहचानता है लेकिन "ए 123" नहीं।
नोट: मैं संबंधित प्रश्न How to transform a simple grammar into something which works in PEG.js (expected "a" but "a" found) में "आपकी शर्तों के क्रम को उलट देता हूं" सलाह की तलाश नहीं कर रहा हूं। इसके बजाय, मैं जो व्यवहार देख रहा हूं उसे समझने के लिए देख रहा हूं, और इस मामले में पेग.जेएस का बैकट्रैकिंग क्यों लागू नहीं होता है। मेरी शर्तों के क्रम को उलटाने की व्याख्या के लिए, नीचे यथार्थवादी उदाहरण देखें, इसकी व्याख्या करने के लिए।
एक और यथार्थवादी उदाहरण के लिए, इकाइयों को पार्सिंग पर विचार करें। एक व्याकरण को मीट्रिक इकाइयों (जैसे "एम", "एमओएल") को वैकल्पिक उपसर्गों जैसे "मिमी", "एमएमओएल" के साथ-साथ "yr", "week", या "mo" जैसी गैर-मीट्रिक इकाइयों के साथ पहचानना चाहिए।
निम्नलिखित Peg.js व्याकरण "mol" को पहचान नहीं पाएगा क्योंकि यह "mo" खपत हो जाता है, और बैकट्रैक नहीं करता है।
start = nonmetric/metric/prefix metric
metric = "mol"/"l"/"m"/"g"
nonmetric = "yr"/"mo"/"week"/"day"/"hour"
prefix = "m"/"k"/"c"
मैं ANTLR में analagous बात कर सकते हैं; ("मो" या बल्कि, होगा कारण "मोल" या "mmol" की कीमत पर मान्यता प्राप्त होना बदलने शब्दों के क्रम में मदद नहीं करता।) अच्छा सफलता के साथ:
grammar units;
start : nonmetric | metric | prefix metric;
metric : 'mol' | 'l' | 'm' | 'g';
nonmetric : 'yr' | 'mo' | 'week' | 'day' | 'hour';
prefix : 'm' | 'k' | 'c';
इस समस्या के अच्छे उदाहरणों के लिए धन्यवाद जब कोई Antlr से Peg.js सीखने की कोशिश करता है। यह वास्तव में मुझे समझने में मदद करता है कि मेरे व्याकरण के साथ क्या गलत था। – Mitja