জিসিসি এবং ক্ল্যাং পার্সারগুলি কি আসলেই হাতে লেখা?


90

এটা যে জিসিসি এবং LLVM-ঝনঝন ব্যবহার করছেন বলে মনে হয় হাতে লেখা রিকার্সিভ বংশদ্ভুত পারজার , এবং না তৈরি হয়েছে, বাইসন-ফ্লেক্স ভিত্তিক, নীচে আপ পার্সিং মেশিন।

এখানে কেউ দয়া করে নিশ্চিত করতে পারেন যে এটিই কেস? এবং যদি তা হয় তবে কেন মূলধারার সংকলক ফ্রেমওয়ার্কগুলি হস্তাক্ষর পার্সার ব্যবহার করে?

আপডেট : এখানে এই বিষয় আকর্ষণীয় ব্লগ


27
প্রায় সমস্ত মূলধারার সংকলক হস্তাক্ষর পার্সার ব্যবহার করছেন। তাতে সমস্যা কী?
এসকে-যুক্তি

4
আপনার যদি পারফরম্যান্সের প্রয়োজন হয় তবে আপনাকে এটি (আধা) নিজেই করতে হবে।
জিন বুশুয়েভ

15
এবং শুধুমাত্র কর্মক্ষমতা - ভাল ত্রুটি বার্তা, পুনরুদ্ধার করার ক্ষমতা, ইত্যাদি
এস কে-যুক্তিবিজ্ঞান

এমএস ভিজ্যুয়ালস্টুডিও সম্পর্কে কী? যদিও উন্মুক্ত উত্সাহীন নয়, এমএসের কেউ কি তা যাচাই করতে পারে যে তারাও হ্যান্ড লিখিত রিকার্সি ডেসেন্ট পার্সার ব্যবহার করছে?
ওরেনশালাম

4
জিনস বুশুয়েভ, জিসিসির উইকির কাছ থেকে: "... যদিও সময়সাম্যগুলি 1.5% গতিবেগ দেখিয়েছিল , মূল সুবিধাগুলি ভবিষ্যতের
বর্ধনকে আরও সহজতর করে তুলেছে

উত্তর:


78

হ্যাঁ:

  • জিসিসি একদা একটি yacc (বাইসন) পার্সার ব্যবহৃত হয়েছে, কিন্তু এটা 3.x সিরিজের কিছু সময়ে একটি হাতে লেখা রিকার্সিভ বংশদ্ভুত পার্সার প্রতিস্থাপন করা হয়েছে: দেখুন http://gcc.gnu.org/wiki/New_C_Parser জন্য প্রাসঙ্গিক প্যাচ জমা দেওয়ার লিঙ্কগুলি।

  • ক্লেং হ্যান্ড লিখিত রিকার্সিভ ডেসেন্ট পার্সারও ব্যবহার করে: http://clang.llvm.org/features.html এর শেষের নিকটবর্তী "সি, অবজেক্টিভ সি, সি ++ এবং অবজেক্টিভ সি ++ এর জন্য একটি একক ইউনিফাইড পার্সার" বিভাগটি দেখুন ।


4
এর অর্থ কি ওবজিসি, সি এবং সি ++ এর এলএল (কে) গ্রামার রয়েছে?
লিন্ডেম্যান

47
না: এমনকি তিনটির মধ্যে সবচেয়ে সহজ সিটিরও দ্বিধাগ্রস্ত ব্যাকরণ রয়েছে। উদাহরণস্বরূপ, foo * bar;হয় কোনও গুণ গুণ প্রকাশের ফলে (ফলাফল অব্যবহৃত), বা barপয়েন্টার-টু- টাইপের সাথে একটি ভেরিয়েবলের ঘোষণা হিসাবে পার্স করতে পারে foo। কোনটি সঠিক কিনা উপর নির্ভর করে typedefজন্য fooসময়, যা কিছু যে lookahead যে কোন পরিমাণ সঙ্গে নির্ধারণ করা যেতে পারে না এ সুযোগ রয়েছে। তবে এর ঠিক অর্থ হ'ল পুনরাবৃত্তিশীল বংশদ্ভুত পার্সারকে এটি পরিচালনা করতে কিছু কুৎসিত অতিরিক্ত যন্ত্রপাতি যুক্ত করা দরকার।
ম্যাথু স্ল্যাটারি

9
আমি অভিজ্ঞতাগত প্রমাণ থেকে নিশ্চিত করতে পারি যে, সি ++ 11, সি এবং উদ্দেশ্য সিতে প্রবন্ধমুক্ত ব্যাকরণ রয়েছে যা একটি জিএলআর পার্সার পরিচালনা করতে পারে।
ইরা

4
প্রসঙ্গে সংবেদনশীলতা সম্পর্কে, এই উত্তরটিও দাবি করে না: এই ভাষাগুলি পার্স করা সম্ভবত টুরিং-সম্পূর্ণ।
আইওনিস ফিলিপিস

106

এখানে একটি লোক-উপপাদ্য রয়েছে যা বলেছে যে পার্স করা কঠিন, এবং সি ++ মূলত অসম্ভব।

এটা সত্য নয়।

সত্যটি হ'ল সি এবং সি ++ পার্সিং মেশিনিকে হ্যাক না করে এবং প্রতীক টেবিলের ডেটাতে জটলা না করেই LALR (1) পার্সার ব্যবহার করে পার্স করা বেশ শক্ত। জিসিসি প্রকৃতপক্ষে এগুলিকে পার্স করতে, ওয়াইএসিসি এবং এর মতো অতিরিক্ত হ্যাকারি ব্যবহার করত এবং হ্যাঁ এটি কুৎসিত ছিল। এখন জিসিসি হস্তাক্ষরযুক্ত পার্সার ব্যবহার করে, তবে এখনও প্রতীক টেবিল হ্যাকারি সহ। ক্লেং লোকেরা কখনও স্বয়ংক্রিয় পার্সার জেনারেটর ব্যবহার করার চেষ্টা করেনি; এএফআইএকে ক্ল্যাং পার্সারটি সর্বদা হ্যান্ড-কোডেড পুনরাবৃত্ত উত্পন্ন।

সত্য, সি এবং সি ++ শক্তিশালী স্বয়ংক্রিয়ভাবে উত্পাদিত পার্সারগুলি উদাহরণস্বরূপ, জিএলআর পার্সারগুলির সাথে পার্স করা তুলনামূলক সহজ এবং আপনার কোনও হ্যাকের দরকার নেই। এলসা সি ++ পার্সার এই একটি উদাহরণ। আমাদের সি ++ ফ্রন্ট এন্ড অন্যটি (যেমন আমাদের সমস্ত "সংকলক" সামনের প্রান্তে রয়েছে, জিএলআর বেশ দুর্দান্ত পার্সিং প্রযুক্তি)।

আমাদের সি ++ সামনের প্রান্তটি জিসিসির মতো তত দ্রুত নয় এবং অবশ্যই এলসার চেয়েও ধীর; আমরা এটিকে সাবধানে টিউন করার জন্য সামান্য শক্তি রেখেছি কারণ আমাদের আরও বেশি চাপের সমস্যা রয়েছে (তবে এটি লক্ষ লক্ষ লাইনের সি ++ কোডে ব্যবহৃত হয়েছে)। এলসা সম্ভবত জিসিসির চেয়ে ধীর গতির কারণ এটি বেশি সাধারণ। এই দিনগুলিতে প্রসেসরের গতি দেওয়া, এই পার্থক্যগুলি অনুশীলনে খুব বেশি গুরুত্ব পাবে না।

তবে "সত্যিকারের সংকলক" যেগুলি আজ ব্যাপকভাবে বিতরণ করা হয় তার মূলগুলি 10 বা 20 বছর আগে বা তারও বেশি সংকলকগুলিতে রয়েছে। অদক্ষতাগুলি তখন আরও অনেক বেশি গুরুত্বপূর্ণ হয়ে পড়েছিল এবং কেউ জিএলআর পার্সারগুলির কথা শুনেনি, তাই লোকেরা কীভাবে তারা কীভাবে করতে হবে তা জানত। ঝনঝনানি অবশ্যই খুব সাম্প্রতিক, তবে তারপরে লোকজ তত্ত্বগুলি দীর্ঘ সময়ের জন্য তাদের "প্ররোচনার" বজায় রাখে।

আপনাকে আর সেভাবে করতে হবে না। সংকলক রক্ষণাবেক্ষণের উন্নতি সহ আপনি খুব যুক্তিসঙ্গতভাবে জিএলআর এবং অন্যান্য অন্যান্য পার্সারকে সামনের প্রান্ত হিসাবে ব্যবহার করতে পারেন।

কি হল সত্য, যে একটি ব্যাকরণ আপনার বন্ধুত্বপূর্ণ আশপাশ কম্পাইলার আচরণ ম্যাচ পেয়ে কঠিন হয়। কার্যত সমস্ত সি ++ সংকলকগুলি মূল স্ট্যান্ডার্ডটির বেশিরভাগ প্রয়োগ করে (বেশিরভাগ), তাদের প্রচুর অন্ধকার কোণার এক্সটেনশনগুলি থাকে, যেমন, এমএস সংকলকগুলিতে ডিএলএল স্পেসিফিকেশন ইত্যাদি If আপনার পার্সার জেনারেটরের সীমাবদ্ধতার সাথে মেলে আপনার ব্যাকরণকে বাঁকানোর চেষ্টা করার চেয়ে, বাস্তবের সাথে মেলে চূড়ান্ত ব্যাকরণ।

নভেম্বর ২০১২ সম্পাদনা করুন: এই উত্তরটি লেখার পর থেকে আমরা এএনএসআই, জিএনইউ, এবং এমএস বৈকল্পিক সহ পুরো সি ++ 11 হ্যান্ডেল করার জন্য আমাদের সি ++ সামনের প্রান্তটি উন্নত করেছি। যখন প্রচুর অতিরিক্ত স্টাফ ছিল, আমাদের পার্সিং ইঞ্জিনটি পরিবর্তন করতে হবে না; আমরা কেবল ব্যাকরণের নিয়মগুলি সংশোধন করেছি। আমরা হয়নি শব্দার্থিক বিশ্লেষণ পরিবর্তন করতে হবে; সি ++ 11 শব্দার্থগতভাবে অত্যন্ত জটিল, এবং এই কাজটি পার্সারটি চালানোর প্রচেষ্টাটিকে সোয়েম করে।

ফেব্রুয়ারী 2015 সম্পাদনা করুন: ... এখন পুরো সি ++ 14 পরিচালনা করে। ( সাধারণ বিট কোডের জিএলআর পার্সের জন্য সি ++ কোড থেকে মানব পাঠযোগ্য এএসটি দেখুন , এবং সি ++ এর কুখ্যাত "সর্বাধিক ভেক্সিং পার্স"))

এডিআইটি এপ্রিল 2017: এখন পরিচালনা করে (খসড়া) সি ++ 17।


6
পোস্টস্ক্রিপ্ট: বিক্রেতারা যা সত্যিই করেন তা মেলাতে যেমন ব্যাকরণ পাওয়া শক্ত, তেমনি সি ++ 11 ম্যানুয়ালটির বিভিন্ন বিক্রেতার ব্যাখ্যার সাথে মিলের জন্য নাম এবং টাইপ রেজোলিউশনটি আরও কঠোর, কারণ আপনার কাছে কেবলমাত্র প্রমাণ রয়েছে যে প্রোগ্রামগুলি সামান্য সংকলন করে অন্যভাবে, যদি আপনি তাদের সন্ধান করতে পারেন। সি ++ ১১ এর জন্য অগস্ট ২০১৩ যথাযথভাবে আমরা অতীত হয়ে পড়েছি, তবে আমি সি ++ কমিটিতে কিছুটা হতাশ হয়েছি যা সি আকারে আরও বৃহত্তর (এবং অভিজ্ঞতা থেকে আরও বিভ্রান্তিকর) মান উত্পাদন করতে নরক মনে হয়েছে seems ++ 1y।
ইরা

4
আমি সত্যিই জানতে চাই: আপনি কিভাবে এই foo * bar;অস্পষ্টতা পরিচালনা করবেন ?
মার্টিন

14
@ মার্টিন: আমাদের পার্সার এটি উভয় উপায়ে পার্স করে, বিশেষ "দ্ব্যর্থতা নোড" সম্বলিত একটি গাছ উত্পাদন করে যার সন্তানরা বিকল্প পার্স করে; শিশুরা তাদের বাচ্চাদের সর্বাধিক ভাগ করে নেয় তাই আমরা গাছের পরিবর্তে একটি ডিএজি দিয়ে শেষ করি। পার্সিং সম্পূর্ণ হওয়ার পরে , আমরা ড্যাগের উপরে একটি অ্যাট্রিবিউট ব্যাকরণ মূল্যায়নকারী (এজিই) পরিচালনা করি ("গাছের দিকে হাঁটুন এবং স্টাফ করুন" এর অভিনব নাম যদি আপনি এটি জানেন না) যা সমস্ত ঘোষিত শনাক্তকারীদের ধরণের সংখ্যাকে গণনা করে। ...
ইরা

12
... অস্পষ্ট শিশুরা উভয়ই টাইপ-সামঞ্জস্যপূর্ণ হতে পারে না; সংবেদনশীল টাইপ করা যায় না এমন একটি অস্পষ্ট বাচ্চা আবিষ্কার করার জন্য এজিই এটিকে মুছে দেয়। যা বাকী রয়েছে তা হ'ল ভাল টাইপ করা বাচ্চারা; সুতরাং, আমরা নির্ধারণ করেছি যে "ফু ফু" এর কোন পার্স ; সঠিক. এই কৌশলটি সত্যিকারের ব্যাকরণগুলিতে পাওয়া সমস্ত ধরণের অস্পষ্টতার জন্য কাজ করে যা আমরা সি ++ 11 এর প্রকৃত উপভাষার জন্য তৈরি করি এবং নামগুলির জন্য শব্দার্থবিজ্ঞান বিশ্লেষণ থেকে পার্সিংকে পুরোপুরি পৃথক করে। এই পরিষ্কার বিচ্ছিন্নতার অর্থ ইঞ্জিনিয়ারিংয়ের অনেক কম কাজ (ডিবাগ করার জন্য কোনও জট নেই)। আরও আলোচনার জন্য stackoverflow.com/a/1004737/120163 দেখুন ।
ইরা

4
@ টিমকাস: প্রকৃতপক্ষে, আমি ভাষা সিনট্যাক্স (এবং শব্দার্থবিজ্ঞান) ডিজাইন করার মূর্খতার সাথে রেলিংয়ের জন্য আপনার সাথে আছি যা এত জটিল যে এটি সঠিকভাবে পাওয়া খুব কঠিন (হ্যাঁ, সি ++ ভাষা এখানে খারাপভাবে ভোগে)। আমি আশা করি ভাষা নকশা কমিটিগুলি সিনট্যাক্স ডিজাইন করবে যাতে সহজ পার্সিং প্রযুক্তিগুলি কাজ করতে পারে এবং স্পষ্টভাবে ভাষা শব্দার্থবিজ্ঞানের সংজ্ঞা দেয় এবং কিছু শব্দার্থক বিশ্লেষণ সরঞ্জাম দিয়ে এটি পরীক্ষা করে check হায় আফসোস, পৃথিবী এর মতো মনে হয় না। সুতরাং, আমি এই দৃষ্টিভঙ্গি নিয়েছি যে আপনি যা যা বানাতে হবে তার পাশাপাশি আপনি যা করতে পারেন তা তৈরি করেন এবং বিশ্রীতার পরেও জীবনের সাথে এগিয়ে যান।
ইরা

31

ক্ল্যাংয়ের পার্সার হ্যান্ড রাইটেড রিকার্সিভ-ডেসেন্ট পার্সার, যেমনটি অন্যান্য বেশ কয়েকটি ওপেন সোর্স এবং বাণিজ্যিক সি এবং সি ++ সামনের প্রান্তে রয়েছে।

কলং বিভিন্ন কারণে একটি পুনরাবৃত্ত-বংশদ্ভুত পার্সার ব্যবহার করে:

  • পারফরম্যান্স : একটি হাতে লিখিত পার্সার আমাদের প্রয়োজন হিসাবে গরম পথগুলিকে অনুকূল করে একটি দ্রুত পার্সার লিখতে দেয় এবং আমরা সর্বদা সেই পারফরম্যান্সের নিয়ন্ত্রণে আছি। দ্রুত পার্সার থাকার কারণে কল্যাংকে অন্যান্য বিকাশ সরঞ্জামগুলিতে ব্যবহার করার অনুমতি দেওয়া হয়েছে যেখানে "রিয়েল" পার্সার সাধারণত ব্যবহৃত হয় না, যেমন, আইডিইতে সিনট্যাক্স হাইলাইটিং এবং কোড সমাপ্তি।
  • ডায়াগনস্টিকস এবং ত্রুটি পুনরুদ্ধার : যেহেতু আপনি একটি হাতে লিখিত পুনরাবৃত্ত-বংশদ্ভুত পার্সার দিয়ে পুরো নিয়ন্ত্রণে রয়েছেন, তাই সাধারণ সমস্যাগুলি সনাক্ত করতে এবং দুর্দান্ত ডায়াগোনস্টিকস এবং ত্রুটি পুনরুদ্ধারের সরবরাহকারী বিশেষ কেসগুলি যুক্ত করা সহজ (যেমন, http: //clang.llvm দেখুন) .org / features.html # expressivediags ) স্বয়ংক্রিয়ভাবে উত্পন্ন পারজার সঙ্গে, আপনি জেনারেটর ক্ষমতা সীমাবদ্ধ করছি।
  • সরলতা : পুনরাবৃত্ত-বংশদ্ভূত পার্সারগুলি লিখতে, বুঝতে এবং ডিবাগ করা সহজ। আপনাকে পার্সিং বিশেষজ্ঞ হতে হবে না বা পার্সারটি প্রসারিত / উন্নত করতে একটি নতুন সরঞ্জাম শিখতে হবে না (এটি একটি ওপেন-সোর্স প্রকল্পের জন্য বিশেষত গুরুত্বপূর্ণ) তবে আপনি এখনও দুর্দান্ত ফলাফল পেতে পারেন।

সামগ্রিকভাবে, একটি সি ++ সংকলকটির জন্য, এটি খুব বেশি কিছু যায় আসে না: সি ++ এর পার্সিং অংশটি ক্ষুদ্র হয় না, তবে এটি এখনও সহজ অংশগুলির মধ্যে একটি, তাই এটি সহজ রাখার জন্য অর্থ প্রদান করে। শব্দার্থবিজ্ঞান বিশ্লেষণ --- বিশেষত নাম অনুসন্ধান, আরম্ভকরণ, ওভারলোড রেজোলিউশন এবং টেমপ্লেট তাত্ক্ষণিকতা --- পার্সিংয়ের চেয়ে জটিলতার আদেশ orders আপনি যদি প্রমাণ চান তবে কোডের বিতরণটি পরীক্ষা করে দেখুন এবং ক্ল্যাংয়ের "সেমা" উপাদান (শব্দার্থ বিশ্লেষণের জন্য) বনাম এর "পার্স" উপাদানটি (পার্সিংয়ের জন্য) প্রতিশ্রুতিবদ্ধ।


4
হ্যাঁ, অর্থশাস্ত্র বিশ্লেষণ অনেক বেশি শক্ত। আমাদের কাছে প্রায় 4000 লাইন ব্যাকরণের নিয়ম রয়েছে যা আমাদের সি ++ 11 ব্যাকরণ এবং কিছু "180,000 লাইনের বিশিষ্ট ব্যাকরণ কোডের উপরের" শব্দাবলীর বিশ্লেষণগুলি "ডউব তালিকার জন্য, সহকারী কোডের আরও 100,000 লাইন রয়েছে। পার্সিং করা আসলেই সমস্যা নয়, যদিও আপনি ভুল পায়ে শুরু করলে এটি যথেষ্ট শক্ত।
ইরা

4
আমি এতটা নিশ্চিত নই যে হাতের লিখিত পার্সারগুলি ত্রুটি প্রতিবেদন / পুনরুদ্ধারের জন্য অগত্যা ভাল। বাস্তবে স্বয়ংক্রিয় পার্সার জেনারেটর দ্বারা উত্পাদিত পার্সার বাড়ানোর চেয়ে লোকেরা এ জাতীয় পার্সারে আরও শক্তি প্রয়োগ করেছে বলে মনে হয়। বিষয়টি নিয়ে বেশ ভাল গবেষণা হচ্ছে বলে মনে হয়; এই বিশেষ কাগজটি সত্যই আমার নজর কেড়েছে: এমজি বার্ক, 1983, এলআর এবং এলএল সিনট্যাকটিক ত্রুটি সনাক্তকরণ এবং পুনরুদ্ধারের জন্য একটি ব্যবহারিক পদ্ধতি, পিএইচডি থিসিস, কম্পিউটার সায়েন্স বিভাগ, নিউইয়র্ক ইউনিভার্সিটি, আর্কাইভ.org
ইরা বাক্সটার

4
... এই চিন্তার ট্রেন চালিয়ে যাওয়া: আপনি যদি আরও ভাল নির্ণয়ের জন্য বিশেষ ক্ষেত্রে পরীক্ষা করতে নিজের হাতে নির্মিত পার্সার সংশোধন / প্রসারিত / কাস্টমাইজ করতে চান তবে যান্ত্রিকভাবে উত্পন্ন পার্সারের আরও ভাল নির্ণয়ের ক্ষেত্রে আপনার সমান বিনিয়োগ করতে ইচ্ছুক হওয়া উচিত। আপনি ম্যানুয়ালটির জন্য এনকোড করতে পারেন এমন কোনও বিশেষ পার্সের জন্য, আপনি যান্ত্রিকটির জন্য একটি চেকও কোডিং করতে পারেন (এবং (জি) এলআর পার্সারদের জন্য, আপনি হ্রাস নেওয়ার ক্ষেত্রে সিনেমিক চেক হিসাবে বেশ কিছু করতে পারেন)। যে পরিমাণ অপ্রয়োজনীয় বলে মনে হচ্ছে, একজন কেবল অলস হয়ে উঠছে তবে এটি যান্ত্রিকভাবে উত্পন্ন পার্সার আইএমএইচও-র একটি অভিব্যক্তি নয়।
ইরা

8

জিসিসির পার্সার হস্তাক্ষরযুক্ত। । ঝাঁকুনির জন্যও আমি একই সন্দেহ করি। এটি সম্ভবত কয়েকটি কারণে:

  • পারফরম্যান্স : এমন কিছু যা আপনি নিজের নির্দিষ্ট কাজের জন্য হ্যান্ড-অপ্টিমাইজ করেছেন তা সাধারণ সমাধানের চেয়ে প্রায় সবসময়ই ভাল সম্পাদন করবে। বিমূর্ততা সাধারণত একটি পারফরম্যান্স হিট থাকে
  • সময় : কমপক্ষে জিসিসির ক্ষেত্রে, জিসিসি প্রচুর বিনামূল্যে বিকাশকারী সরঞ্জামের পূর্বাভাস দেয় (1987 সালে প্রকাশিত হয়েছিল)। তখন ইয়্যাক ইত্যাদির কোনও মুক্ত সংস্করণ ছিল না, যা আমি কল্পনা করেছিলাম এফএসএফের লোকদের কাছে অগ্রাধিকার হত।

এটি সম্ভবত "এখানে উদ্ভাবিত নয়" সিনড্রোমের ঘটনা নয়, তবে "আমাদের যা প্রয়োজন তার জন্য বিশেষত কিছুই অনুকূলিত করা হয়নি, তাই আমরা আমাদের নিজস্ব লিখেছি"।


15
1987 সালে ইয়্যাকের কোনও মুক্ত সংস্করণ নেই? আমি মনে করি 70 এর দশকে ইয়্যাক যখন প্রথম ইউনিক্সের অধীনে সরবরাহ করা হয়েছিল তখন বিনামূল্যে সংস্করণ ছিল। আর IIRC (অন্যান্য পোস্টার একই বলে মনে হয়), জিসিসি ব্যবহৃত একটি YACC ভিত্তিক পার্সার আছে। আমি এটির পরিবর্তনের অজুহাত শুনেছি আরও ভাল ত্রুটি প্রতিবেদন করা।
ইরা বাক্সার

7
আমি যুক্ত করতে চাই যে কোনও हस्त লিখিত পার্সার থেকে ভাল ত্রুটি বার্তা উত্পন্ন করা প্রায়শই সহজ।
ডায়েটারিচ এপ্প

4
সময় সম্পর্কে আপনার পয়েন্টটি সঠিক নয় urate জিসিসিতে ওয়াইএসিসি ভিত্তিক পার্সার থাকত, তবে পরে এটি হস্তাক্ষর রিকার্সি ডেসেন্ট পার্সার দিয়ে প্রতিস্থাপন করা হয়েছিল।
টমি অ্যান্ডারসন

7

সেখানে অদ্ভুত উত্তর!

সি / সি ++ ব্যাকরণ প্রসঙ্গমুক্ত নয়। এগুলি ফু * বারের কারণে প্রসঙ্গে সংবেদনশীল; অস্পষ্টতা ফু টাইপ কিনা তা জানতে আমাদের টাইপডেফগুলির একটি তালিকা তৈরি করতে হবে।

ইরা বাক্সটার: আমি আপনার জিএলআর জিনিসটির সাথে পয়েন্টটি দেখতে পাচ্ছি না। অস্পষ্টতার সমন্বয়ে একটি পার্স গাছ কেন তৈরি করুন। পার্সিং এর অর্থ অস্পষ্টতা সমাধান করা, সিনট্যাক্স ট্রি তৈরি করা। আপনি এই অস্পষ্টতাগুলি দ্বিতীয় পাসে সমাধান করুন, সুতরাং এটি কম কুরুচিপূর্ণ নয়। আমার জন্য এটি অনেক বেশি কুৎসিত ...

ইয়্যাক একটি এলআর (1) পার্সার জেনারেটর (বা এলএলআর (1)), তবে এটি প্রসঙ্গ সংবেদনশীল হিসাবে সহজেই সংশোধন করা যেতে পারে। এবং এটিতে কুৎসিত কিছুই নেই। ইয়্যাক / বাইসন সি ভাষার পার্সিংয়ের ক্ষেত্রে সহায়তা করার জন্য তৈরি করা হয়েছে, সুতরাং সম্ভবত এটি কোনও সি পার্সার তৈরি করা কুৎসিত সরঞ্জাম নয় ...

জিসিসি ৩.x অবধি সি পার্সার ইয়্যাক / বাইসন দ্বারা উত্পাদিত হয়, যেখানে পার্সিংয়ের সময় টাইপডেফস টেবিল নির্মিত হয়। "পার্স" টাইপডিফস টেবিল বিল্ডিংয়ের সাথে সি ব্যাকরণ স্থানীয়ভাবে প্রসঙ্গমুক্ত এবং তদতিরিক্ত "স্থানীয়ভাবে এলআর (1)" হয়ে যায়।

এখন, Gcc 4.x এ এটি একটি পুনরাবৃত্তির বংশদ্ভুত পার্সার। এটি জিসিসি ৩.০ এর মতো ঠিক একই পার্সার, এটি এখনও এলআর (1), এবং একই ব্যাকরণের নিয়ম রয়েছে। পার্থক্যটি হ'ল ইয়্যাক পার্সারটি আবার হাতে লেখা হয়েছে, শিফট / কমিয়ে এখন কল স্ট্যাকের মধ্যে লুকানো আছে, এবং কোনও "state454" নেই: যদি (nextsym == '(') গেটো স্টেট 398 "জিসিসি 3.x ইয়্যাকের মতো পার্সার, সুতরাং প্যাচ করা সহজ, ত্রুটিগুলি পরিচালনা করা এবং উত্তম বার্তাগুলি মুদ্রণ করা এবং পার্সিংয়ের সময় পরবর্তী কয়েকটি সংকলন পদক্ষেপগুলি সম্পাদন করা সহজ।

তারা ইয়্যাক থেকে পুনরাবৃত্ত বংশোদ্ভূত দিকে কেন সরে গেল? কারণ সি ++ পার্স করার জন্য ইয়্যাক এড়ানো যথেষ্ট প্রয়োজন, এবং কারণ জিসিসি বহুভাষার সংকলক হওয়ার স্বপ্ন দেখায়, অর্থাত্ বিভিন্ন ভাষার মধ্যে এটি সর্বাধিক কোড ভাগ করে নিতে পারে যা এটি সংকলন করতে পারে। এ কারণেই সি ++ এবং সি পার্সার একইভাবে লেখা হয়।

সি ++ সি এর তুলনায় পার্স করা শক্ত কারণ এটি "স্থানীয়ভাবে" এল আর (1) সি হিসাবে নয়, এটি এমনকি এলআর (কে )ও নয়। লুক এ func<4 > 2>যা, একটি টেম্পলেট ফাংশন 4> 2 instantiated হয় অর্থাত func<4 > 2> পঠিত হিসেবে করা হয়েছে func<1>। এটি অবশ্যই এলআর (1) নয়। এখন বিবেচনা করুন func<4 > 2 > 1 > 3 > 3 > 8 > 9 > 8 > 7 > 8>,। এখানেই পুনরাবৃত্ত উত্সটি সহজেই অস্পষ্টতা সমাধান করতে পারে, আরও কয়েকটি ফাংশন কল (পার্স_টেম্প্লেট_প্রেমিটার) দ্বিপদী পার্সার ফাংশন। এটি কাজ করে)।

আমি জানি না কেন ইয়্যাক / বাইসন রিকার্সিভ সাব গ্রামারগুলিতে যুক্ত করা সম্ভব হবে না, সম্ভবত এটি জিসিসি / জিএনইউ পার্সার বিকাশের পরবর্তী পদক্ষেপ হবে?


9
"আমার কাছে এটি অনেক বেশি কুৎসিত"। আমি আপনাকে যা বলতে পারি তা হ'ল জিএলআর ব্যবহার করে একটি প্রোডাকশন মানের পার্সার ইঞ্জিনিয়ারিং এবং অস্পষ্টতা সমাধানে বিলম্ব করা সত্যই একটি ছোট দলের সাথে ব্যবহারিক। অন্যান্য যে সমস্ত সমাধান আমি দেখেছি সেগুলি এলআর, পুনরাবৃত্তীয় বংশোদ্ভূত দিয়ে কাজ করার জন্য প্রয়োজনীয় ব্যাকফ্লিপস এবং হ্যাকগুলিতে জনসাধারণের মধ্যে দাঁত কষানোর কয়েক বছর জড়িত ছিল, আপনি এটির নাম দিন। আপনি প্রচুর অন্যান্য দুর্দান্ত নতুন পার্সিং প্রযুক্তি পোস্ট করতে পারেন তবে যতদূর আমি বলতে পারি এটি এই মুহুর্তে দাঁতকে আরও ঘনঘন করছে। আইডিয়াগুলি সস্তা; ফাঁসি কার্যকর।
ইরা

@ ইরাক্যাক্সটার: ইঁদুর! citeseerx.ist.psu.edu/viewdoc/…
ফিজ

@ ফিজ: ফোর্ট্রেসকে পার্সিং সম্পর্কিত আকর্ষণীয় কাগজ, এটি একটি জটিল বৈজ্ঞানিক প্রোগ্রামিং ল্যাংওয়েজ। তারা নোটের বেশ কয়েকটি জিনিস বলেছিল: ক) ক্লাসিক পার্সার জেনারেটর (এলএল (কে), এলএলআর (1)) শক্ত ব্যাকরণ পরিচালনা করতে পারে না, খ) তারা জিএলআর চেষ্টা করেছিল, স্কেল নিয়ে ঝামেলা করেছিল কিন্তু বিকাশকারীরা অনভিজ্ঞ ছিল তাই তারা করেনি সম্পূর্ণ [এটি জিএলআর এর দোষ নয়] এবং গ) তারা ব্যাকট্র্যাকিং (লেনদেনের) প্যাক্র্যাট পার্সার ব্যবহার করেছে এবং এর মধ্যে আরও ত্রুটি বার্তা উত্পন্ন করার কাজ সহ প্রচুর প্রচেষ্টা করেছে put "X | x || x ← মাইসেট, 3 | এক্স}" পার্স করার তাদের উদাহরণ সম্পর্কে, আমি জিএলআরকে ঠিকঠাক করব এবং এটির জন্য স্পেসের প্রয়োজন নেই।
ইরা বাক্সটার

0

দেখে মনে হচ্ছে যে জিসিসি এবং এলএলভিএম-ক্ল্যাং হস্তাক্ষর রিকার্সিভ ডেসেন্ট পার্সার ব্যবহার করছে, এবং মেশিন দ্বারা উত্পাদিত নয়, বাইসন-ফ্লেক্স ভিত্তিক, নীচে আপ পার্সিং করছে।

বাইসন বিশেষত আমি মনে করি না যে কিছু বিষয় অস্পষ্টভাবে পার্স করা এবং পরে দ্বিতীয় পাস না করে ব্যাকরণ পরিচালনা করতে পারে।

আমি জানি হাস্কেলের হ্যাপি মোনাডিক (অর্থাত্ রাজ্য-নির্ভর) পার্সারদের অনুমতি দেয় যা সি সিনট্যাক্সের সাহায্যে নির্দিষ্ট সমস্যাটি সমাধান করতে পারে তবে আমি কোনও সি পার্সার জেনারেটর সম্পর্কে জানি না যা কোনও ব্যবহারকারী-সরবরাহকারী রাষ্ট্র মোনাডকে অনুমতি দেয়।

তত্ত্ব অনুসারে, ত্রুটি পুনরুদ্ধার হস্তাক্ষর লিখিত পার্সারের পক্ষে হবে তবে আমার জিসিসি / ক্ল্যাংয়ের সাথে অভিজ্ঞতাটি হয়েছে যে ত্রুটি বার্তাগুলি বিশেষত ভাল নয়।

পারফরম্যান্সের জন্য - কিছু দাবি অসম্পূর্ণ বলে মনে হচ্ছে। পার্সার জেনারেটর ব্যবহার করে একটি বড় রাষ্ট্রের মেশিন তৈরি করার ফলে এমন কিছু ঘটতে হবে O(n)এবং আমি সন্দেহ করি পার্সিং অনেক বেশি সরঞ্জামের ক্ষেত্রে বাধা।


4
এই প্রশ্নের ইতিমধ্যে একটি খুব উচ্চ মানের উত্তর রয়েছে, আপনি কী যুক্ত করার চেষ্টা করছেন?
টড করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.