मैं उपयोगकर्ता-परिभाषित डोमेन विशिष्ट भाषाओं को पार्स करना चाहता हूं। ये भाषाएं आम तौर पर गणितीय संकेतन के करीब होती हैं (मैं एक प्राकृतिक भाषा को पार्स नहीं कर रहा हूं)। उपयोगकर्ता अपने DSL को BNF संकेतन में इस तरह परिभाषित करते हैं:
expr ::= LiteralInteger
| ( expr )
| expr + expr
| expr * expr
इनपुट 1 + ( 2 * 3 )
को स्वीकार किया जाना चाहिए, जबकि इनपुट 1 +
को गलत के रूप में अस्वीकार किया जाना चाहिए, और इनपुट 1 + 2 * 3
को अस्पष्ट के रूप में अस्वीकार किया जाना चाहिए।
यहां एक केंद्रीय कठिनाई उपयोगकर्ता के अनुकूल तरीके से अस्पष्ट व्याकरण का सामना कर रही है। व्याकरण को असंदिग्ध होने के लिए प्रतिबंधित करना एक विकल्प नहीं है: यही वह तरीका है कि भाषा है - विचार यह है कि लेखक पितृपक्ष को छोड़ना पसंद करते हैं जब वे अस्पष्टता से बचने के लिए आवश्यक नहीं होते हैं। जब तक एक अभिव्यक्ति अस्पष्ट नहीं है, मुझे इसे पार्स करने की आवश्यकता है, और यदि ऐसा नहीं है, तो मुझे इसे अस्वीकार करने की आवश्यकता है।
मेरे पार्सर को किसी भी संदर्भ-मुक्त व्याकरण, यहां तक कि अस्पष्ट लोगों पर भी काम करना चाहिए, और सभी अस्पष्ट इनपुट को स्वीकार करना चाहिए। मुझे सभी स्वीकृत इनपुट के लिए पार्स ट्री की आवश्यकता है। अमान्य या अस्पष्ट इनपुट के लिए, मैं आदर्श रूप से अच्छे त्रुटि संदेश चाहता हूं, लेकिन इसके साथ शुरू करने के लिए मैं वही ले सकता हूं जो मुझे मिल सकता है।
मैं आमतौर पर कभी-कभार इनपुट के साथ पार्सर को अपेक्षाकृत कम इनपुट पर आमंत्रित करता हूं। तो asymptotically तेज एल्गोरिथ्म सबसे अच्छा विकल्प नहीं हो सकता है। मैं 20 प्रतीकों से कम लगभग 80% इनपुट्स के वितरण के लिए अनुकूलन करना चाहता हूं, 20 और 50 प्रतीकों के बीच 19%, और 1% दुर्लभ इनपुट इनपुटों के बीच। अमान्य इनपुट के लिए गति एक बड़ी चिंता का विषय नहीं है। इसके अलावा, मैं हर 1000 से 100000 इनपुट के आसपास DSL के संशोधन की उम्मीद करता हूं; मैं एक-दो मिनट नहीं, बल्कि अपने व्याकरण के बारे में कुछ सेकंड पहले ही खर्च कर सकता हूं।
मेरे विशिष्ट इनपुट आकारों को देखते हुए मुझे क्या एल्गोरिथ्म की जांच करनी चाहिए? क्या त्रुटि रिपोर्टिंग मेरे चयन में एक कारक होनी चाहिए, या क्या मुझे अस्पष्ट इनपुटों को पार्स करने पर ध्यान केंद्रित करना चाहिए और संभवतः त्रुटि प्रतिक्रिया प्रदान करने के लिए पूरी तरह से अलग, धीमी गति से चलने वाला पार्सर चलाना चाहिए?
(उस परियोजना में जहां मुझे जरूरत थी (थोड़ी देर पहले), मैंने CYK का उपयोग किया , जिसे लागू करना बहुत मुश्किल नहीं था और अपने इनपुट आकारों के लिए पर्याप्त रूप से काम किया लेकिन बहुत अच्छी त्रुटियों का उत्पादन नहीं किया।)
x+y+z
।
+
, इसलिए x+y+z
यह वास्तव में अस्पष्ट है इसलिए गलत है।