यह कमांड btyacc है जिसे हमारे कई मुफ्त ऑनलाइन वर्कस्टेशन जैसे कि उबंटू ऑनलाइन, फेडोरा ऑनलाइन, विंडोज ऑनलाइन एमुलेटर या मैक ओएस ऑनलाइन एमुलेटर का उपयोग करके ऑनवर्क्स फ्री होस्टिंग प्रदाता में चलाया जा सकता है।
कार्यक्रम:
नाम
btyacc - एक एलएएलआर(1) बैकट्रैकिंग के समर्थन के साथ पार्सर जनरेटर
SYNOPSIS
btyacc [-बी उपसर्ग] [-डी] [-डीनाम ...] [-ई] [-एल] [-आर] [-एस एक्स.स्के] [-t] [-v]
फ़ाइलनाम.y
विवरण
btyacc byacc (बर्कले YACC) का एक संशोधित संस्करण है, जो बदले में एक सार्वजनिक डोमेन है
मूल AT&T YACC पार्सर जनरेटर का संस्करण।
btyacc फ़ाइल में व्याकरण विनिर्देश पढ़ता है फ़ाइलनाम.y और एक उत्पन्न करता है LR(1)
इसके लिए पार्सर. पार्सर में एक सेट होता है एलएएलआर(1) पार्सिंग टेबल और ड्राइवर रूटीन
C प्रोग्रामिंग भाषा में लिखा गया है। btyacc सामान्यतः पार्स टेबल और लिखता है
फ़ाइल के लिए ड्राइवर रूटीन उपसर्ग.टैब.सी, जहां उपसर्ग डिफ़ॉल्ट `y' है।
व्याकरण विनिर्देश के प्रारूप के विस्तृत विवरण के लिए, और एक उत्कृष्ट
YACC जैसे टूल का उपयोग कैसे करें, इस पर ट्यूटोरियल के लिए GNU के लिए जानकारी मैनुअल देखें बिजोन. btyacc-
विशिष्ट एक्सटेंशन नीचे समझाए गए हैं.
नोट: btyacc के अपस्ट्रीम लेखक द्वारा आपूर्ति किया गया पार्सर कंकाल केवल C++ के रूप में संकलित होता है। उपयोग
कंकाल /usr/doc/btyacc/examples/btyacc-c.ske एक पार्सर उत्पन्न करने के लिए जो दोनों को संकलित करता है
C और C++ के रूप में। (दुर्भाग्य से, यह वैकल्पिक कंकाल वर्तमान में मॉलोक() की जाँच नहीं करता है)
मान लौटाएँ।)
ऑप्शंस
-b उपसर्ग आउटपुट फ़ाइल नामों से जुड़े उपसर्ग को इसके द्वारा दर्शाई गई स्ट्रिंग में बदलें
उपसर्ग. डिफ़ॉल्ट उपसर्ग वर्ण `y' है।
-d नामक एक हेडर फ़ाइल बनाएँ उपसर्ग.टैब.एच के साथ उपसर्ग.टैब.सी,
जिसमें प्रतीक परिभाषाएँ और एक घोषणा शामिल है YYSTYPE और yylval.
-Dनाम btyacc प्रीप्रोसेसर वेरिएबल को परिभाषित करें नाम, के साथ प्रयोग के लिए % ifdef नाम
व्याकरण फ़ाइल में निर्देश.
-ई पूर्व-संसाधित व्याकरण को मानक आउटपुट पर प्रिंट करें।
-एल सम्मिलित न करें #रेखा जनरेट किए गए पार्सर कोड में निर्देश।
-r पार्सर कोड और संबंधित तालिकाओं को विभिन्न फ़ाइलों में लिखें। जहांकि
तालिकाएँ पाई जा सकती हैं उपसर्ग.टैब.सी पहले की तरह, कोड अब लिखा जाता है
सेवा मेरे उपसर्ग.कोड.सी.
-S एक्स.स्के एक भिन्न पार्सर कंकाल का चयन करें. डिफ़ॉल्ट कंकाल को इसमें हार्डवायर किया गया है
प्रोग्राम, लेकिन एक प्रति फ़ाइल में पाई जा सकती है btyaccpa.ske.
-टी डिबगिंग कोड को जेनरेट किए गए पार्सर में संकलित करने का कारण बनता है।
-v जनरेट किए गए पार्सर का मानव-पठनीय विवरण लिखें y.आउटपुट. यह
इसमें पार्सर स्थितियाँ, आगे की ओर देखने वाले टोकन के लिए क्रियाएँ और किसी के बारे में जानकारी शामिल है
संघर्ष।
बीटीवाईएसीसी एक्सटेंशन
बैक ट्रैकिंग समर्थन
जब भी कोई btyacc जनरेट किया गया पार्सर शिफ्ट-रिड्यूस या रिड्यूस-रिड्यूस त्रुटि में चलता है
पार्स तालिका, यह वर्तमान पार्स बिंदु (स्टैक और इनपुट स्ट्रीम स्थिति) को याद रखती है, और जाती है
परीक्षण पार्स मोड में। इसके बाद यह अधिकांश नियम क्रियाओं की अनदेखी करते हुए विश्लेषण जारी रखता है। अगर यह चलता है
किसी त्रुटि में (या तो पार्स तालिका के माध्यम से या किसी एक्शन कॉलिंग के माध्यम से)। YYERROR), यह
सबसे हालिया संघर्ष बिंदु पर वापस जाता है और एक अलग विकल्प का प्रयास करता है। अगर यह
एक सफल पथ ढूंढता है (इनपुट या एक्शन कॉल के अंत तक पहुंचता है YYVALID), यह
उस बिंदु पर वापस जाता है जहां उसने पहली बार परीक्षण पार्स मोड में प्रवेश किया था, और पूर्ण के साथ जारी रहता है
सफल परीक्षण के मार्ग का अनुसरण करते हुए पार्स (सभी कार्यों को निष्पादित करना)।
btyacc में क्रियाएँ दो प्रकार में आती हैं: {} क्रियाएँ, जो केवल तभी निष्पादित की जाती हैं जब वे अंदर न हों
परीक्षण मोड, और [] क्रियाएँ, जो मोड की परवाह किए बिना निष्पादित की जाती हैं।
उदाहरण: C के लिए YACC व्याकरण में, एक मानक हैक जिसे "लेक्सर फीडबैक हैक" के रूप में जाना जाता है
टाइपडिफ नाम खोजने के लिए उपयोग किया जाता है। यदि कोई दिया गया है तो यह तय करने के लिए लेक्सर सिमेंटिक जानकारी का उपयोग करता है
पहचानकर्ता एक टाइपिफ़ नाम है या नहीं और एक विशेष टोकन लौटाता है। btyacc के साथ, आप नहीं
ऐसा करने में अधिक समय लगेगा; लेक्सर को हमेशा एक पहचानकर्ता लौटाना चाहिए। btyacc
व्याकरण को तब प्रपत्र के एक नियम की आवश्यकता होती है:
नाम टाइप करें: ID [ if (!IsTypeName(LookupId($1))) YYERROR; ]
हालाँकि, ध्यान दें कि बैकट्रैकिंग नियम जोड़ने से पार्सर धीमा हो जाता है। व्यवहार में, आप
व्याकरण में विरोधाभासों की संख्या को पूर्णतया तक सीमित रखने का प्रयास करना चाहिए
ज़रूरी। यदि यह एक स्वच्छ समाधान है, तो "लेक्सर फीडबैक हैक" का उपयोग करने पर विचार करें
कुछ विशेष मामलों के लिए बैकट्रैकिंग आरक्षित रखें।
btyacc इस नियम का उपयोग करके अपना परीक्षण चलाता है "पहले शिफ्ट करने का प्रयास करें, फिर क्रम में कम करने का प्रयास करें
कि परस्पर विरोधी नियम इनपुट फ़ाइल में दिखाई देते हैं। इसका मतलब है कि आप कार्यान्वित कर सकते हैं
उदाहरण के लिए, शब्दार्थ असंबद्धता नियम: (1) यदि यह एक घोषणा की तरह दिखता है,
अन्यथा (2) यदि यह एक अभिव्यक्ति की तरह दिखता है तो यह है, अन्यथा (3) यह एक वाक्यविन्यास त्रुटि है
[एलिस और स्ट्रॉस्ट्रुप, एनोटेटेड सी++ संदर्भ मैनुअल, पृष्ठ93]। इसे हासिल करने के लिए सब कुछ लगा दें
व्याकरण फ़ाइल में अभिव्यक्ति के नियमों से पहले घोषणाओं के नियम।
बैकट्रैकिंग केवल तभी ट्रिगर होती है जब पार्स शिफ्ट/कम या कम/कम हो जाता है
तालिका में संघर्ष. यदि आपके व्याकरण में कोई विरोधाभास नहीं है, तो कोई अतिरिक्त लागत नहीं है,
कुछ अतिरिक्त कोड के अलावा जिन्हें कभी भी लागू नहीं किया जाएगा।
वर्तमान में, जेनरेट किया गया पार्सर कार्य करता है नहीं वैकल्पिक पार्सिंग पथों की छंटाई। कन्नी काटना
संभावित पथों (और पार्सिंग समय) का एक घातीय विस्फोट, आपको मैन्युअल रूप से बताने की आवश्यकता है
पार्सर जब इसका उपयोग करके सहेजे गए पथों को हटा सकता है YYVALID कथन। में
अभ्यास करें, तो यह करना काफी आसान हो जाता है। उदाहरण के लिए, एक C++ पार्सर बस कर सकता है
शामिल [य्यवलीद;] प्रत्येक पूर्ण घोषणा और कथन नियम के बाद, जिसके परिणामस्वरूप
`;' देखने के बाद पीछे हटने की स्थिति को काटा जा रहा है या `}' - कभी नहीं होगा
ऐसी स्थिति जिसमें इनमें से किसी एक से पीछे हटना उपयोगी होता है।
उन्नत टोकन स्थिति से निपटने
कंपाइलरों को अक्सर एएसटी (अमूर्त वाक्यविन्यास पेड़) बनाने की आवश्यकता होती है जैसे कि पेड़ में प्रत्येक नोड
यह उस पार्स किए गए प्रोग्राम स्रोत से संबंधित हो सकता है जहां से यह आया है। YYPOSN तंत्र समर्थित
btyacc द्वारा आपको टेक्स्ट स्थिति गणना को स्वचालित करने और असाइन करने में मदद मिलती है
एएसटी नोड्स के लिए गणना की गई पाठ स्थिति।
मानक YACCs में प्रत्येक टोकन और प्रत्येक गैर-टर्मिनल में एक होता है YYSTYPE अर्थपूर्ण मूल्य
इसके साथ संलग्न। Btyacc के साथ, प्रत्येक टोकन और प्रत्येक गैर-टर्मिनल में भी एक होता है YYPOSN टेक्स्ट
इससे जुड़ी स्थिति. YYPOSN एक उपयोगकर्ता-परिभाषित प्रकार है.
btyacc टेक्स्ट स्थिति मानों का एक स्टैक उसी तरह बनाए रखता है जैसे वह एक स्टैक बनाए रखता है
अर्थपूर्ण मूल्यों का. टेक्स्ट स्थिति सुविधा का उपयोग करने के लिए, आपको इसकी आवश्यकता है #define la
इस प्रकार है:
प्रत्येक से जुड़ी पाठ स्थिति के C/C++ प्रकार के लिए YYPOSN प्रीप्रोसेसर प्रतीक
टोकन और गैर-टर्मिनल।
yyposn प्रकार का वैश्विक चर YYPOSN. लेक्सर को पाठ की स्थिति निर्दिष्ट करनी होगी
yyposn को टोकन लौटा दिया, ठीक वैसे ही जैसे यह का अर्थपूर्ण मान निर्दिष्ट करता है
Yylval को टोकन लौटा दिया।
YYREDUCEPOSNFUNC
किसी फ़ंक्शन के लिए प्रीप्रोसेसर प्रतीक जिसे नियमित के तुरंत बाद कॉल किया जाता है
पर स्थित पाठ स्थिति को कम करने के लिए, व्याकरण नियम में कमी की गई है
ढेर।
आमतौर पर, यह फ़ंक्शन दाईं ओर के नियम से टेक्स्ट स्थिति निकालता है
घटकों और या तो उन्हें लौटाई गई $$ संरचना/पेड़ को असाइन करता है या, यदि नहीं
$$ मान वापस कर दिया जाता है, उन्हें रिट टेक्स्ट स्थिति में डाल देता है जहां यह होगा
बाद में अन्य नियमों द्वारा उठाया गया। इसका प्रोटोटाइप है:
शून्य कम करें(
YYPOSN& गीला करना,
YYPOSN* टर्म_पोसंस,
YYSTYPE* टर्म_वैल,
int अवधि_सं,
int stk_pos,
int yychar,
YYPOSN& yyposn,
उपयोगकर्ता का प्रकार अतिरिक्त);
नियम द्वारा लौटाई गई पाठ स्थिति का संदर्भ। आपको अधिलेखित करना होगा
यह गणना की गई पाठ स्थिति के साथ है जो नियम के अनुरूप है
$$ शब्दार्थ मूल्य.
टर्म_पोसंस
दाहिनी ओर के नियम घटकों की सारणी' YYPOSN पाठ स्थिति,
अर्थपूर्ण मानों के लिए $1, $2, ..., $N के अनुरूप।
टर्म_वैल्स दाहिनी ओर के नियम घटकों की सरणी' YYSTYPE मूल्य. ये हैं
$1, ..., $N स्वयं।
टर्म_नो घटे हुए नियम के दाईं ओर घटकों की संख्या, यानी
टर्म_पॉन्स और टर्म_वैल्स सरणियों का आकार। $1 में N के भी बराबर, ...,
$एन.
stk_pos YYSTYPE/YYPOSN कमी से पहले स्टैक स्थिति.
yychar लुकहेड टोकन जो तुरंत नीचे दाईं ओर का अनुसरण करता है
घटकों.
yyposn YYPOSN टोकन का जो तुरंत निचले दाहिने हाथ की ओर आता है
घटकों.
अतिरिक्त उपयोगकर्ता-परिभाषित अतिरिक्त तर्क रिड्यूसपॉसन को पास कर दिया गया।
YYREDUCEPOSNFUNCARG
अतिरिक्त तर्क रिड्यूसपॉसन फ़ंक्शन को दिया गया। ये तर्क कोई भी हो सकता है
वैरिएबल को परिभाषित किया गया है btyaccpa.ske.
टोकन आवंटन रद्द दौरान त्रुटि वसूली
अधिकांश YACC-जैसे पार्सर जनरेटर के लिए, मुठभेड़ पर उत्पन्न पार्सर की कार्रवाई
एक पार्स त्रुटि में सिमेंटिक मानों और इनपुट टोकन को तब तक फेंकना शामिल है जब तक कि कोई नियम शामिल न हो जाए
विशेष गैर-टर्मिनल त्रुटि मिलान किया जा सकता है. टोकन को त्यागना सरलता से किया जाता है
प्रकार की चर और सरणी प्रविष्टियों को अधिलेखित करना YYSTYPE नये मूल्यों के साथ.
दुर्भाग्यवश, यह दृष्टिकोण स्मृति रिसाव की ओर ले जाता है YYSTYPE एक सूचक प्रकार है. btyacc
आपको सिमेंटिक और टेक्स्ट स्थिति मानों को साफ़ करने के लिए फ़ंक्शंस की आपूर्ति करने की अनुमति देता है
#defineअपनी व्याकरण फ़ाइल की प्रस्तावना में निम्नलिखित प्रतीकों को शामिल करें:
YYDELETEVAL
किसी फ़ंक्शन के लिए टोकन के सिमेंटिक मान से पहले कॉल करने के लिए प्रीप्रोसेसर प्रतीक
या गैर-टर्मिनल को हटा दिया गया है।
YYDELETEPONS
किसी फ़ंक्शन के लिए टोकन की टेक्स्ट स्थिति से पहले कॉल करने के लिए प्रीप्रोसेसर प्रतीक
या गैर-टर्मिनल को हटा दिया गया है।
दोनों फ़ंक्शन को दो तर्कों के साथ बुलाया जाता है। प्रकार का पहला तर्क YYSTYPE or YYPOSN
वह मान है जिसे छोड़ दिया जाएगा. दूसरा तर्क प्रकार का है int और में से एक है
तीन मान:
0 इनपुट टोकन को त्यागना
1 स्टैक पर त्यागने की स्थिति
2 गर्भपात करते समय स्टैक की सफाई करना
विस्तृत वाक्यविन्यास त्रुटि रिपोर्टिंग
अगर तुम #define प्रीप्रोसेसर वैरिएबल YYERROR_विस्तृत अपनी व्याकरण फ़ाइल में, आपको अवश्य
निम्नलिखित त्रुटि प्रसंस्करण फ़ंक्शन को भी परिभाषित करें:
शून्य yyerror_detailed(
चार* टेक्स्ट,
int ग़लती,
YYSTYPE&
errt_value,
YYPOSN& errt_posn);
पाठ त्रुटि संदेश
टोकन का त्रुटि कोड जिसके कारण त्रुटि हुई
errt_value
उस टोकन का मान जिसके कारण त्रुटि हुई
टोकन की errt_posn पाठ स्थिति जिसके कारण त्रुटि हुई
प्रीप्रोसेसर निर्देशों
btyacc प्रतीकों को परिभाषित करने और अंदर सशर्त निर्देशों के साथ उन पर कार्य करने का समर्थन करता है
व्याकरण फ़ाइलें, C प्रीप्रोसेसर के विपरीत नहीं।
%परिभाषित करें नाम
प्रीप्रोसेसर प्रतीक को परिभाषित करें नाम. कमांड लाइन स्विच के समतुल्य
-Dनाम.
% ifdef नाम
यदि प्रीप्रोसेसर वैरिएबल नाम परिभाषित किया गया है, इससे पाठ को संसाधित करें % ifdef सेवा मेरे
समापन %अगर अंत, अन्यथा इसे छोड़ें।
%endif के लिए समापन निर्देश % ifdef. % ifdefs को नेस्ट नहीं किया जा सकता.
%शामिल फ़ाइल का नाम
नामित फ़ाइल की सामग्री संसाधित करें फ़ाइल का नाम. का केवल एक नेस्टिंग स्तर %शामिल
की अनुमति है।
%पहचान STRING है
एक ` डालें#पहचान STRING है' आउटपुट फ़ाइल में निर्देश। STRING है होना चाहिए एक
स्ट्रिंग स्थिरांक "" में संलग्न है।
विरासत में मिला विशेषताओं
विरासत में मिली विशेषताएँ अप्रलेखित हैं। (देखें README और a के लिए btyacc स्रोत कोड
थोड़ी जानकारी।) यदि आप जानते हैं कि वे कैसे काम करते हैं, तो मुझसे यहां संपर्क करें[ईमेल संरक्षित]>!
कीड़े
पार्सिंग की सबसे खराब स्थिति किसी भी व्याकरण के लिए घातीय है जो अनुमति देता है
जगह लेने के लिए पीछे हटना। दूसरे शब्दों में, एक btyacc-जनरेटेड पार्सर का गठन होता है
यदि उन अनुप्रयोगों में उपयोग किया जाता है जहां कोई हमलावर आपूर्ति करने में सक्षम है तो सेवा से इनकार बग
पार्सर में इनपुट के रूप में विशेष रूप से तैयार किया गया डेटा। (सभी "नियमित" इनपुट डेटा के लिए,
संभावित घातीय जटिलता आम तौर पर कोई समस्या नहीं है।)
बाइसन का %अपेक्षा करना निर्देश समर्थित नहीं है.
कोई नहीं है %अन्यथा और %ifndef. % ifdefs और %शामिलs को नेस्ट नहीं किया जा सकता.
लेखक
रॉबर्ट कॉर्बेट[ईमेल संरक्षित]> /[ईमेल संरक्षित]> में से एक था
बर्कले बायैक के मूल लेखक। क्रिस डोड[ईमेल संरक्षित]> शानदार था
बैकट्रैकिंग क्षमताओं को जोड़ने का विचार, और प्रारंभिक बैकट्रैकिंग के लिए जिम्मेदार है
परिवर्तन। वादिम मास्लोव[ईमेल संरक्षित]> कोड में और सुधार किया गया।
यह दस्तावेज़ीकरण रिचर्ड एटरर द्वारा लिखा गया था[ईमेल संरक्षित]> डेबियन के लिए
जीएनयू/लिनक्स वितरण, लेकिन सार्वजनिक डोमेन को दान किया जाता है और इस प्रकार इसका स्वतंत्र रूप से उपयोग किया जा सकता है
किसी भी उद्देश्य के लिए।
फ़ाइलें
/usr/doc/btyacc/examples/btyaccpa.ske
/usr/doc/btyacc/examples/btyacc-c.ske
/usr/doc/btyacc/README
देख भी
बिजोन(1) (या 'जानकारी बाइसन'), बायैक(1), याक(1), antlr(1)
btyacc(1)
onworks.net सेवाओं का उपयोग करके ऑनलाइन btyacc का उपयोग करें