2012-12-23 6 views
10

में बैकस-नौर फॉर्म को कैसे कार्यान्वित करें मुझे पता है कि पाइथन में बीएनएफ (बैकस-नौर फॉर्म) व्याकरण से संबंधित कुछ अस्पष्ट प्रश्न हैं, लेकिन उनमें से कोई भी मेरे आवेदन के संदर्भ में मुझे बहुत मदद नहीं करता है।पाइथन

मेरे पास कई बीएनएफ हैं जिन्हें मुझे कोड लिखने की आवश्यकता है। कोड बीएनएफ व्याकरण का उपयोग करके कानूनी तारों को उत्पन्न और पहचानने में सक्षम होना चाहिए।

मैं जिस पहले बीएनएफ के साथ काम कर रहा हूं वह पाइथन में सभी वास्तविक संख्याओं के लिए है। यह इस प्रकार है:

<real number> ::= <sign><natural number> | 
        <sign><natural number>'.'<digit sequence> | 
        <sign>'.'<digit><digit sequence> | 
        <sign><real number>'e'<natural number> 
<sign>   ::= ‘’ | ‘+’ | ‘-‘ 
<natural number> ::= ‘0’ | <nonzero digit><digit sequence> 
<nonzero digit> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 
<digit sequence> ::= ‘’ | <digit><digit sequence> 
<digit>   ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 

किसी भी BNF पारसर्स मैं अजगर के लिए मिल गया है असाधारण रूप से जटिल लगते हैं, या बाहर पुस्तकालयों का उपयोग करें। क्या पाइथन में बीएनएफ व्याकरण का उपयोग करने और उत्पन्न करने का कोई आसान तरीका है?

+3

BNF == बैकस सामान्य फ़ॉर्म से एक पार्सर उत्पन्न होगा लिखने के लिए सरल हो सकता है? हम में से उन लोगों के लिए जो हर दिन व्याकरण पार्सर्स के साथ नहीं खेलते हैं। – Ben

+0

@ बेन हाँ, आप सही हैं। स्पष्टीकरण के लिए खेद है, मैं – Jakemmarsh

+0

पोस्ट संपादित करूँगा क्या आप कुछ ऐसा ढूंढ रहे हैं जो एक बीएनएफ फ़ाइल को ग्रामर/लेक्सर उत्पन्न करने के लिए पार्स करेगा या जिसे आप पाइथन में लिख सकते हैं उसे बीएनएफ के समकक्ष वर्णित करने के लिए? –

उत्तर

6

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

मुझे नहीं पता कि आपके एप्लिकेशन सभी लेक्सिकल स्कैनिंग से संबंधित हैं - लेकिन यदि नहीं, ply पार्सर का उपयोग करने में काफी आसान है (बशर्ते आपको व्यापक रूप से पता होना चाहिए कि पार्सर्स कैसे काम करते हैं)।


संपादित करें: उद्धृत पेज का एक बैकअप archive.org पर है:

+0

मैं प्रतिक्रिया की सराहना करता हूं।मैंने आपके लिंक देखे, लेकिन मुझे पूरा यकीन नहीं है कि वे इस मामले में जो खोज रहे हैं। – Jakemmarsh

+4

यदि आप उल्लेख करने के लिए परेशान हैं तो यह एक लंबा सफर तय करेगा कि यह क्यों नहीं है कि आप क्या खोज रहे हैं। आप जानते हैं, तो अगला आदमी मदद कर सकता है। – OmnipotentEntity

+6

लिंक मर चुका है। पेस्ट को इसका सबसे महत्वपूर्ण हिस्सा उत्तर में, या यहां तक ​​कि उन सभी को कॉपी करने में वास्तव में उपयोगी है। – HuStmpHrrr

7

https://github.com/erikrose/parsimonious

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

3

मुझे grako के साथ अच्छे अनुभव हुए।

मैंने इसे parseWKT के लिए उपयोग किया।

यह इनपुट के रूप में एक ईबीएनएफ लेता है और इससे एक पीईजी पार्सर उत्पन्न करता है।

मुझे लगता है कि यह उचित grako में EBNF पार्सर के लिए एक BNF है, जो तब EBNF