मैं पुस्तक की अस्पष्ट सलाह के आधार पर अपने लेक्सर और पार्सर को अलग रखने के लिए इस पल की कोशिश कर रहा हूं, प्रोलॉग और प्राकृतिक भाषा विश्लेषण, जो वास्तव में किसी भी विवरण में नहीं जाता है लेक्सिंग/टोकनिंग के बारे में। तो मैं इसे एक शॉट दे रहा हूं और कई छोटे मुद्दों को देख रहा हूं जो मुझे इंगित करते हैं कि कुछ स्पष्ट है जो मुझे याद आ रही है।प्रोलॉग डीसीजी: लेखन प्रोग्रामिंग भाषा लेज़र
मेरे सभी छोटे टोकन पार्सर्स ठीक से काम कर रहे प्रतीत होते हैं; इस समय यह मेरा कोड का एक टुकड़ा है:
:- use_module(library(dcg/basics)).
operator('(') --> "(". operator(')') --> ")".
operator('[') --> "[". operator(']') --> "]".
% ... etc.
keyword(array) --> "array".
keyword(break) --> "break".
% ... etc.
यह एक सा दोहराव है, लेकिन यह काम करने लगता है। तब मैं कुछ सामान मैं पूरी तरह से प्यार नहीं करते और पर सुझावों का स्वागत होता है, लेकिन काम करने के लिए प्रतीत होता है:
मेरी tokenizer के लिए मुख्य शासन यह है:
token(X) --> whites, (keyword(X) ; operator(X) ; id(X) ; int(X) ; string(X)).
यह सही नहीं है, मुझे int
in,id(t)
में पार्स किया जाएगा क्योंकि keyword(X)
id(X)
से पहले आता है। तो मुझे लगता है कि यह पहला सवाल है।
मेरे पास बड़ा सवाल यह है कि मैं नहीं देखता कि इस स्थिति में टिप्पणियों को सही तरीके से कैसे एकीकृत किया जाए। मैंने निम्नलिखित कोशिश की है:
skipAhead --> [].
skipAhead --> (comment ; whites), skipAhead.
comment --> "/*", anything, "*/".
anything --> [].
anything --> [_], anything.
token(X) --> skipAhead, (keyword(X) ; operator(X) ; id(X) ; int(X) ; string(X)).
यह काम नहीं प्रतीत होता है; पार्स जो लौटते हैं (और मुझे कई पार्स मिलते हैं) ऐसा लगता है कि टिप्पणी को हटा दिया गया है। मैं घबरा गया हूं कि मेरा टिप्पणी नियम अनावश्यक रूप से अक्षम है और शायद बहुत अनावश्यक बैकट्रैकिंग को प्रेरित करता है। मैं भी घबरा गया हूं कि whites//0
डीसीजी/मूलभूत से निर्धारक है; हालांकि, समीकरण का वह हिस्सा काम करता प्रतीत होता है, यह सिर्फ टिप्पणी छोड़ने के साथ इसे एकीकृत कर रहा है जो ऐसा प्रतीत नहीं होता है।
अंतिम नोट के रूप में, मुझे नहीं लगता कि यहां से लाइन/कॉलम जानकारी वाले उपयोगकर्ता को प्रचारित पार्स त्रुटियों को कैसे संभालना है। ऐसा लगता है कि मुझे किसी प्रकार की वर्तमान लाइन/कॉलम जानकारी के माध्यम से ट्रैक करना और थ्रेड करना होगा और इसे टोकन में लिखना होगा और फिर शायद लाइन को पुनर्निर्माण करने का प्रयास करें यदि मैं कुछ ऐसा करना चाहता हूं जो इसे कैसे करता है। क्या यह निष्पक्ष है या वहां "अनुशंसित अभ्यास" है?
पूरा कोड in this haste पाया जा सकता है।
घबराहट wrt के लिए अच्छा कारण। 'टिप्पणी // 0':' वाक्यांश (टिप्पणी, "/ **/* /") सत्य है, लेकिन असफल होना चाहिए। – false