Bison/Flex টিউটোরিয়াল C ++, AST এবং পুনরায় প্রবেশকারী উভয় লেক্সার এবং পার্সার

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

  1. C ++ (না C) অ্যাব্রেট সিনট্যাক্স ট্রি।
  2. পুনরায় প্রবেশ করুন।
  3. পুনঃপ্রতিষ্ঠিত পার্সার।
  4. একটি স্ট্রিং থেকে পড়া (ফাইল থেকে বনাম) ভাল হিসাবে ভাল হবে।

আমি একাধিক উদাহরণ এবং টিউটোরিয়াল পাওয়া যায়, কিন্তু প্রতিটি সাধারণত শুধুমাত্র উপরের প্রয়োজনীয়তা কয়েক পূরণ করে। এখন পর্যন্ত আমার সেরা টিউটোরিয়াল অধ্যায় 3-2 থেকে Oreilly বইয়ের দ্বারা জন লেভিন - এটা AST; সব সি যদিও, শুধুমাত্র Re_1 উপরে পূরণ আমি চমৎকার উদাহরণ/টিউটোরিয়ালের জন্য প্রস্তাবনা স্বাগত জানাই, বাস্তব জীবন ওপেন সোর্স প্রকল্প। উদাহরণস্বরূপ আমি MySql .yy ফাইলটি দেখেছি - ভালভাবে লেখা আছে, কিন্তু আমার মত শিষ্যদের জন্য খুব বড়/জটিল।

0
আপনি C ++ কোডেড মানে? অথবা আপনি C ++ পার্স করতে চান?
যোগ লেখক Ira Baxter, উৎস
আমি আমার কোড চান যা Flex/Bison এর সাথে C ++ এর সাথে যোগাযোগ করে। বিশেষ করে এএসটি (অ্যাবট সিন্ট্যাক্স ট্রি)। উল্লিখিত উদাহরণ সি টাইপ- leniency উপর নির্ভর করে। প্লাস আমি STL ব্যবহার করতে চাই, ইত্যাদি। যতটা আমি পার্স করার চেষ্টা করছি: নিয়মিত এক্সপ্রেশন অনুরূপ একটি সাধারণ সিনট্যাক্স।
যোগ লেখক 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 সংস্থা/ওয়েব/20120520150851/HTTP: //www.phpcompiler.org/articles/reentrantparser.html

0
যোগ
প্রকৃতপক্ষে phpcompiler.org webiste চলে গেছে, আমাকে জানানোর জন্য ধন্যবাদ আমি আমার 2012 এর উত্তর অনুযায়ী সম্পাদিত করেছি।
যোগ লেখক Radim Cernej, উৎস
দুঃখিত, জ্যাক, আমি কোড আপলোড করতে বা অন্যথায় সাহায্য করতে পারবেন না। আমরা 2012 (প্রায় 5 ই আগে) কথা বলছি এবং আইপি আমার নিয়োগকর্তার মালিকানাধীন, ফ্লুয়ালাল ইনক/এলএলসি (আমি জানি না তারা এখনও ব্যবসা কিনা)। তারপর থেকে আমি পারসিং কাজ না এবং আমি অনেক মনে রাখবেন না :(।
যোগ লেখক Radim Cernej, উৎস
হ্যাঁ, যতটুকু আমি বলতে পারি এটি একই নিবন্ধ হতে পারে।
যোগ লেখক Radim Cernej, উৎস
লিঙ্কটি মৃত মনে হয়।
যোগ লেখক Adrien, উৎস
URL টি আপলোড করা হয়েছে আর্কাইভে। ORG অনেক বার ওয়েবসাইটটির নিকটতম স্ন্যাপশটটি 2017/05/২0 এ নেওয়া হয়েছে, যেটি কি সঠিক সংস্করণটি আপনার উত্তরে প্রদর্শন করতে চেয়েছিলেন?
যোগ লেখক Adrien, উৎস
হাই রাদিম, আমি শুধু লিখতে হবে (তাই সহজ নয়) কম্পাইলার। এটা কি ঠিক যে আপনি যেমনটি গিথউব মত কোথাও একত্রিত করেছেন তা আপলোড করতে চান? মানুষ এটি দরকারী পেতে পারে, exsiting উদাহরণ exsiting সঙ্গে সহজে খেলতে সহজ নয় শুধু আশ্চর্য, যাইহোক ধন্যবাদ।
যোগ লেখক jack, উৎস

প্রথমে আমি বলতে চাই যে সি ++ ব্যাকরণটি লেক্স/বাইসনের জন্য খুবই জটিল। এখানে সমস্যা মূলত ব্যাকরণ দ্বন্দ্ব। সি ++ ব্যাকরণ লিখতে সম্ভব নয় যা তাদের কাছে নেই। সি ++ মান স্পষ্টভাবে এই কথা বলে এবং তাদের কিভাবে সমাধান করতে হয় তার কিছু নির্দেশিকা রয়েছে।

ব্যাকরণ দ্বন্দ্ব সমাধান করার জন্য কোন জেনেরিক সমাধান নেই। C ++ এর জন্য বিশেষ করে ব্যাকরণ দ্বন্দ্বের রেজোলিউশন ইতিমধ্যে সংজ্ঞায়িত সনাক্তকারীর সম্পর্কে বিস্তারিত জ্ঞান প্রয়োজন। এর মানে হল যে আপনাকে C ++ ফ্রন্ট এন্ডের বড় অংশ থাকতে হবে। শুধু ব্যাকরণ থাকার যথেষ্ট নয়।

তবুও একটি AST নির্মাণের সম্ভব। একটি ছোট নমুনা প্রোগ্রাম তাকান।

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

এই গাছ গুরুতরভাবে zoomed আউট হয়। Leafs এ হলুদ বৃত্ত (খুব ছোট) টার্মিনাল চিহ্ন হয়, মাঝখানে সবুজ বৃত্ত অ টার্মিনাল হয়। কেন্দ্রে গোলক বৃত্ত হলো অনুবাদউইট। এই গাছ 2009 নোড আছে।

0
যোগ
হাই কিরিল, যেহেতু আমি অন্য একটি মন্তব্যে উল্লেখ করেছি, আমি c ++ কে পার্স করার চেষ্টা করছি না, আমি শুধু একটি সি ++ প্রোজেক্টে বাইসন/ফ্লেক্স ব্যবহার করতে চাই। আমি এখন একটি সমাধান আছে, আমি এই প্রশ্ন বন্ধ করার চেষ্টা করতে যাচ্ছি।
যোগ লেখক Radim Cernej, উৎস