2013-10-20 13 views
8

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

मैं वास्तव में वाईएसी फाइल पोस्ट नहीं कर सकता क्योंकि मेरे पास गोपनीय है। लेकिन मैं एक उदाहरण के रूप में निम्न प्रकार

argExprList: 
     assignExp 
      { 
      // some rules here 
      } 
     | assignExpList ',' assignExp 
      { 
       //some other rules here 
      } 
     ; 

मैं क्या चाहता था इसे करने के लिए परिवर्तित किया, बस

argExpList ::= assignExp|assignExpList ',' assignExp 

उत्तर

9

बाइसन मदद कर सकते हैं की तरह है अगर आप कुछ पोस्ट-प्रोसेसिंग करने के लिए तैयार कर रहे हैं दे सकता है।

आप -v विकल्प के साथ जंगली भैंसों चलाते हैं, यह एक फ़ाइल filename.output कहा जाता है (जहां filename.y फ़ाइल के basename है) का उत्पादन करेगा; उस फ़ाइल में व्याकरण की एक प्रति और प्रत्येक राज्य का विवरण शामिल है। व्याकरण में क्रियाएं नहीं होती हैं, और इसमें प्रति पंक्ति एक उत्पादन होता है। लेकिन आपको कुछ काम करने की आवश्यकता होगी:

  1. प्रत्येक उत्पादन की संख्या है। आपको उन नंबरों को हटाना होगा।

  2. यदि मध्य-नियम कार्य हैं, तो वे अजीब नामित खाली गैर-टर्मिनल के रूप में दिखाई देंगे। नाम [email protected] या @2 जैसे कुछ होंगे। आपको इन टोकन और उनके संबंधित खाली प्रस्तुतियों को हटाना होगा।

  3. खाली प्रस्तुतियां (कम से कम एक बाइसन के हालिया संस्करण में) /* empty */ के रूप में दिखायी गयी हैं। यह आपकी वरीयता नहीं हो सकती है।

  4. यह परिवर्तन होता नहीं :::=

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

+0

वही था जो मैं पूछ रहा था। यह मेरी समस्या हल हो गया। – lferasu

+0

@ इफेरासु: ... फिर रिकी के जवाब को स्वीकार करें –

संबंधित मुद्दे