अंतर्निहित नियमों को अक्षम कैसे करें?

मैं सभी बीएनएफसी अंतर्निर्मित नियमों को कैसे अक्षम कर सकता हूं, जैसे पहचान , Integer या टोकन को अलग करने के लिए उपयोग की जाने वाली रिक्त स्थान?

मैंने उन्हें बेकार और कष्टप्रद पाया क्योंकि वे उन पार्सर्स में हस्तक्षेप करते हैं जिन्हें मैं लिखने की कोशिश कर रहा हूं।

मैंने पहले से ही उन्हें फिर से परिभाषित करने की कोशिश की है, लेकिन ऐसा लगता है कि लेक्सर उनके लिए नियम उत्पन्न करना जारी रखता है। मैं उन्हें जेनरेट की गई फ़ाइलों से मैन्युअल रूप से हटा सकता हूं लेकिन मैं मशीन जेनरेट कोड को संशोधित करने के खिलाफ पूरी तरह से हूं।


क्यों पर लंबा संस्करण वे परेशान हैं।

मैं बस सीखना शुरू कर रहा हूं कि बीएनएफसी का उपयोग कैसे करें। पहली चीज मैंने कोशिश की है कि मेरे पिछले काम को एलेक्स से बीएनएफसी में परिवर्तित करना है। विशेष रूप से मैं केवल "अच्छा" रोमन अंकों से मेल खाना चाहता हूं। मैंने सोचा कि यह काफी आसान होगा: एक रोमन अंक को अनुक्रम के रूप में देखा जा सकता है

<thousand-part>   

जहां वे सभी खाली नहीं हो सकते हैं। तो एक संख्या में या तो एक खाली नहीं है हजार भाग और बाकी में जो कुछ भी हो सकता है, या उसके पास खाली <कोड> हज़ार-भाग है और इस प्रकार सौ- या tens - या इकाई - part खाली नहीं होना चाहिए। इकाइयों के मूल मामले तक वही बात फिर से शुरू की जा सकती है।

तो मैं इसके साथ आया, जो मैंने एलेक्स में किए गए कार्यों का प्रत्यक्ष अनुवाद किया है:

N1.            Numeral ::= TokThousands HundredNumber     ;
N2.            Numeral ::= HundredNumberNE                ; --NE = Not Empty
N3.      HundredNumber ::=                                ;
N4.      HundredNumber ::= HundredNumberNE                ;
N5.    HundredNumberNE ::= TokHundreds TensNumber         ;
N6.    HundredNumberNE ::= TensNumberNE                   ;
N7.         TensNumber ::=                                ;
N8.         TensNumber ::= TensNumberNE                   ;
N9.       TensNumberNE ::= TokTens UnitNumber             ;
N10.      TensNumberNE ::= UnitNumberNE                   ;
N11.        UnitNumber ::=                                ;
N12.        UnitNumber ::= UnitNumberNE                   ;
N13.      UnitNumberNE ::= TokUnits                       ;


token TokThousands ({"MMM"} | {"MM"} | {"M"}) ;  -- No x{m,n} in BNFC regexes?
token TokHundreds  ({"CM"} | {"DCCC"} | {"DCC"} | {"DC"} | {"D"} | {"CD"} | {"CCC"} | {"CC"} | {"C"}) ;
token TokTens      ({"IC"} | {"XC"} | {"LXXX"} | {"LXX"} | {"LX"} | {"LX"} | {"L"} | {"IL"} | {"XL"} | {"XXX"} | {"XX"} | {"X"}) ;
token TokUnits     ({"IX"} | {"VIII"} | {"VII"} | {"VI"} | {"V"} | {"IV"} | {"III"} | {"II"} | {"I"}) ;

अब, समस्या यह है कि अगर मैं इस पार्सर को बनाने की कोशिश करता हूं, जैसे इनपुट देना:

MMI

या सामान्य रूप से एक अंक जिसमें * - भाग खाली नहीं होता है, पार्सर एक त्रुटि देता है क्योंकि बीएनएफसी एक कोड के साथ MMI से मेल नहीं खा सकता है और इस प्रकार < em> यह अंतर्निहित पहचान नियम का उपयोग करता है। चूंकि नियम व्याकरण में प्रकट नहीं होता है, इसलिए यह एक पार्सिंग त्रुटि उठाता है, हालांकि इनपुट स्ट्रिंग मैंने परिभाषित व्याकरण द्वारा पूरी तरह ठीक है, यह बोगस पहचान नियम है जिसमें है रास्ता।

नोट: मैंने सत्यापित किया है कि यदि मैं रिक्त स्थान के साथ अलग-अलग हिस्सों को अलग करता हूं तो मुझे सही इनपुट मिलता है, लेकिन बाद में मैं रिक्त स्थान को पूरे नंबरों को अलग करना चाहता हूं, न कि उनके टोकन।

0

1 उत्तर

बीएनएफसी के दस्तावेज़ीकरण :

ये प्रकार हार्ड-कोड किए गए हैं और नियमों के मूल्य प्रकार नहीं हो सकते हैं

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

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

0
जोड़ा