प्रोग्रामिंग लैंग्वेज, रेगुलर एक्सप्रेशंस और फॉर्मल लैंग्वेज के बीच रिलेशनशिप क्या है


25

मैंने इस प्रश्न के उत्तर के लिए नेट के चारों ओर देखा है और ऐसा लगता है जैसे मेरे अलावा हर व्यक्ति को इसका उत्तर पता है। संभवतया ऐसा इसलिए है क्योंकि देखभाल करने वाले केवल वही लोग हैं जिन्होंने इस विषय पर तृतीयक शिक्षा प्राप्त की है। दूसरी ओर, मुझे एक हाई स्कूल असाइनमेंट के लिए गहरे अंत में फेंक दिया गया है।

मेरा सवाल यह है कि औपचारिक भाषाओं से संबंधित प्रोग्रामिंग कैसे ठीक हैं? हर जगह मैंने पढ़ा, "प्रोग्रामिंग भाषाओं के व्याकरण को परिभाषित करने के लिए औपचारिक भाषाओं का उपयोग किया जाता है" कुछ कहा जाता है।

अब मैं जो इकट्ठा करने में सक्षम था, एक औपचारिक भाषा उत्पादन नियमों की एक श्रृंखला है जो प्रतीकों के एक विशिष्ट सेट (भाषा की वर्णमाला) पर लागू होती है। ये उत्पादन नियम परिवर्तनों का एक सेट परिभाषित करते हैं, जैसे:

b -> a

aaa->c

यह इस तरह लागू किया जा सकता है:

abab->aaaa aaaa-> ca

एक साइड नोट के रूप में, यदि हम परिभाषित करते हैं कि हमारी औपचारिक भाषा की वर्णमाला {a, b, c} के रूप में है, तो a और b गैर टर्मिनल हैं और c टर्मिनल है क्योंकि इसे रूपांतरित नहीं किया जा सकता (कृपया मुझे सही करें अगर मैं गलत हूं उस)।

तो यह सब देखते हुए, यह कैसे प्रोग्रामिंग भाषाओं पर लागू होता है? अक्सर यह भी कहा जाता है कि व्याकरण सही है यह सुनिश्चित करने के लिए regex का उपयोग किसी पाठ को भाषा में पार्स करने के लिए किया जाता है। यह समझ में आता है। तब यह कहा जाता है कि regex को औपचारिक भाषाओं द्वारा परिभाषित किया गया है। Regex सही या गलत (मेरे अनुभव में कम से कम) वापसी पर निर्भर करता है यदि परिमित राज्य ऑटोमेटा जो रेगेक्स का प्रतिनिधित्व करता है, लक्ष्य बिंदु तक पहुंचता है। जहाँ तक मैं देख सकता हूँ, कि परिवर्तन * से कोई लेना देना नहीं है।

कार्यक्रम के संकलन के लिए, मुझे लगता है कि एक औपचारिक भाषा कोड को लगातार निचले स्तर के कोड में बदलने में सक्षम होगी, अंततः नियमों के एक जटिल सेट के माध्यम से विधानसभा तक पहुंच जाएगी, जिसे हार्डवेयर तब समझ सकता था।

तो यह मेरे भ्रमित दृष्टिकोण से चीजें हैं। मेरे द्वारा कही गई बातों में मूल रूप से बहुत सी गलतियाँ हैं, और इसीलिए मैं मदद माँग रहा हूँ।


* जब तक आप किसी चीज (a|b)*b*c->trueको उत्पादन नियम मानते हैं , उस स्थिति में नियम को एक परिमित राज्य ऑटोमेटा (यानी: regex) की आवश्यकता होती है। इसका कोई मतलब नहीं है क्योंकि हमने अभी कहा है


2
आप औपचारिक भाषाओं के साथ औपचारिक व्याकरणों को सीमित कर रहे हैं । एक व्याकरण फिर से लिखना नियमों का एक समूह है जो एक भाषा का वर्णन करता है। भाषा व्याकरण द्वारा वर्णित तारों का समूह है। तो एक व्याकरण एक नियमित अभिव्यक्ति का एक विकल्प है: यह एक भाषा का वर्णन करने का एक तरीका है।
रिस्टोरियरपोस्ट

@reinierpost आप पूरी तरह से सही हैं, विश्वविद्यालय के व्याख्यान नोट्स के माध्यम से मुझे इस जानकारी से कुछ मिला, मुझे अपनी गलती दिखती है।
Zwander

जब मैंने शुरुआत की तो मैंने आपका भ्रम साझा किया। बेशक, व्याकरण एक भाषा भी बनाते हैं, और इसलिए नियमित अभिव्यक्ति करते हैं। लेकिन औपचारिक भाषा सिद्धांत यह अध्ययन करने के लिए समर्पित है कि भाषाओं का वाक्यविन्यास (रूप) कैसे वर्णित किया जा सकता है, इसलिए यह आमतौर पर 'भाषा' शब्द का उपयोग करता है कि क्या वर्णित किया जा रहा है, न कि इसका वर्णन क्या है।
रीइन्टीरियरपोस्ट

जवाबों:


24

जो कोई भी आपको बताता है कि कोड को पार्स करने के लिए नियमित अभिव्यक्तियों का उपयोग किया जाता है, यह विघटन फैला रहा था। शास्त्रीय रूप से (मुझे नहीं पता कि यह आधुनिक संकलक में किस हद तक सही है), कोड की पार्सिंग - पाठ से कोड को सिंटैक्स ट्री में रूपांतरित करना - दो चरणों से बना है:

  1. लेक्सिकल विश्लेषण: कच्चे पाठ को कीवर्ड , संख्यात्मक स्थिरांक , स्ट्रिंग्स , आइडेंटिफ़ायर और इतने पर विखंडू में संसाधित करता है । यह एक नियत परिमित ऑटोमेटन (DFA) की भावना के समान, कुछ प्रकार की परिमित स्टेट मशीन का उपयोग करके वर्गीकृत किया जाता है।

  2. पार्सर: लेक्सिकल विश्लेषण के बाद चलाएँ, और कच्चे पाठ को एक एनोटेट सिंटैक्स ट्री में परिवर्तित करता है। प्रोग्रामिंग लैंग्वेज का व्याकरण (पहले सन्निकटन के लिए) संदर्भ-मुक्त होता है (वास्तव में, एक को भी सख्त उपसमुच्चय की आवश्यकता होती है), और इससे कुछ कुशल एल्गोरिदम को लेक्सिफाइड कोड को वाक्यविन्यास ट्री में पार्स करने की अनुमति मिलती है। यह पहचानने की समस्या के समान है कि क्या दी गई स्ट्रिंग कुछ संदर्भ-मुक्त व्याकरण से संबंधित है, अंतर यह है कि हम एक वाक्यविन्यास वृक्ष के रूप में भी प्रमाण चाहते हैं ।

प्रोग्रामिंग भाषाओं के लिए व्याकरण को संदर्भ-मुक्त व्याकरण के रूप में लिखा जाता है, और इस प्रतिनिधित्व का उपयोग पार्सर जनरेटर द्वारा उनके लिए तेज पार्सर के निर्माण के लिए किया जाता है। एक सरल उदाहरण में कुछ गैर-टर्मिनल स्टेटमेंट और उसके बाद STATEMENT IF-STATEMENT, जहां IF-STATEMENT यदि CONDITION फिर BLOCK एंडिफ (या जहां BLOCK STATEMENT; BLOCK; STATEMENT; उदाहरण के लिए) के नियम लागू होते हैं । आमतौर पर ये व्याकरण बैकस-नौर फॉर्म (BNF) में निर्दिष्ट होते हैं।

प्रोग्रामिंग भाषाओं के वास्तविक विनिर्देश संदर्भ-मुक्त नहीं हैं। उदाहरण के लिए, एक चर दिखाई नहीं दे सकता है अगर यह कई भाषाओं में घोषित नहीं किया गया था, और सख्त टाइपिंग वाली भाषाएं आपको स्ट्रिंग चर के पूर्णांक को असाइन करने की अनुमति नहीं दे सकती हैं। पार्सर का काम केवल कच्चे कोड को एक ऐसे रूप में परिवर्तित करना है जो प्रक्रिया करना आसान है।

मुझे यह उल्लेख करना चाहिए कि पुनरावर्ती वंश पार्सिंग जैसे अन्य दृष्टिकोण हैं जो वास्तव में एक पार्स ट्री उत्पन्न नहीं करता है, लेकिन आपके कोड को संसाधित करता है क्योंकि यह इसे पार्स करता है। यद्यपि यह पेड़ को उत्पन्न करने के लिए परेशान नहीं करता है, अन्य सभी मामलों में यह ऊपर वर्णित के समान स्तर पर संचालित होता है।


आपके उत्तर के लिए धन्यवाद, यह निश्चित रूप से कुछ चीजों को साफ करता है। यह एक पूरे बहुत अधिक सवालों पर भी लाया गया। क्या मुझे उन्हें अपने सवाल के साथ जोड़ना चाहिए, या उन्हें यहाँ पूछना चाहिए?
Zwander

5
@Zwander - वास्तव में, न तो। इस साइट पर, हम चाहते हैं कि आप प्रति प्रश्न एक प्रश्न लिखें। यह एक चर्चा मंच नहीं है: यह एक सवाल-जवाब साइट है, और हम चाहते हैं कि प्रत्येक प्रश्न एक अलग थ्रेड में हो। यदि यह उत्तर एक नया प्रश्न उठाता है, तो उस अनुवर्ती प्रश्न पर शोध करने के लिए कुछ समय बिताएं, और यदि आप किसी भी मानक स्रोत में उत्तर नहीं पा रहे हैं, तो एक नया प्रश्न पोस्ट करें। (लेकिन पहले मानक संसाधनों को देखना सुनिश्चित करें।)
डीडब्ल्यू

1
@ डब्लू गोथा, चीयर्स
Zwander

3
आपके द्वारा उल्लेखित दो चरणों में से पहला आमतौर पर नियमित अभिव्यक्तियों का उपयोग करके किया जाता है। प्रत्येक टोकन का प्रारूप आमतौर पर एक नियमित अभिव्यक्ति द्वारा दिया जाता है। उन नियमित अभिव्यक्ति को एक एकल डीएफए में संकलित किया जाता है, फिर डीएफए को वास्तविक कोड पर लागू किया जाता है।
kasperd

2
@Zwander पुनरावर्ती वंश पार्सिंग सिर्फ एक पार्सिंग तकनीक है। यह पार्स-ट्री उत्पन्न कर सकता है या नहीं। सामान्य तौर पर, प्रोग्राम टेक्स्ट में सिंटैक्स-ट्री निहित का पता लगाने के लिए कम्प्यूटेशनल रणनीति विकसित करने के लिए एल्गोरिथ्म पार्सिंग राशि। यह सिंटैक्स / पार्स ट्री संकलन प्रक्रिया (चरणों की संख्या) के आधार पर प्रक्रिया में खोजा जा सकता है या नहीं भी हो सकता है। हालांकि यह आवश्यक है कि पार्स-ट्री के अंत में कम से कम एक नीचे-ऊपर अन्वेषण हो, चाहे गणना संरचना में निहित या छोड़ दिया गया हो।
बबौ

12

यह एक हाई स्कूल असाइनमेंट के लिए कुछ भारी सामान है।

युवल फिल्मस का उत्तर वास्तव में अच्छा है, इसलिए यह उनके द्वारा बनाए गए कुछ बिंदुओं को स्पष्ट करने के लिए एक पूरक उत्तर से अधिक है।

एक औपचारिक भाषा एक गणितीय निर्माण है। प्रोग्रामिंग भाषाओं के लिए उनका उपयोग कई संभावित उपयोगों में से एक है; वास्तव में, भाषाविद् नोम चोम्स्की ने औपचारिक भाषाओं के प्रारंभिक सिद्धांत में महत्वपूर्ण योगदान दिया। उन्होंने चॉम्स्की पदानुक्रम का आविष्कार किया, जो औपचारिक भाषाओं को नियमित, संदर्भ-मुक्त आदि में वर्गीकृत करता है, अंग्रेजी जैसी प्राकृतिक भाषाओं के वाक्य-विन्यास का वर्णन करने के लिए औपचारिक भाषाओं को भाषाविज्ञान में भी लागू किया जाता है। इसे वास्तविक संख्याओं की तरह सोचें: हम वास्तविक संख्याओं का उपयोग लॉस एंजिल्स से न्यूयॉर्क की दूरी और उसके व्यास के परिधि के अनुपात जैसी सार चीजों जैसे दोनों ठोस चीजों का वर्णन करने के लिए कर सकते हैं। भले ही वे दोनों चीजें वास्तविक संख्याओं से स्वतंत्र रूप से मौजूद हों, लेकिन वास्तविक संख्याएं उनका वर्णन करने के लिए एक सहायक प्रणाली हैं। औपचारिक भाषा अंग्रेजी और पायथन दोनों का वर्णन करने के लिए एक सहायक प्रणाली है, क्योंकि दोनों का एक समान संरचित प्रारूप है।

a+b+c=da+b=dसीabc डॉलर की मात्रा के रूप में, उदाहरण के लिए, और फिर समीकरण का अर्थ है।

शास्त्रीय रूप से, एक प्रोग्रामिंग भाषा में दो व्याकरण होंगे: एक शाब्दिक व्याकरण और एक वाक्य रचना व्याकरण। लेक्सिकल व्याकरण वर्ण, अर्धविराम, ब्रेस और कोष्ठक जैसे वर्णों से संबंधित है। यह आमतौर पर एक नियमित व्याकरण है, इसलिए इसे नियमित अभिव्यक्तियों या डीएफए या एनएफए के साथ व्यक्त किया जा सकता है। (औपचारिक भाषा के सिद्धांत में प्रमाण हैं कि तीनों सत्ता में समतुल्य हैं - जिसका अर्थ है कि वे भाषाओं के एक ही समूह को स्वीकार करते हैं।) संकलक या दुभाषिया का लेक्सिंग चरण नियमित भाषा व्याकरण के लिए एक मिनी दुभाषिया की तरह होता है। यह व्याकरण के नियमों को पढ़ता है, और उन नियमों का पालन करते हुए, यह व्यक्तिगत पात्रों को टोकन में बदल देता है। उदाहरण के लिए, यदि भाषा में ऐसा ifकथन है जो C की तरह कम या ज्यादा दिखता है, तो लेक्सर पात्रों को iऔर fएकल टोकन में लेट सकता हैIF, फिर एक खुलने वाले कोष्ठक की खोज करें और एक टोकन का उत्पादन करें OPEN_PAREN, फिर कोष्ठकों के बीच जो कुछ भी है उसे संभाल लें, और फिर समापन कोष्ठक और आउटपुट को खोजें CLOSE_PAREN। जब लेक्सर्स टोकन बनाते हैं, तो यह उन्हें पार्सर के हाथों में सौंप देता है, जो यह निर्धारित करता है कि टोकन वास्तव में प्रोग्रामिंग भाषा के मान्य कथन बनाते हैं। इसलिए यदि आप ip a == bपायथन में लिखते हैं , तो लेक्सर केवल यह अनुमान लगाने की पूरी कोशिश करता है कि किस तरह का टोकन ipहै (शायद इसे सबसे अधिक लेक्सर्स द्वारा एक पहचानकर्ता के लिए लिया जाएगा), और इसे पार्सर को पास करता है, जो शिकायत करता है क्योंकि आपके पास नहीं हो सकता है उस स्थिति में पहचानकर्ता।

a

आइए पायथन के ifकथन के व्याकरण के नियमों को देखें । यह नियम है:

if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]

यह नियम बताता है कि यदि लकड़हारे से भेजे गए टोकन की एक स्ट्रिंग एक प्रति- ifपरिमाण है तो पार्सर कैसे पता लगाएगा। सिंगल कोट्स में किसी भी शब्द को स्रोत कोड की तरह ही प्रदर्शित करने की आवश्यकता होती है, इसलिए पार्सर सादे शब्द के लिए दिखेगा if। तब पार्सर नियम के लिए कुछ टोकन से मिलान करने का प्रयास करेगा test:

test: or_test ['if' or_test 'else' test] | lambdef

testव्याकरण में अन्य नियमों के संदर्भ में परिभाषित किया गया है। ध्यान दें कि testइसकी परिभाषा में खुद को कैसे शामिल किया जाता है; इसे पुनरावर्ती परिभाषा कहा जाता है। यह संदर्भ-मुक्त भाषाओं की बड़ी शक्ति है जो नियमित भाषाएं नहीं हैं, और यह नेस्टेड छोरों जैसी चीजों को प्रोग्रामिंग भाषा सिंटैक्स के लिए परिभाषित करने की अनुमति देता है।

यदि पार्सर कुछ टोकन का मिलान करने का प्रबंधन करता है test, तो यह एक बृहदान्त्र से मिलान करने का प्रयास करेगा। यदि वह सफल होता है, तो यह नियम के लिए कुछ और टोकन का मिलान करने का प्रयास करेगा suite। अनुभाग का ('elif' test ':' suite)*अर्थ है कि हम शाब्दिक पाठ की किसी भी संख्या को दोहरा सकते हैं elif, उसके बाद कुछ मेल खाता है test, उसके बाद एक कॉलन, उसके बाद कुछ मेल खाता है suite। हम शून्य पुनरावृत्ति भी कर सकते हैं; अंत में तारांकन का अर्थ है "शून्य या जितना हम चाहते हैं"।

बहुत अंत में है ['else' ':' suite]। उस हिस्से को चौकोर कोष्ठक में संलग्न किया गया है; इसका मतलब है कि हमारे पास शून्य या एक हो सकता है, लेकिन अधिक नहीं। इसे मैच करने के लिए, पार्सर को शाब्दिक पाठ else, एक बृहदान्त्र और फिर ए से मेल खाना चाहिए suite। यहाँ के लिए नियम है suite:

suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT

यह मूल रूप से सी जैसी भाषाओं में एक ब्लॉक है। चूँकि पायथन नए अर्थों और इंडेंटेशन का उपयोग चीजों के लिए करता है, लेसर आउटपुट करता है NEWLINE, INDENTऔर DEDENTपार्सर को बताने के लिए टोकन लेता है जहां एक नई लाइन शुरू हुई, जहां कोड इंडेंट किया जाने लगा, और जहां इसे इंडेंटेशन के बाहरी स्तर पर लौटाया गया।

यदि इनमें से कोई भी प्रयास विफल हो जाता है, तो पार्सर एक त्रुटि को चिह्नित करता है और रुक जाता है। यदि पूरे कार्यक्रम की पार्सिंग सफल हो जाती है, तो पार्सर ने आमतौर पर एक पार्स ट्री बनाया होगा जैसा कि युवल ने अपने उत्तर में कवर किया था, और संभवतः एक प्रतीक तालिका और अन्य डेटा संरचनाएं जो अर्थ सूचना संग्रहीत करती हैं। यदि भाषा वैधानिक रूप से टाइप की गई है, तो कंपाइलर पार्स ट्री को चलाएगा और प्रकार की त्रुटियों की तलाश करेगा। यह निम्न स्तर के कोड (असेंबली लैंग्वेज, जावा बाइटकोड, .Net इंटरमीडिएट लैंग्वेज या कुछ इसी तरह की) उत्पन्न करने के लिए पार्स ट्री भी चलाता है, जो वास्तव में चलता है।

एक अभ्यास के रूप में, मैं कुछ प्रोग्रामिंग भाषा के व्याकरण को लेने की सलाह दूंगा जो आप (फिर, पायथन , जावा , और यहां के C # , जावास्क्रिप्ट , C ) से परिचित हैं और संभवत: x = a + b;या जैसे कुछ सरल करने का प्रयास करें if (True): print("Yay!")। यदि आप कुछ सरल खोज रहे हैं, तो JSON के लिए एक अच्छा व्याकरण भी है , जो मूल रूप से जावास्क्रिप्ट (जैसे {'a': 1, 'b': 2}) में ऑब्जेक्ट शाब्दिक के लिए सिंटैक्स को कवर करता है । गुड लक, यह ब्रेन-झुकने वाला सामान है लेकिन यह वास्तव में दिलचस्प है जब आप कुछ पागल समय सीमा पर नहीं हैं।


मुझे पता है कि मैं यहां "धन्यवाद" पोस्ट करने वाला नहीं हूं, लेकिन इस सब को समझाने के लिए समय निकालता हूं। "यह एक हाई स्कूल असाइनमेंट के लिए कुछ भारी सामान है।" असाइनमेंट का उद्देश्य शीर्ष पर स्किम करना और नियमित अभिव्यक्तियों के बारे में बात करना है, लेकिन एक शौकीन कंप्यूटर विज्ञान के छात्र के रूप में मैं पूरी तस्वीर प्राप्त करना चाहता था। पूरा विषय आकर्षक है।
7

1
@Zwander मैंने सिर्फ कॉलेज में स्नातक किया है, और मेरे अधिकांश ऐच्छिक इस तरह से सामान थे। मुझे याद है कि पूरी तरह से भ्रमित और अभी तक पूरी तरह से अवशोषित। आप इस ब्लॉग में उल्लिखित कंपाइलर डिज़ाइन , या माइकल साइपर, और जॉन सी। मार्टिन, जॉन सी। मार्टिन, द्वारा भाषाओं का परिचय और अभिकलन के सिद्धांत की पुस्तकों के कागजात को भी पसंद कर सकते हैं । आप अमेज़न पर सस्ती उपयोग की गई प्रतियां पा सकते हैं। दोनों औपचारिक भाषा सिद्धांत को सरल बनाते हैं क्योंकि यह प्राप्त करने वाला है।
tsleyson

10

संक्षेप में

प्रोग्रामिंग भाषाएं एक वाक्य रचना से बनी होती हैं जो कार्यक्रम को वर्णों के तार के रूप में दर्शाती हैं, और एक शब्दार्थ जो कार्यक्रम का इच्छित अर्थ है।

औपचारिक भाषाएं अर्थ के बिना वाक्यविन्यास हैं। इसका अर्थ औपचारिक रूप से परिभाषित तारों के सेट की संरचना का अध्ययन करना है, आमतौर पर उन तारों के अर्थ को संलग्न करना।

नियमित अभिव्यक्ति और अन्य औपचारिकताओं (जैसे संदर्भ-मुक्त व्याकरण) का उपयोग औपचारिक भाषाओं को परिभाषित करने के लिए किया जाता है, जिनका उपयोग प्रोग्रामिंग और प्राकृतिक भाषाओं के वाक्य-विन्यास घटक के रूप में किया जाता है, अर्थात संरचित तरीके से वाक्यों का प्रतिनिधित्व करने के लिए। अन्य तंत्रों का उपयोग उस संरचना को प्रोग्रामिंग भाषाओं के शब्दार्थों से संबंधित करने के लिए किया जाता है।

यहां बहुत कुछ सरल है, विशेष रूप से प्राकृतिक भाषा के बारे में।

बहुत अधिक विवरण के साथ

आपके प्रश्न का उत्तर देने के लिए हमें शुरुआत से शुरू करना चाहिए। सामान्य अर्थों में एक भाषा, अनौपचारिक रूप से, सूचना या विचारों को व्यक्त करने का एक साधन है। किसी भाषा में, आमतौर पर वाक्य रचना और शब्दार्थ के बीच अंतर होता है। शब्दार्थ वह है जिसके बारे में आप बात करना / लिखना चाहते हैं। वह जानकारी जो आप बताना चाहते हैं। सिंटेक्स वह साधन है जिसका उपयोग आप इसे व्यक्त करने के लिए करते हैं, अर्थात एक पारंपरिक प्रतिनिधित्व जो लोगों के बीच और अब लोगों और उपकरणों के बीच या उपकरणों (कंप्यूटर) के बीच भी आदान-प्रदान किया जा सकता है।

आमतौर पर, आप dogकुत्ते के विचार को व्यक्त करने के लिए इस शब्द का उपयोग करेंगे । यह शब्द dogतीन अक्षरों या कुछ समतुल्य ध्वनि से बना है, और यह किसी प्रकार के जानवर का प्रतिनिधित्व करने के लिए बनाया गया है। प्रमुख विचार यह है कि संचार का प्रतिनिधित्व किस माध्यम से किया जाना है, इसका प्रतिनिधित्व किया जाता है। प्रतिनिधित्व संरचनाओं को आमतौर पर वाक्य रचना कहा जाता है, जबकि जो प्रतिनिधित्व किया जाता है उसे शब्दार्थ कहा जाता है। यह प्राकृतिक भाषा के साथ-साथ प्रोग्रामिंग भाषाओं के लिए भी कमोबेश चला जाता है।

शब्द कम या ज्यादा प्राथमिक अर्थ अवधारणाओं का प्रतिनिधित्व करने के लिए वाक्यात्मक संस्थाएं हैं। लेकिन इन जटिल अवधारणाओं को अधिक जटिल अर्थ देने के लिए विभिन्न तरीकों से एक साथ रखा जाना चाहिए। हम the dogयह बताने के लिए लिखते हैं कि हमारा मतलब एक विशिष्ट कुत्ते से है, और the dog bites the catअधिक जटिल विचार व्यक्त करने के लिए। लेकिन जिस तरह से शब्दों का आयोजन किया जाता है उसे नियमों द्वारा तय किया जाना चाहिए, ताकि हम बता सकें कि कुत्ते और बिल्ली में से कौन वास्तव में दूसरे को काट रहा है।

इसलिए हमारे पास ऐसे नियम sentence -> subject verb complementहैं जो वाक्यों का मिलान करने वाले हैं और हमें बताते हैं कि प्रत्येक भाग से जुड़े विचारों को कैसे स्पष्ट किया जाता है। ये नियम वाक्यात्मक नियम हैं, क्योंकि वे हमें बताते हैं कि हमारे संदेश का प्रतिनिधित्व कैसे आयोजित किया जाना है। subjectअपने आप में एक नियम के द्वारा परिभाषित किया जा सकता subject -> article noun, और इतने पर।

2x+1=23x123

equation -> expression "=" expression  
expression -> expression "+" expression 
expression -> number

प्रोग्रामिंग भाषाओं की संरचना समान है। प्रोग्रामिंग की जाने वाली समस्याओं को हल करने के लिए व्यक्त की जाने वाली संगणनाओं को व्यक्त करने के लिए प्रोग्रामिंग भाषा विशेष रूप से विशिष्ट है, समस्याओं को हल करने के लिए, प्रमेयों का प्रमाण या जानवरों के बीच मैत्रीपूर्ण संबंध। लेकिन वह मुख्य अंतर है।

वाक्यविन्यास में उपयोग किए जाने वाले प्रतिनिधि आमतौर पर वर्णों के तार, या बोली जाने वाली भाषाओं के लिए ध्वनियों के होते हैं। शब्दार्थ आमतौर पर अमूर्त डोमेन के होते हैं, या संभवतः वास्तविकता के होते हैं, लेकिन फिर भी हमारी विचार प्रक्रियाओं में, या उपकरणों के व्यवहारिक डोमेन में अमूर्त होते हैं। संचार सूचना / विचार को सिंटैक्स में एन्कोड करता है, जो रिसीवर द्वारा प्रसारित और डीकोड किया जाता है। इसके बाद परिणाम को रिसीवर द्वारा किसी भी तरह से व्याख्या की गई।

इसलिए हम जो भाषा देखते हैं वह ज्यादातर वाक्य रचना और उसकी संरचना है। उपर्युक्त उदाहरण केवल सिंटैक्टिक स्ट्रिंग्स और उनके संरचनात्मक संगठन को परिभाषित करने का सबसे आम तरीका है। और भी हैं। किसी दिए गए भाषा के लिए, कुछ तारों को एक संरचना सौंपी जा सकती है, और कहा जाता है कि यह भाषा से संबंधित है, जबकि अन्य नहीं करते हैं।

शब्दों के लिए भी यही सच है। अक्षरों (या ध्वनि) के कुछ क्रम वैध शब्द हैं, जबकि अन्य नहीं हैं।

औपचारिक भाषाएं शब्दार्थ के बिना सिर्फ वाक्यविन्यास हैं। वे एक नियम के एक सेट के साथ परिभाषित करते हैं कि एक वर्णमाला के मूल तत्वों का उपयोग करके अनुक्रमों का निर्माण किया जा सकता है। क्या नियम हैं, कभी-कभी बहुत ही परिवर्तनशील हो सकते हैं। लेकिन औपचारिक भाषाओं का उपयोग भाषाई संचार से परे कई गणितीय उद्देश्यों के लिए किया जाता है, चाहे प्रोग्रामिंग भाषाओं के लिए स्वाभाविक हो। किसी भाषा में तार को परिभाषित करने वाले नियमों के समुच्चय को व्याकरण कहा जाता है। लेकिन भाषाओं को परिभाषित करने के कई अन्य तरीके हैं।

व्यवहार में, एक भाषा को दो स्तरों में संरचित किया जाता है। वर्णों के वर्णमाला से निर्मित शब्दों को लेक्सिकल स्तर परिभाषित करता है। वाक्यविन्यास स्तर वाक्यों, या शब्दों की वर्णमाला से निर्मित कार्यक्रम (या शब्द परिवारों का अधिक सटीक रूप से परिभाषित करता है, ताकि यह एक बारीक वर्णमाला बना रहे)। यह जरूरी कुछ हद तक सरलीकृत है।

अधिकांश भाषा (प्रोग्रामिंग या प्राकृतिक) में शब्दों की संरचना काफी सरल है ताकि उन्हें आमतौर पर उस तरह से परिभाषित किया जाए जिसे आमतौर पर सबसे सरल प्रकार की औपचारिक भाषा माना जाता है: नियमित भाषा। उन्हें नियमित अभिव्यक्तियों (regexp) के साथ परिभाषित किया जा सकता है, और काफी आसानी से क्रमादेशित उपकरणों से पहचाना जाता है जिन्हें परिमित अवस्था ऑटोमेटा कहा जाता है। प्रोग्रामिंग भाषाओं के मामलों में, एक शब्द के उदाहरण एक पहचानकर्ता, एक पूर्णांक, स्ट्रिंग, एक वास्तविक संख्या, एक आरक्षित शब्द जैसे कि , if या repeatविराम चिह्न या एक खुला कोष्ठक हैं। शब्द परिवारों के उदाहरण पहचानकर्ता, स्ट्रिंग, पूर्णांक हैं।

वाक्यविन्यास स्तर को आमतौर पर औपचारिक भाषा के कुछ अधिक जटिल प्रकारों द्वारा परिभाषित किया जाता है: संदर्भ-मुक्त भाषाएं, वर्णमाला के रूप में शब्दों का उपयोग करते हुए। हमने जो नियम ऊपर देखे हैं, वे प्राकृतिक भाषा के लिए संदर्भ-मुक्त नियम हैं। प्रोग्रामिंग भाषाओं के मामले में नियम हो सकते हैं:

statement -> assignment
statement -> loop
loop ->  "while" expression "do" statement
assignment -> "identifier" "=" expression
expression -> "identifier"
expression -> "integer"
expression -> expression "operator" expression

ऐसे नियमों के साथ आप लिख सकते हैं:

while aaa /= bbb do aaa = aaa + bbb / 6 जो एक बयान है।

और जिस तरह से इसका उत्पादन किया गया था, उसे एक पेड़ की संरचना द्वारा दर्शाया जा सकता है जिसे पार्स ट्री या सिंटैक्स ट्री कहा जाता है (यहाँ पूरा नहीं):

                          statement
                              |
            _______________  loop _______________
           /      /                 \            \
      "while" expression           "do"       statement
       __________|_________                       |
      /          |         \                  assignment
 expression "operator" expression          _______|_______
     |           |          |             /       |       \
"identifier"   "/="   "identifier" "identifier"  "="   expression
     |                      |            |                 |
    aaa                    bbb          aaa             ... ...

एक नियम के बाईं ओर प्रदर्शित होने वाले नामों को गैर-टर्मिनलों कहा जाता है, जबकि शब्दों को टर्मिनलों भी कहा जाता है, क्योंकि वे भाषा के लिए वर्णमाला में हैं (लेक्सिकल स्तर से ऊपर)। गैर-टर्मिनल अलग-अलग सिंटैक्टिक संरचनाओं का प्रतिनिधित्व करता है, जिसका उपयोग प्रोग्राम बनाने के लिए किया जा सकता है।

इस तरह के नियमों को संदर्भ-मुक्त कहा जाता है, क्योंकि एक गैर-टर्मिनल को मनमाने तरीके से संबंधित नियमों में से किसी का उपयोग करके प्रतिस्थापित किया जा सकता है, स्वतंत्र रूप से उस संदर्भ में जिसमें यह प्रकट होता है। भाषा को परिभाषित करने वाले नियमों के सेट को संदर्भ-मुक्त व्याकरण कहा जाता है।

वास्तव में उस पर प्रतिबंध हैं, जब पहचानकर्ताओं को पहले घोषित किया जाना है, या जब एक अभिव्यक्ति को प्रकार के प्रतिबंधों को पूरा करना होगा। लेकिन इस तरह के प्रतिबंध को वाक्य-रचना के बजाय शब्दार्थ माना जा सकता है। वास्तव में कुछ पेशेवर उन्हें स्थैतिक शब्दार्थ कहते हैं ।

किसी भी वाक्य, किसी भी कार्यक्रम को देखते हुए, इस वाक्य के लिए पार्स ट्री द्वारा दी गई संरचना का विश्लेषण करके उस वाक्य का अर्थ निकाला जाता है। इसलिए, एल्गोरिदम को विकसित करना बहुत महत्वपूर्ण है, जिसे पार्सर कहा जाता है, जो कि प्रोग्राम के अनुसार, पेड़ की संरचना को ठीक कर सकता है, जब प्रोग्राम दिया जाता है।

पार्सर लेक्सिकल एनालाइज़र से पहले होता है जो शब्दों को पहचानता है, और उस परिवार को निर्धारित करता है जिससे वे संबंधित हैं। फिर शब्दों, या शाब्दिक तत्वों का क्रम, पार्सर को दिया जाता है जो अंतर्निहित वृक्ष संरचना को पुनः प्राप्त करता है। इस संरचना से कंपाइलर यह निर्धारित कर सकता है कि कोड कैसे उत्पन्न किया जाए, जो कि कंपाइलर की तरफ प्रोग्राम प्रोसेसिंग का उसका सिमेंटिक हिस्सा है।

एक कंपाइलर का पार्सर वास्तव में पार्स-ट्री के अनुरूप एक डेटा संरचना का निर्माण कर सकता है और इसे संकलन प्रक्रिया के बाद के चरणों में पास कर सकता है, लेकिन इसके लिए नहीं है। प्रोग्राम टेक्स्ट में निहित सिंटैक्स-ट्री का पता लगाने के लिए एक कम्प्यूटेशनल रणनीति विकसित करने के लिए पार्सिंग एल्गोरिथ्म राशि चल रही है। यह सिंटैक्स / पार्स ट्री संकलन प्रक्रिया (चरणों की संख्या) के आधार पर प्रक्रिया में खोजा जा सकता है या नहीं भी हो सकता है। हालांकि यह आवश्यक है कि पार्स-ट्री के अंत में कम से कम एक नीचे-ऊपर अन्वेषण हो, चाहे गणना संरचना में निहित या छोड़ दिया गया हो।

इसका कारण, सहज रूप से, यह है कि सिंटैक्टिक ट्री संरचना से संबंधित शब्दार्थ को परिभाषित करने के लिए एक मानक औपचारिक तरीका है जिसे होमोफोरिज़्म कहा जाता है। बड़े शब्द से मत डरो। विचार का अर्थ केवल यह है कि संपूर्ण का अर्थ भागों के अर्थ से निर्मित है, ऑपरेटर के आधार पर जो उन्हें जोड़ता है

उदाहरण के लिए, वाक्य the dog bites the catका नियम के साथ विश्लेषण किया जा सकता है sentence -> subject verb complement। यह जानते हुए कि 3 subtrees का अर्थ subject, verbऔर complementनियम है कि composes उन्हें हमें बताता है कि विषय कार्रवाई कर रही है, और बिल्ली एक है जो काट लिया है यह है कि,।

यह केवल एक सहज व्याख्या है, लेकिन इसे औपचारिक रूप दिया जा सकता है। शब्दार्थ का निर्माण घटकों से ऊपर की ओर किया जाता है। लेकिन इससे बहुत जटिलता छिप जाती है।

एक संकलक के आंतरिक काम को कई चरणों में विघटित किया जा सकता है। मध्यवर्ती संकलनों का उपयोग करके वास्तविक संकलक चरणों द्वारा काम कर सकता है। यह कुछ चरणों को भी मिला सकता है। यह हाथ में भाषा के संकलन की जटिलता और उपयोग की जाने वाली तकनीक पर निर्भर करता है।


बहुत बढ़िया, बहुत मददगार। मैं समझता हूं कि रीगेक्स का उपयोग टोकन प्रक्रिया में किया जाता है (उदाहरण के लिए एक स्ट्रिंग शाब्दिक को "[^"]*"इसके सरलतम रूप से परिभाषित किया जा सकता है , एस्केप चार्ट आदि को अनदेखा किया जा सकता है ), लेकिन क्या इसका उपयोग वाक्यविन्यास ट्री बनाने में भी किया जाता है (प्रोग्रामिंग भाषाओं के संदर्भ में बात करते हुए)? मैं नहीं मानता, जैसा कि एक परिमित राज्य ऑटोमेटा है, परिभाषा परिमित द्वारा। एक वाक्यविन्यास वृक्ष, यहां तक ​​कि एकल ifकथन के लिए, घोंसले के कारण सैद्धांतिक रूप से अनंत हो सकता है। इसलिए रेगेक्स, एक परिमित राज्य ऑटोमेटा होने के कारण एक वाक्यविन्यास वृक्ष बनाने के लिए इस्तेमाल नहीं किया जा सकता है।
Zwander

@Zwander thx 4 संपादन- रेगेक्स का आपका उदाहरण सही है (मुझे कुछ उदाहरण देने चाहिए थे)। बीटीडब्ल्यू, रेगेक्स भी एक भाषा है, जिसमें स्ट्रिंग्स के सेट की दुनिया में अपने स्वयं के शब्दार्थ हैं, और एक संदर्भ-मुक्त ( सीएफ ) वाक्य रचना के साथ। इसका उपयोग केवल भाषा स्ट्रिंग के टोकन के लिए किया जाता है, कम से कम प्रोग्रामिंग भाषाओं के लिए, आमतौर पर सिंटैक्स पेड़ों के लिए उपयोग किए जाने वाले बड़े सिंटैक्स को परिभाषित करने में नहीं, विस्तारित बीएनएफ (ईबीएनएफ) में शॉर्ट हैंड के रूप में। अधिक जटिल औपचारिकताओं में किसी न किसी रूप में रेगेक्स को जोड़ना ज्यादातर मामलों में अपनी अभिव्यंजक शक्ति को नहीं बदलता है। अनंत के बारे में आपकी टिप्पणी काफी सही नहीं है। अगली टिप्पणी देखें
बाबू

@Zwander सभी औपचारिकताओं (औपचारिक भाषाओं) का बारीक वर्णन किया गया है। वह एक मौलिक परिकल्पना है। यहां तक ​​कि अगर आप में रुचि रखते हैं, कहते हैं, अनंत संख्या में नियमों के साथ सीएफ व्याकरण, आपको नियमों के उस अनंत का एक बारीक विवरण देना होगा। इसके अलावा अनंत आप पर चालें खेलता है (उसके लिए कोई जगह नहीं)। एक ifबयान अबाधित है (मनमाने ढंग से बड़ा) लेकिन हमेशा परिमित। एक अनंत रूप से परिभाषित अनंत ifहै while। सीएफ और नियमित के बीच का अंतर यह है कि सीएफ नेस्टिंग (अर्थात पेरेंटेटाइजेशन) को नियंत्रित करता है जबकि नियमित नहीं करता है। लेकिन दोनों को सूक्ष्मता से वर्णित किया गया है और बिना तार के अनुमति देता है।
बबौ

1
@Zwander औपचारिकता किसी भी अच्छी तरह से गठित वाक्य (कार्यक्रम) का प्रतिनिधित्व करने में सक्षम होना चाहिए, लेकिन केवल अच्छी तरह से गठित वाक्य। इसे (भी) बस डालने के लिए, एफएसए निर्बाध रूप से गणना नहीं कर सकता है। इसलिए वे नहीं जान सकते कि कितने कोष्ठक खोले गए हैं जिन्हें बंद किया जाना चाहिए, या दो अलग-अलग प्रकार के कोष्ठकों को ठीक से घोंसला बनाना चाहिए। कई भाषाई संरचनाओं में "छिपे" कोष्ठक हैं। यह केवल वाक्यविन्यास जाँच का विषय नहीं है, बल्कि मुख्य रूप से इसका तात्पर्य है कि उपयुक्त वृक्ष संरचना को व्यक्त और निर्मित नहीं किया जा सकता है, जहाँ से शब्दार्थ को प्राप्त किया जा सके। कुछ पर्याप्त पेड़ संरचना को पुनर्प्राप्त करने के लिए गिनती करने की आवश्यकता होती है।
बबौ

1
(((AB)+3)×C)

2

महत्वपूर्ण अंतर हैं। उनमें से मुख्य, मैं कहूंगा कि वास्तविक प्रोग्रामिंग भाषाओं को पार्स करना सिंटैक्स त्रुटियों को संभालने के बारे में है। एक औपचारिक भाषा के साथ आप बस कहेंगे "अच्छी तरह से यह भाषा में नहीं है", लेकिन एक संकलक जो कहता है कि बहुत उपयोगी नहीं है - यह आपको यह बताना चाहिए कि क्या गलत है, और अगर यह एक छोटी सी त्रुटि थी, तो आदर्श रूप से इसे जारी रख सकते हैं अधिक त्रुटियों की रिपोर्ट करें। बहुत सारे अनुसंधान (और कार्यान्वयन के प्रयास) उस में जाते हैं। तो वास्तव में आप भी सच / झूठे परिणाम के बारे में इतना ध्यान नहीं रखते हैं, आप सिर्फ इनपुट की संरचना का विश्लेषण करना चाहते हैं। औपचारिक भाषाओं का उपयोग एक उपकरण के रूप में किया जाता है, और इसमें बहुत अधिक ओवरलैप होता है, लेकिन आप वास्तव में एक अलग समस्या को हल कर रहे हैं।

इसके अलावा, अधिकांश भाषाओं में इसे व्याकरण में कुछ चीजों को लागू नहीं करने के लिए चुना गया है , उदाहरण के लिए आपने जो उदाहरण दिया है, "यदि यह घोषित नहीं किया गया था तो एक चर दिखाई नहीं दे सकता है"। यह आमतौर पर एक ऐसी चीज है जिसे पार्सर द्वारा पूरी तरह से नजरअंदाज कर दिया जाएगा, और फिर एक अलग विश्लेषण (अर्थ विश्लेषण) में पकड़ा गया जो उस तरह की चीज को देखता है और संदर्भ-निर्भीकता जैसे विचारों से प्रभावित नहीं होता है। लेकिन हमेशा नहीं - उदाहरण के लिए सी को पार्स करने के लिए, लेक्सर हैक का अक्सर उपयोग किया जाता है, और सी ++ एक ऐसी भाषा का एक प्रसिद्ध उदाहरण है जिसे एक साथ कुछ गंभीर अर्थ विश्लेषण करने के बिना पार्स नहीं किया जा सकता है (वास्तव में सी ++ को पार्स करना अनुचित है, क्योंकि टेम्प्लेट पूर्ण हो रहे हैं) )। सरल भाषाओं में यह विभाजित हो जाता है, हालांकि, यह इस तरह से आसान है।


1

एक औपचारिक भाषा शब्दों का एक समूह है - जहां एक शब्द कुछ वर्णमाला के प्रतीकों का एक तार है।

इसका मतलब है कि उत्पादन नियमों और औपचारिक भाषा का आपका युग्मन बहुत मजबूत है। यह सही नहीं है कि औपचारिक भाषा उत्पादन नियम है। बल्कि उत्पादन नियम औपचारिक भाषा को परिभाषित करते हैं। औपचारिक भाषा वे शब्द हैं जिन्हें उत्पादन नियम द्वारा उत्पादित किया जा सकता है। (इसके लिए आवश्यक है कि औपचारिक भाषा उस प्रकार की हो जिसे उत्पादन नियमों द्वारा परिभाषित किया जा सकता है, उदाहरण के लिए नियमित भाषाओं को एक संदर्भ मुक्त व्याख्या द्वारा परिभाषित किया जा सकता है)

अतः अभिव्यक्ति के अनुरूप नियमित भाषा (a|b)*c*dको उत्पादन नियमों द्वारा परिभाषित किया गया है;

S->ACd
A->
A->aA
A->bA
C->
C->cC

प्रारंभिक प्रतीक एस से ये उत्पादन नियम जो शब्द उत्पन्न करते हैं, वे मूल रूप से वे तार हैं जिन्हें नियमित अभिव्यक्ति स्वीकार करती है।


0

नियमित अभिव्यक्ति और प्रोग्रामिंग भाषाओं के बीच एक और संबंध है जो शब्दार्थ के साथ करना है। एक अनिवार्य भाषा के मूल नियंत्रण निर्माण अनुक्रमिक रचना (ए और उसके बाद बी), विकल्प (ए या बी), और पुनरावृत्ति (बार-बार ए) करते हैं।

व्यवहार के संयोजन के समान तीन तरीके नियमित अभिव्यक्तियों में पाए जाते हैं। सबरूटीन कॉल में फेंक दें और आपके पास ईबीएनएफ के अनुरूप है।

इसलिए नियमित भावों के बीजगणित और आज्ञाओं के बीजगणित में बहुत समानता है। यह "द यूनिफिकेशन ऑफ थ्री कैल्टी" में डीजकस्ट्रा द्वारा विस्तार से पता लगाया गया है। यह मिलनर के सीसीएस का भी आधार है, जो प्रश्न का उत्तर प्रदान करता है: क्या होगा यदि हम समानता जोड़ते हैं?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.