पार्स करने मैं इस ANTLR 4 व्याकरण की है। समस्या क्या है और मैं इसे कैसे हल कर सकता हूं?ANTLR4 परस्पर बाएं पुनरावर्ती त्रुटि
उत्तर
एंटर एक एलएल (*) पार्सर है, जो LL(k) parser से "बेहतर" कई तरीकों से है, लेकिन इसके कई फायदे हैं। इनमें से एक तथ्य यह है कि यह बाएं-रिकर्सन से निपट नहीं सकता है (वास्तव में, संस्करण 4 उसी नियम के भीतर बाएं-रिकर्सन से निपट सकता है)। त्रुटि क्या कह रही है कि आपके पास व्याकरण का बायां-रिकर्सन है, जो एलएल पार्सर्स के लिए एक झुकाव है।
यह आपके व्याकरण में इस निर्माण के कारण होता है:
constantFixedExpression: term ...;
term: factor ...;
factor: ('+' | '-')* (constantFixedExpression | ...) ...;
के बाद से *
ऑपरेटर का मतलब है 0 या उससे अधिक है, मैं 0 के साथ यह दृष्टांत सकते हैं, तो पार्सर यह कर देगा: "constantFixedExpression
कोशिश, तो यह term
को आजमाने की आवश्यकता है, इसलिए इसे factor
को आजमाने की आवश्यकता है, इसलिए इसे constantFixedEXpression
को आजमाने की आवश्यकता है, इसलिए यह [...] "और आपके पास एक अनंत लूप है।
सौभाग्य से, विषय से मुक्त औपचारिक व्याकरण बाएं प्रत्यावर्तन दूर करने के लिए एक समान परिवर्तन है!
A -> Aa | b
-- becomes --
A -> bR
R -> aA | ε
या antlr अंकन में:: यह द्वारा सामान्य रूप से व्यक्त किया जा सकता
A: Aa | b;
// becomes
A: bR;
R: (aA)?;
अधिक इस प्रक्रिया के बारे में जानकारी आटोमैटिक मशीन में पाया जा सकता/किताबें या Wikipedia में grammars।
मैं आपके काम के रूप में बाएं-रिकर्सन को हटाने के लिए रिफैक्टरेशन के साथ अपने व्याकरण को सही कर दूंगा। हालांकि, मैं एक और बिंदु में छूना चाहता हूं: Antlr 4 बाएं-रिकर्सन कर सकता है! जैसा कि मैंने उल्लेख किया है, संस्करण 4 उसी नियम के भीतर बाएं-रिकर्सन से निपट सकता है। Antlr4 में, जैसा कि आप कर रहे हैं, सीधे पार्सिंग के अलावा ऑपरेटरों की प्राथमिकता और सहयोगीता को इंगित करने के तरीके हैं। चलो देखते हैं कि यह कैसे काम करता है:
expr: NUMBER
|<assoc=right> expr '^' expr
| expr '*' expr
| expr '/' expr
| expr '+' expr
| expr '-' expr;
यह मूल कैलकुलेटर व्याकरण का एक उदाहरण है। शीर्ष पर ऑपरेटर उच्च प्राथमिकता वाले हैं, और नीचे वाले लोग निम्न प्राथमिकता के हैं। इसका अर्थ है 2+2*3
के बजाय 2+(2*3)
के रूप में पार्स किया जाएगा। <assoc=right>
निर्माण का मतलब ऑपरेटर को सही-सहयोगी में है, इसलिए 1^2^3
को (1^2)^3
के बजाय 1^(2^3)
के रूप में पार्स किया जाएगा।
जैसा कि आप देख सकते हैं, बाएं-रिकर्सन वाले ऑपरेटरों को निर्दिष्ट करना बहुत आसान है, इसलिए एंटर 4 इन क्षणों में बड़ी सहायता है! मैं इस सुविधा का उपयोग करने के लिए अपने व्याकरण को फिर से लिखने की सलाह देता हूं।
- 1. कैसे परस्पर पुनरावर्ती कार्यों
- 2. Antlr4
- 3. Antlr4
- 4. ANTLR4:
- 5. Antlr4, सी # में, त्रुटि हैंडलिंग की उम्मीद
- 6. antlr4: ParseTrees
- 7. Coq: एक बाएं पुनरावर्ती अंकन एक स्पष्ट स्तर
- 8. Antlr4 C++ लक्ष्य
- 9. antlr4 अजगर लक्ष्य यूनिकोड
- 10. antlr4 sql व्याकरण
- 11. AnTLR4: मांगपत्र और DEDENT टोकन
- 12. परस्पर अनन्य एनोटेशन
- 13. Antlr4 सी # एप्लिकेशन ट्यूटोरियल/उदाहरण
- 14. Antlr4 "टेस्ट रिग" और मैवेन
- 15. परस्पर अनन्य नियमित अभिव्यक्ति
- 16. WPF परस्पर अनन्य listboxes
- 17. परस्पर घुमावदार लाइनों
- 18. सेवा परत परस्पर निर्भरता
- 19. परस्पर विरोधी माणिक रत्न
- 20. nginx त्रुटि "परस्पर विरोधी सर्वर नाम" को नजरअंदाज कर दिया
- 21. पुनरावर्ती ManyToMany
- 22. mysql - परस्पर निर्भर विदेशी कुंजी
- 23. बाएं से बाएं UILabels
- 24. स्प्रिंग AOP पुनरावर्ती कॉल
- 25. पुनरावर्ती पैटर्न
- 26. लिंक बाएं बाहरी शामिल हों - डिफ़ॉल्ट त्रुटि त्रुटि
- 27. एंड्रॉयड: एक परस्पर विरोधी निर्भरता
- 28. सी चेतावनी परस्पर विरोधी प्रकार
- 29. antlr4 विज़िटर का उपयोग कैसे करें
- 30. antlr4 पार्सर फिर से उपयोग और गर्म
अपनी पोस्ट को प्रारूपित करें –
वाह, लोगों ने इसे क्यों कम किया? –