सी ++, एएसटी के साथ बाइसन/फ्लेक्स ट्यूटोरियल और लेक्सर और पार्सर दोनों पुनः प्रवेश करें

I am learning parsing, bison & lex. I am looking for a clear & complete tutorial/example that demonstrates all of:

  1. सी ++ (सी नहीं) सार सिंटेक्स वृक्ष।
  2. पुन: प्रवेशकर्ता लेक्सर।
  3. पुन: प्रवेशकर्ता पार्सर।
  4. एक स्ट्रिंग (फ़ाइल से बनाम) से पढ़ना भी अच्छा होगा।

मुझे कई उदाहरण और ट्यूटोरियल मिले हैं, लेकिन प्रत्येक आम तौर पर उपर्युक्त आवश्यकताओं में से कुछ को पूरा करता है। अब तक मेरा सबसे अच्छा ट्यूटोरियल जॉन लेविन द्वारा ओरेली पुस्तक में अध्याय 3-2 से है - इसमें एएसटी है; हालांकि सभी सी, ऊपर केवल Re_1 मिलते हैं। मैं अच्छे उदाहरण/ट्यूटोरियल, वास्तविक जीवन मुक्त स्रोत परियोजनाओं के लिए सिफारिशों का स्वागत करता हूं। उदाहरण के लिए मैंने MySQL को देखा है। मेरी फ़ाइल - अच्छी तरह लिखी गई है, लेकिन मेरे जैसे शुरुआती के लिए बहुत बड़ी/जटिल है।

0
जोड़ा संपादित
विचारों: 1
आपका मतलब सी ++ में कोड किया गया है? या आप सी ++ पार्स करना चाहते हैं?
जोड़ा लेखक Ira Baxter, स्रोत
मैं अपना कोड चाहता हूं जो सी ++ होने के लिए फ्लेक्स/बाइसन के साथ इंटरैक्ट करता है। विशेष रूप से एएसटी (सार सिंटेक्स ट्री)। उल्लिखित उदाहरण सी प्रकार-उदारता पर निर्भर करता है। इसके अलावा मैं एसटीएल, आदि का उपयोग करना चाहता हूं। जहां तक ​​मैं पार्स करने की कोशिश कर रहा हूं: नियमित अभिव्यक्तियों के समान एक सरल वाक्यविन्यास।
जोड़ा लेखक Radim Cernej, स्रोत

2 उत्तर

In the end I combined several examples to get what I wanted. The top two examples were from John Levine's book on bison&flex (2nd edition), ISBN-10: 0596155972. The other one was from a phpcompiler website which unfortunaltly as of 2017-02-28 no longer exists. I am leaving the link here, in case the site is archived somewhere: www.phpcompiler.org/articles/reentrantparser.html

धन्यवाद एड्रियान, यहां एक संग्रहित संस्करण है (2017-03-02 के रूप में काम करता है):

http: //web.archive। org/वेब/20120520150851/http: //www.phpcompiler.org/articles/reentrantparser.html

0
जोड़ा
दरअसल phpcompiler.org वेबिस्ट चला गया है, मुझे सूचित करने के लिए धन्यवाद। मैंने तदनुसार अपना 2012 जवाब संपादित किया है।
जोड़ा लेखक Radim Cernej, स्रोत
क्षमा करें, जैक, मैं कोड अपलोड करने या अन्यथा मदद करने में सक्षम नहीं होगा। हम 2012 (लगभग 5y ago) बात कर रहे हैं और आईपी का स्वामित्व मेरे नियोक्ता, फ्लुएंशियल इंक/एलएलसी (मुझे नहीं पता कि वे अभी भी व्यवसाय में हैं)। तब से मैंने पार्सिंग पर काम नहीं किया है और मुझे बहुत याद नहीं है :(।
जोड़ा लेखक Radim Cernej, स्रोत
हां, जहां तक ​​मैं यह कह सकता हूं वही लेख प्रतीत होता है।
जोड़ा लेखक Radim Cernej, स्रोत
लिंक मर गया प्रतीत होता है।
जोड़ा लेखक Adrien, स्रोत
यूआरएल को संग्रह पर अपलोड कर दिया गया है। संगठन कई बार। वेबसाइट का सबसे नज़दीकी स्नैपशॉट 2017/05/20 को लिया गया है, क्या यह सही संस्करण है जिसे आप अपने उत्तर में दिखाना चाहते हैं?
जोड़ा लेखक Adrien, स्रोत
हाय रैडिम, मुझे अभी एक (इतना आसान नहीं) कंपाइलर लिखने की आवश्यकता है। यह आपके लिए गिटूब की तरह कहीं भी इकट्ठा उदाहरण अपलोड करने के लिए ठीक है? लोगों को यह उपयोगी लग सकता है, क्योंकि उदाहरणों को छोड़कर वास्तव में खेलना आसान नहीं है। बस सोच रहा है, वैसे भी धन्यवाद।
जोड़ा लेखक jack, स्रोत

सबसे पहले मैं कहना चाहता हूं कि सी ++ व्याकरण लेक्स/बाइसन के लिए बहुत जटिल है। यहां समस्या मुख्य रूप से व्याकरण संघर्ष में है। सी ++ व्याकरण लिखना संभव नहीं है जिसमें उनके पास नहीं है। सी ++ मानक स्पष्ट रूप से यह कहता है और इसमें कुछ दिशानिर्देश शामिल हैं कि उन्हें कैसे हल किया जाए।

व्याकरण विवादों को हल करने के लिए कोई सामान्य समाधान नहीं है। सी ++ के लिए विशेष व्याकरण संघर्ष संकल्प में पहले से परिभाषित पहचानकर्ताओं के बारे में विस्तृत ज्ञान की आवश्यकता होती है। इसका मतलब है कि आपको सी ++ फ्रंट एंड का बड़ा हिस्सा होना चाहिए। केवल व्याकरण होने के पर्याप्त नहीं है।

फिर भी एक एएसटी बनाना संभव है। एक छोटे नमूना कार्यक्रम को देखो।

class HashEntry
{
private:

      int key;
      int value;

public:

      HashEntry(int key, int value)
      {
            this->key = key;
            this->value = value;
      }

      int getKey() { return key; }

      int getValue() { return value; }
};

const int TABLE_SIZE = 128;

class HashMap
{
private:

      HashEntry **table;

public:

      HashMap()
      {
            table = new HashEntry*[TABLE_SIZE];

            for (int i = 0; i < TABLE_SIZE; i++)
                  table[i] = NULL;
      }

      int get(int key)
      {
            int hash = (key % TABLE_SIZE);

            while (table[hash] != NULL && table[hash]->getKey() != key)
                  hash = (hash + 1) % TABLE_SIZE;

            if (table[hash] == NULL)
                  return -1;
            else
                  return table[hash]->getValue();
      }

      void put(int key, int value)
      {
            int hash = (key % TABLE_SIZE);

            while (table[hash] != NULL && table[hash]->getKey() != key)
                  hash = (hash + 1) % TABLE_SIZE;

            if (table[hash] != NULL)
                  delete table[hash];

            table[hash] = new HashEntry(key, value);
      }     

      ~HashMap()
      {
            for (int i = 0; i < TABLE_SIZE; i++)
                  if (table[i] != NULL)
                        delete table[i];

            delete[] table;
      }
};

And this is an AST for this program: enter image description here

यह पेड़ गंभीर रूप से ज़ूम आउट है। पत्तियों पर पीले सर्कल (बहुत छोटे) टर्मिनल प्रतीकों हैं, बीच में हरी मंडल गैर टर्मिनल हैं। केंद्र में गुलाबी सर्कल TranslationUnit है। इस पेड़ में 200 नोड्स हैं।

0
जोड़ा
हाय किरिल, जैसा कि मैंने एक और टिप्पणी में संकेत दिया है, मैं सी ++ को पार्स करने की कोशिश नहीं कर रहा हूं, मैं बस एक सी ++ प्रोजेक्ट में बाइसन/फ्लेक्स का उपयोग करना चाहता हूं। मेरे पास अब एक समाधान है, मैं इस सवाल को बंद करने की कोशिश करने जा रहा हूं।
जोड़ा लेखक Radim Cernej, स्रोत