ऐसा लगता है कि आप एक लेक्स-पर-पार्स स्टाइल पार्सर कर रहे हैं, जहां आपको लेजर में एक साधारण राज्य मशीन की आवश्यकता होगी ताकि यूनरी और बाइनरी माइनस के लिए अलग टोकन प्राप्त हो सकें। यदि आप एक DEFAULT
राज्य है जहां -
चरित्र पर विचार करेंगे UNARY_MINUS
होने के लिए चाहते हैं (एक पेग पार्सर में, यह नहीं कुछ आप के बारे में चिंता करने की ज़रूरत है।)
JavaCC में,। जब आपने प्राथमिक अभिव्यक्ति के अंत (या तो एक बंद करने वाला अभिभावक, या एक पूर्णांक, आपके द्वारा दिए गए उदाहरणों के आधार पर) को टोकननाइज्ड किया, तो आप INFIX
स्थिति पर स्विच करेंगे जहां -
INFIX_MINUS
माना जाएगा। एक बार जब आप किसी भी इंफिक्स ऑपरेटर का सामना कर चुके हैं, तो आप DEFAULT
स्थिति पर वापस आ जाएंगे।
यदि आप अपना खुद का रोलिंग कर रहे हैं, तो यह उससे थोड़ा आसान हो सकता है। इसे करने के एक चालाक तरीके के लिए इस Python code पर देखें। असल में, जब आप -
का सामना करते हैं, तो आप यह देखने के लिए जांचें कि पिछला टोकन एक इंफिक्स ऑपरेटर था या नहीं। वह उदाहरण अनौपचारिक टोकननाइज़ेशन के लिए सुविधाजनक है, जो यूनरी माइनस टोकन का प्रतिनिधित्व करने के लिए स्ट्रिंग "-u"
का उपयोग करता है। सबसे अच्छा मैं बता सकता हूं, पाइथन उदाहरण उस मामले को संभालने में विफल रहता है जहां -
खुले माता-पिता का अनुसरण करता है, या इनपुट की शुरुआत में आता है। उनको भी असाइन माना जाना चाहिए।
यूनिट माइनस को शंटिंग-यार्ड एल्गोरिदम में सही ढंग से संभालने के लिए, किसी भी इंफिक्स ऑपरेटरों की तुलना में इसे उच्च प्राथमिकता की आवश्यकता होती है, और इसे सही-सहयोगी के रूप में चिह्नित करने की आवश्यकता होती है। (सुनिश्चित करें कि आप सही-सहयोगीता को संभालते हैं।आपने इसे छोड़ दिया होगा क्योंकि आपके बाकी ऑपरेटर बाएं-सहयोगी हैं।) यह पाइथन कोड में पर्याप्त स्पष्ट है (हालांकि मैं दो अलग-अलग मानचित्रों के बजाय किसी प्रकार की संरचना का उपयोग करता हूं)।
जब मूल्यांकन करने का समय आता है, तो आपको यूनरी ऑपरेटरों को थोड़ा अलग तरीके से संभालना होगा, क्योंकि आपको केवल दो की बजाय स्टैक से एक नंबर पॉप करना होगा। आपके कार्यान्वयन की तरह दिखने के आधार पर, सूची के माध्यम से जाना आसान हो सकता है और की प्रत्येक घटना को [-1, "*"]
से बदलना आसान हो सकता है।
यदि आप पाइथन का पालन कर सकते हैं, तो आप जिस उदाहरण के बारे में बात कर रहे हैं, उसके बारे में आप जो कुछ भी बात कर रहे हैं, उसे देखने में सक्षम होना चाहिए। मुझे कोड को सी संस्करण से पढ़ने के लिए थोड़ा आसान लगता है जिसे किसी और ने बताया है। इसके अलावा, यदि आप उत्सुक हैं, तो मैंने थोड़ी देर पहले शंटिंग-यार्ड in Ruby का उपयोग करने के बारे में थोड़ा सा लिख लिया था, लेकिन मैंने यूनरी ऑपरेटरों को एक अलग nonterminal के रूप में संभाला, इसलिए वे नहीं दिखाए जाते हैं।
मैंने ' जावा 'टैग, मैंने सोचा कि यह आपके प्रश्न को और अधिक विचार मिल सकता है। –