অ্যান্টেলারের সুবিধা (বনাম বলুন, লেক্স / ইয়্যাক / বাইসন) [বন্ধ]


143

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

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

উত্তর:


145

আপডেট / সতর্কতা: এই উত্তরটি পুরানো হতে পারে!


একটি প্রধান পার্থক্য হ'ল এএনটিএলআর একটি এলএল (*) পার্সার জেনারেট করে, যেখানে ওয়াইএসিসি এবং বাইসন উভয়ই পার্সার তৈরি করে যা এলএলআর are এটি বেশ কয়েকটি অ্যাপ্লিকেশনগুলির মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য, সর্বাধিক সুস্পষ্ট অপারেটর:

expr ::= expr '+' expr
       | expr '-' expr
       | '(' expr ')'
       | NUM ;

এএনটিএলআর হ'ল এই ব্যাকরণটি পরিচালনা করতে পুরোপুরি অক্ষম। এএনটিএলআর (বা অন্য কোনও এলএল পার্সার জেনারেটর) ব্যবহার করার জন্য, আপনাকে এই ব্যাকরণটিকে এমন কিছুতে রূপান্তর করতে হবে যা বাম-রিকার্সিভ নয়। তবে বাইসনের এই ফর্মের ব্যাকরণ নিয়ে কোনও সমস্যা নেই। আপনাকে '+' এবং '-' বাম-সহযোগী অপারেটর হিসাবে ঘোষণা করতে হবে, তবে বাম পুনরাবৃত্তির জন্য এটি কঠোরভাবে প্রয়োজন হয় না। আরও ভাল উদাহরণ প্রেরণ হতে পারে:

expr ::= expr '.' ID '(' actuals ')' ;

actuals ::= actuals ',' expr | expr ;

লক্ষ্য করুন যে exprএবং actualsবিধিগুলি উভয়ই বাম-পুনরাবৃত্ত হয়। কোড তৈরির সময় এলে এটি অনেক বেশি দক্ষ এএসটি উত্পাদন করে কারণ এটি একাধিক নিবন্ধক এবং অপ্রয়োজনীয় স্পিলিংয়ের প্রয়োজনীয়তা এড়িয়ে যায় (বাম দিকে ঝুঁকে পড়া গাছটি ভেঙে দেওয়া যেতে পারে যেখানে ডান দিকে ঝুঁকানো গাছই পারে না)।

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


2
সুতরাং অ্যান্টলারের বড়, সম্ভবত একক, আপনার উপলব্ধিতে সুবিধা হ'ল এটি নির্মাণ পর্যায়ে এসআর এবং আরআরের মতো কম ত্রুটি তৈরি করে? আমি আশা করি আমি চেষ্টা করে দেখব তবে সম্ভবত আমি যা জানি তার সাথে লেগে থাকবে ...
ডন ওয়েকফিল্ড

1
হ্যাঁ, এটি অনেক বেশি। :-) আমি বাইসনের চেয়ে এএনটিএলআর সহজ, এই জনপ্রিয় মতামতের সাথে সত্যই একমত নই, সুতরাং আমি মনে করি যে আমি আপনার সিদ্ধান্তের সাথে একমত হব।
ড্যানিয়েল স্পিওক

2
সরল 'এক্সপ্রেস' একটি আসল কিনা তা বোঝাতে কি 'অ্যাকুয়াল্টস' বিধিটির জন্য দ্বিতীয় নিয়মের দরকার আছে? অন্যথায়, দুর্দান্ত ব্যাখ্যা।
জোনাথন লেফলার

8
আমি আরও একটি মন্তব্য সম্প্রতি পেয়েছি, যদিও এক দশক পুরানো, আউটপুটটির একটি যুক্তিসঙ্গত পর্যবেক্ষণ করে : compilers.iecc.com/compark/article/98-11-040 : "এএনটিএলআর / পিসিসিটিএস এলএল যা ব্যাকরণকে আরও জটিল করে তোলে, কিন্তু জেনারেটড কোডটি পঠনযোগ্য।
ডন ওয়েকফিল্ড

72
আমি এএনটিএলআর পরবর্তী রিলিজ v3.4 এর জন্য অবিলম্বে বাম-পুনরাবৃত্তি সমর্থন সম্পন্ন করেছি। সিআর ডিক্লেয়ারের নিয়মের মতো এলআর এক্সপ্রেশন বিধি এবং অনুরূপ স্টাফ পরিচালনা করে। :)
টেরেন্স পারর

117

ওয়াইএসিসি / বাইসন এবং এএনটিএলআরের মধ্যে সর্বাধিক উল্লেখযোগ্য পার্থক্য হ'ল এই সরঞ্জামগুলি কীভাবে ব্যাকরণে প্রক্রিয়া করতে পারে is ওয়াইএসিসি / বাইসন হ্যান্ডেল এলএলআর ব্যাকরণ, এএনটিএলআর এলএল ব্যাকরণগুলি পরিচালনা করে।

প্রায়শই, যে ব্যক্তিরা দীর্ঘকাল ধরে এলএলআর ব্যাকরণ নিয়ে কাজ করেছেন, তারা এলএল ব্যাকরণ নিয়ে কাজ করা আরও কঠিন এবং বিপরীতে দেখতে পাবেন। এর অর্থ এই নয় যে ব্যাকরণ বা সরঞ্জামগুলি সহ কাজ করা সহজাতভাবে আরও বেশি কঠিন। আপনি কোন সরঞ্জামটি ব্যবহার করতে সহজ মনে করেন তা বেশিরভাগ ব্যাকরণের প্রকারের সাথে পরিচিত হবে।

সুবিধাগুলি যতদূর যায়, এলএলআর ব্যাকরণগুলির তুলনায় এলএলআর ব্যাকরণগুলির সুবিধাগুলি রয়েছে এবং অন্যান্য দিক রয়েছে যেখানে এলএলআর ব্যাকরণগুলির তুলনায় এলএল ব্যাকরণের সুবিধা রয়েছে।

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

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

এএনটিএলআর উত্পাদিত পার্সারগুলি সাধারণত 10.000 লাইন কোডের লাইন এবং আরও অনেক কিছুতে থাকে। হস্তাক্ষর রিকার্সি ডেসটেন্ট পার্সারগুলি প্রায়শই একই বলপার্কে থাকে। উইথের ওবেরন সংকলক সম্ভবত কোড উত্পাদন সহ প্রায় 4000 লাইনের কোড সহ সর্বাধিক কমপ্যাক্ট, তবে ওবেরন একটি প্রায় কমপ্যাক্ট ভাষা যার মধ্যে প্রায় 40 উত্পাদন নিয়ম রয়েছে।

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

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


4
এটি পছন্দ করুন কারণ এটি বিভিন্ন ব্যবস্থার পিছনে ইতিহাস ব্যাখ্যা করে যা মানুষকে উদ্দেশ্যমূলকভাবে বোঝায়
জিংক করছে

35

এএনটিএলআরের জন্য কয়েকটি সুবিধা:

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

আমার .02 $


9

এএনটিআরএল-এর আর একটি সুবিধা হ'ল আপনি এএনটিএলআরওয়র্কস ব্যবহার করতে পারেন , যদিও আমি এটি বলতে পারি না যে এটি একটি কঠোর সুবিধা, কারণ অন্যান্য জেনারেটরের জন্যও একই রকম সরঞ্জাম থাকতে পারে।


9
  • বাইসন এবং ফ্লেক্সের ফলে ছোট মেমরির পদচিহ্ন ছড়িয়ে যায় তবে আপনার কোনও গ্রাফিকাল আইডিই নেই।
  • antlr আরও মেমরি ব্যবহার করে তবে আপনার অ্যান্টলকার্কস রয়েছে, একটি গ্রাফিকাল আইডিই।

বাইসন / ফ্লেক্স মেমরির ব্যবহার সাধারণত একটি এমবাইট বা তাই। এন্টলারের সাথে এর বিপরীতে - ধরে নিলে আপনি যে ফাইলটি পার্স করতে চান তাতে প্রতিটি টোকেনের জন্য এটি 512 বাইট মেমরি ব্যবহার করে। 4 মিলিয়ন টোকেন এবং আপনি 32-বিট সিস্টেমে ভার্চুয়াল মেমরির বাইরে।

যদি আপনি যে ফাইলটি বিশ্লেষণ করতে চান সেটি যদি বড় হয় তবে অ্যান্ট্রিলের মেমরি শেষ হয়ে যায়, সুতরাং আপনি যদি কোনও কনফিগারেশন ফাইলকে বিশ্লেষণ করতে চান তবে এটি একটি কার্যকর সমাধান হবে। অন্যথায়, আপনি যদি প্রচুর ডেটা সহ কোনও ফাইলকে বিশ্লেষণ করতে চান তবে বাইসনটি ব্যবহার করে দেখুন।


7
আমি কৌতুহলী. আপনি কি টোকেন প্রতি 512 বাইট মেমরির খরচ বর্ণনা করে ডকুমেন্টেশন নির্দেশ করতে পারেন? সেই আলোচনা দেখে আমার মনে নেই। আমার গুগল কীওয়ার্ডগুলির পছন্দটি আমাকে সন্তুষ্টিও দিচ্ছে না ...
ডন ওয়েকফিল্ড

2
পার্সার তৈরি করার সময় আপনি কি পার্সার জেনারেটরের মেমরি পদচিহ্নের কথা বলছেন, বা উত্স ভাষার জন্য ইনপুট পার্সিং করার সময় আপনি উত্পন্ন পার্সারের মেমরি পদক্ষেপের কথা বলছেন? একটি ব্যাকরণে লক্ষ লক্ষ টোকেন একেবারে উন্মাদ হবে। আপনি যদি এই জাতীয় ধারণাটি গুরুত্বের সাথে বিক্রির চেষ্টা করেন তবে আপনাকে কোনও মানসিক প্রতিষ্ঠানে আটকে রাখা উচিত। পার্সার নিজেই ইনপুট ফাইলগুলির ক্ষেত্রে, এমন কেস থাকতে পারে যেখানে এগুলিতে খুব বেশি সংখ্যক টোকেন থাকতে পারে তবে বেশিরভাগ ভাষাগুলি মডিউলার হয়, আপনি কোনও একক ফাইলে পুরো ইনপুটটি বিশ্লেষণ করেন না, পৃথক মডিউলগুলি আরও ছোট।
trijezdci
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.