L + (1) পার্সার দিয়ে সি ++ কেন পার্স করা যায় না?


153

আমি পার্সার এবং পার্সার জেনারেটর সম্পর্কে পড়ছিলাম এবং এই বিবৃতিটি উইকিপিডিয়ায় এলআর পার্সিং-পৃষ্ঠাতে পেয়েছি:

অনেকগুলি প্রোগ্রামিং ল্যাঙ্গুয়েজে এলআর পার্সারের কিছু প্রকরণ ব্যবহার করে পার্স করা যায়। একটি উল্লেখযোগ্য ব্যতিক্রম সি ++।

এটা এমন কেন? সি ++ এর কোন বিশেষ সম্পত্তি এলআর পার্সারগুলির সাথে পার্স করা অসম্ভব হয়ে পড়ে?

গুগল ব্যবহার করে, আমি কেবল দেখতে পেয়েছি যে সি সম্পূর্ণরূপে এলআর (1) দিয়ে পার্স করা যায় তবে সি ++ এর জন্য এলআর (∞) প্রয়োজন।


7
ঠিক যেমন: পুনরাবৃত্তি শিখতে আপনাকে পুনরাবৃত্তি বুঝতে হবে ;-)।
টুন ক্রিজিথ

5
"একবার আপনি এই বাক্যাংশটিকে বিশ্লেষণ করলে পার্সারগুলি বুঝতে পারবেন" "
ইলিয়া n।

উত্তর:


92

সেখানে একটি আকর্ষণীয় থ্রেড হয় ল্যামডা আলটিমেট যে আলোচনা করা হয়েছে সি ++ জন্য LALR ব্যাকরণ

এটি পিএইচডি থিসিসের একটি লিঙ্ক অন্তর্ভুক্ত করে যা সি ++ পার্সিংয়ের আলোচনা অন্তর্ভুক্ত করে, যা বলে যে:

"সি ++ ব্যাকরণ অস্পষ্ট, প্রাসঙ্গিক-নির্ভর এবং কিছু অস্পষ্টতা সমাধানের জন্য সম্ভাব্যভাবে অসীম চেহারা প্রয়োজন"।

এটি বেশ কয়েকটি উদাহরণ দেয় (পিডিএফের 147 পৃষ্ঠা দেখুন)।

উদাহরণটি হ'ল:

int(x), y, *const z;

অর্থ

int x;
int y;
int *const z;

তুলনা করা:

int(x), y, new int;

অর্থ

(int(x)), (y), (new int));

(কমা-বিচ্ছিন্ন অভিব্যক্তি)।

দুটি টোকেন সিকোয়েন্সগুলিতে একই প্রাথমিক অনুচ্ছেদ রয়েছে তবে বিভিন্ন পার্স গাছ রয়েছে, যা শেষ উপাদানটির উপর নির্ভর করে। এটিকে নিরবচ্ছিন্ন করার আগে ইচ্ছামত অনেকগুলি টোকেন থাকতে পারে।


29
এই পৃষ্ঠায় 147 পৃষ্ঠাটি সম্পর্কে কিছু সংক্ষিপ্ত বিবরণ পাওয়া ভাল হবে d আমি যদিও এই পৃষ্ঠাটি পড়তে যাচ্ছি। (+1)
উত্সাহিত করুন

11
উদাহরণটি হ'ল: int (x), y, * const z; // অর্থ: অন্তর্নির্মিত x; int y; int * const z; (ঘোষণার ক্রম) int (x), y, নতুন ইনট; // অর্থ: (int (x)), (y), (new int)); (একটি কমা-বিচ্ছিন্ন অভিব্যক্তি) দুটি টোকেন সিকোয়েন্সগুলির একই প্রাথমিক অনুচ্ছেদ কিন্তু বিভিন্ন পার্স গাছ রয়েছে, যা শেষ উপাদানটির উপর নির্ভর করে। এটিকে নিরবচ্ছিন্ন করার আগে ইচ্ছামত অনেকগুলি টোকেন থাকতে পারে।
ব্লেজারব্ল্যাড

6
ঠিক আছে, সেই প্রসঙ্গে ∞ এর অর্থ "নির্বিচারে অনেকগুলি" কারণ চেহারাটি সর্বদা ইনপুট দৈর্ঘ্যের দ্বারা আবদ্ধ থাকে।
মৌগানআআআআ

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

231

এলআর পার্সাররা ডিজাইনের সাহায্যে দ্ব্যর্থতার ব্যাকরণ নিয়মগুলি পরিচালনা করতে পারে না। (১৯ 1970০ এর দশকে যখন ধারণাগুলি তৈরি করা হচ্ছিল তখন তত্ত্বটি আরও সহজ করে তুলেছিল)।

সি এবং সি ++ উভয়ই নিম্নলিখিত বিবৃতিটির অনুমতি দেয়:

x * y ;

এর দুটি পৃথক পার্স রয়েছে:

  1. এটি এক্স টাইপের নির্দেশক হিসাবে y এর ঘোষণা হতে পারে
  2. এটি এক্স এবং y এর গুণক হতে পারে, উত্তরটি ফেলে দেয়।

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

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

সুতরাং খাঁটি এলআর পার্সিং এটি পরিচালনা করতে পারে না। বা অ্যান্টলার, জাভাসিসি, ওয়াইএসিসি, বা traditionalতিহ্যবাহী বাইসন, এমনকি পিইজি-স্টাইলের পার্সারগুলির মতো, "বিশুদ্ধ" উপায়ে ব্যবহার করা যেতে পারে না এমন অনেকগুলি বহুল পরিমাণে পার্সার জেনারেটরও পাওয়া যায় না।

আরও অনেক জটিল কেস রয়েছে (টেমপ্লেট সিনট্যাক্সকে পার্সিংয়ের জন্য স্বেচ্ছাসেবীর চেহারা আবশ্যক, যেখানে এলএলআর (কে) বেশিরভাগ কে টোকেনের দিকে এগিয়ে যেতে পারে), তবে খাঁটি এলআর (বা অন্যদের) পার্সিংয়ের জন্য কেবলমাত্র একটি পাল্টা নমুনা লাগে ।

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

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

এবং যদি আপনি যথেষ্ট প্রতারণা করেন তবে আপনি এল আর পার্সারগুলিকে সি এবং সি ++ এর জন্য কাজ করতে পারেন। জিসিসি ছেলেরা কিছুক্ষণের জন্য করেছিল, কিন্তু হ্যান্ড-কোডেড পার্সিংয়ের জন্য এটি ছেড়ে দিয়েছে, আমি মনে করি কারণ তারা আরও ভাল ত্রুটি নির্ণয়ের চেয়েছিল wanted

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

আমরা এই প্রযুক্তিটি আমাদের ডিএমএস সফটওয়্যার পুনর্বিবেচনা টুকিটের জন্য সি এবং সি ++ সামনের প্রান্তে ব্যবহার করি (জুন ২০১ 2017 পর্যন্ত এই এমএস এবং জিএনইউ উপভাষায় পুরো সি ++ 17 হ্যান্ডেল করে)। এগুলি সোর্স কোডের সম্পূর্ণ বিবরণ সহ সম্পূর্ণ, সুনির্দিষ্ট পার্সগুলি এএসটি উত্পাদন করে কয়েক মিলিয়ন লম্বা সি এবং সি ++ সিস্টেমের প্রক্রিয়াজাতকরণে ব্যবহৃত হয়েছে। ( সি ++ এর সর্বাধিক ভেক্সিং পার্সের জন্য এএসটি দেখুন ))


11
যদিও 'x * y' উদাহরণ আকর্ষণীয়, সি তেও এটি ঘটতে পারে ('y' টাইপডেফ বা পরিবর্তনশীল হতে পারে)। তবে সি একটি এলআর (1) পার্সার দ্বারা পার্স করা যায়, তাই সি ++ এর সাথে পার্থক্য কী?
মার্টিন কোট

12
আমার উত্তরকর্তা ইতিমধ্যে পর্যবেক্ষণ করেছেন যে সি একই সমস্যা ছিল, আমি মনে করি আপনি এটি মিস করেছেন। না, একই কারণে এটি এলআর (1) দ্বারা পার্স করা যাবে না। এর, আপনি কী বোঝাতে চাইছেন যে আপনি 'ওয়াই' টাইপেইফ হতে পারেন? সম্ভবত আপনি 'এক্স' বলতে চাইছেন? এটি কিছুই পরিবর্তন করে না।
ইরা বাক্সটার

6
পার্স 2 সি -++ এ অগত্যা বোকামি নয়, কারণ * এর পার্শ্ব প্রতিক্রিয়াগুলি ওভাররাইড করা যেতে পারে।
ডোর হাই আর্চ

8
আমি তাকিয়ে দেখলাম x * yএবং অবাক হয়ে গেছে - আশ্চর্যজনক যে কেউ এইরকম নিফ্ট সামান্য অস্পষ্টতাকে কীভাবে ভাবেন।
new123456

51
@ অ্যাল্টি নিশ্চয়ই কোনও স্ট্রিমে বেশিরভাগ পরিবর্তনশীল প্রকারগুলি লিখতে বাধ্য করার জন্য কোনও বিট-শিফট অপারেটরকে ওভারলোড করবে না?
ট্রয় ড্যানিয়েলস

16

সমস্যাটি কখনই এর মতো সংজ্ঞায়িত হয় না, তবে এটি আকর্ষণীয় হওয়া উচিত:

সি ++ ব্যাকরণে সংক্ষিপ্ততম সংক্ষিপ্ত সেটটি কী যা প্রয়োজনীয় হবে যাতে এই নতুন ব্যাকরণটি একটি "অ-প্রসঙ্গ-মুক্ত" ইয়্যাক পার্সার দ্বারা পুরোপুরি পার্স করা যায়? (কেবলমাত্র একটি 'হ্যাক' ব্যবহার করে: টাইপনেম / আইডেন্টিফায়ার বিড়ম্বনা, পার্সার প্রতিটি টাইপডেফ / শ্রেণি / কাঠামোর লেক্সারকে অবহিত করে)

আমি কয়েকটি দেখতে পাচ্ছি:

  1. Type Type;নিষিদ্ধ. টাইপনেম হিসাবে ঘোষিত একটি সনাক্তকারী একটি নন-টাইপনেম সনাক্তকারী হয়ে উঠতে পারে না (নোটটি যেটি struct Type Typeদ্ব্যর্থক নয় এবং এখনও অনুমোদিত হতে পারে)।

    এখানে 3 ধরণের রয়েছে names tokens:

    • types : বিল্টিন-টাইপ বা কোনও টাইপফ / শ্রেণি / কাঠামোর কারণে
    • টেমপ্লেট-ফাংশন
    • সনাক্তকারী: ফাংশন / পদ্ধতি এবং ভেরিয়েবল / অবজেক্ট

    বিভিন্ন টোকেন হিসাবে টেমপ্লেট-ফাংশন বিবেচনা করা func<অস্পষ্টতা সমাধান করে । যদি funcকোনও টেম্পলেট-ফাংশন নাম হয় তবে <অবশ্যই একটি টেম্পলেট প্যারামিটার তালিকার শুরু হতে হবে, অন্যথায় funcএকটি ফাংশন পয়েন্টার এবং <এটি তুলনা অপারেটর।

  2. Type a(2);একটি অবজেক্ট ইনস্ট্যান্টেশন। Type a();এবং Type a(int)ফাংশন প্রোটোটাইপ হয়।

  3. int (k); সম্পূর্ণ নিষিদ্ধ, লেখা উচিত int k;

  4. typedef int func_type(); এবং typedef int (func_type)();নিষিদ্ধ করা হয়।

    একটি ফাংশন টাইপইফ অবশ্যই একটি ফাংশন পয়েন্টার টাইপডেফ হতে হবে: typedef int (*func_ptr_type)();

  5. টেমপ্লেট পুনরাবৃত্তি 1024 এর মধ্যে সীমাবদ্ধ, অন্যথায় বর্ধিত সর্বাধিক সংকলকটির বিকল্প হিসাবে পাস করা যেতে পারে।

  6. int a,b,c[9],*d,(*f)(), (*g)()[9], h(char); দ্বারা প্রতিস্থাপিতও নিষিদ্ধ হতে পারে int a,b,c[9],*d; int (*f)();

    int (*g)()[9];

    int h(char);

    ফাংশন প্রোটোটাইপ বা ফাংশন পয়েন্টার ঘোষণা প্রতি এক লাইন।

    একটি অত্যন্ত পছন্দসই বিকল্প হ'ল ভয়ঙ্কর ফাংশন পয়েন্টার সিনট্যাক্স পরিবর্তন করা,

    int (MyClass::*MethodPtr)(char*);

    পুনরায় সংক্ষিপ্তকরণ হিসাবে:

    int (MyClass::*)(char*) MethodPtr;

    এটি কাস্ট অপারেটরের সাথে সামঞ্জস্যপূর্ণ (int (MyClass::*)(char*))

  7. typedef int type, *type_ptr; নিষিদ্ধও হতে পারে: টাইপডেফ প্রতি এক লাইন। সুতরাং এটি হয়ে যাবে

    typedef int type;

    typedef int *type_ptr;

  8. sizeof int, sizeof char, sizeof long longএবং সহ। প্রতিটি উত্স ফাইলে ঘোষিত হতে পারে। সুতরাং, প্রকারের প্রতিটি উত্স ফাইল তৈরির intশুরু হওয়া উচিত

    #type int : signed_integer(4)

    এবং unsigned_integer(4)সেই #type নির্দেশের বাইরে নিষিদ্ধ করা হবে এটি এতগুলি sizeof intসি ++ শিরোলেখগুলিতে উপস্থিত বোকা অস্পষ্টতার বড় পদক্ষেপ হবে

সংমিশ্রিত সি ++ প্রয়োগকারী সংকলকটি যদি দ্বিপাক্ষিক সিনট্যাক্স ব্যবহার করে কোনও সি ++ উত্সের মুখোমুখি হয় তবে source.cppখুব বেশি একটি ambiguous_syntaxফোল্ডার সরিয়ে নিয়ে স্বয়ংক্রিয়ভাবে একটি দ্ব্যর্থহীন অনুবাদ তৈরি করবেsource.cpp সংকলনের আগে এটি করে।

আপনি যদি কিছু জানেন তবে দয়া করে আপনার অস্পষ্ট সি ++ সিনট্যাক্স যুক্ত করুন!


3
সি ++ খুব ভাল আবদ্ধ। বাস্তবে কেউ এটি করবে না। যে সকল লোকেরা (আমাদের মতো) সামনে তৈরি হয় কেবলমাত্র বুলেট কামড়ায় এবং পার্সারদের কাজ করার জন্য ইঞ্জিনিয়ারিং করে। এবং ভাষাটিতে টেমপ্লেটগুলি যতক্ষণ বিদ্যমান, আপনি খাঁটি প্রসঙ্গ-মুক্ত পার্সার পাবেন না।
ইরা বাক্সার

9

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


3
পার্সিং প্রযুক্তি যা দ্ব্যর্থহীনতা পরিচালনা করে কেবল এএসটি উভয় রূপই পার্স করার সাথে সাথে উত্পাদন করে এবং প্রকার তথ্যের উপর নির্ভর করে ভুলটিকে কেবল মুছে দেয়।
ইরা বাক্সার 16

@ ইরা: হ্যাঁ, এটি সঠিক। এর বিশেষ সুবিধা এটি আপনাকে প্রথম পর্যায়ে পার্সের বিভাজন বজায় রাখতে সহায়তা করে allows যদিও এটি জিএলআর পার্সারে সর্বাধিক পরিচিত, সেখানে কোনও নির্দিষ্ট কারণ নেই যা আমি দেখতে পেয়েছি যে আপনি "জিএলএল" দিয়ে সি ++ টি আঘাত করতে পারেন নি? পাশাপাশি পার্সার।
স্যাম হারওয়েল

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

রাস্কাল প্রকল্প (নেদারল্যান্ডস) দাবি করছে যে তারা একটি স্ক্যানারহীন জিএলএল পার্সার তৈরি করছে। কাজ চলছে, কোনও অনলাইন তথ্য খুঁজে পাওয়া শক্ত হতে পারে। en.wikedia.org/wiki/RacalMPL
ইরা

@IraBaxter আছে GLL উপর নতুন উন্নয়ন হবে বলে মনে হয়: GLL সম্পর্কে এই 2010 কাগজ দেখতে dotat.at/tmp/gll.pdf
Sjoerd

6

আমি মনে করি আপনি উত্তরের খুব কাছাকাছি আছেন।

এলআর (1) এর অর্থ বাম থেকে ডানে পার্সিংয়ের প্রসঙ্গে সন্ধানের জন্য কেবলমাত্র একটি টোকেন প্রয়োজন, অন্যদিকে এলআর (∞) মানে অসীম চেহারা look অর্থাৎ, পার্সারকে এখন কোথায় রয়েছে তা নির্ধারণ করার জন্য যা ঘটছিল তা জানতে হবে।


4
আমি আমার সংকলক শ্রেণীর কাছ থেকে স্মরণ করি যে এন> 0 এর জন্য এলআর (এন) গাণিতিকভাবে এলআর (1) এ হ্রাসযোগ্য। এটি কি এন = অনন্তের জন্য সত্য নয়?
rmeador

14
না, এন এবং অনন্তের মধ্যে পার্থক্যের এক দুর্গম পর্বত রয়েছে।
মুহুর্ত

4
উত্তরটি কি নয়: হ্যাঁ, অসীম সময় দেওয়া হয়েছে? :)
স্টিভ 15

7
আসলে, এলআর (এন) -> এলআর (1) কীভাবে সংঘটিত হয় তার আমার অস্পষ্ট স্মৃতি অনুসারে এটি নতুন অন্তর্বর্তী রাষ্ট্রগুলি তৈরি করা জড়িত, তাই রানটাইমটি 'এন' এর কিছু অ স্থির ফাংশন। LR (inf) -> LR (1) অনুবাদ করতে অসীম সময় লাগবে।
হারুন

5
"উত্তরটি কি নয়: হ্যাঁ, অসীম সময় দেওয়া হয়েছে?" - না: "অসীম সময় দেওয়া হয়েছে" এই বাক্যটি কেবল একটি সংবেদনশীল, সংক্ষিপ্ত হাতে বলা "কোনও নির্দিষ্ট সীমাবদ্ধ সময় দেওয়া যায় না" of আপনি যখন "অসীম" দেখেন, ভাবুন: "কোনও সীমাবদ্ধ নয়"।
ক্রিসডাব্লু

4

সি ++ এ "টাইপিডেফ" সমস্যাটি একটি এলএলআর (1) পার্সার দিয়ে পার্স করা যায় যা পার্সিংয়ের সময় প্রতীক টেবিল তৈরি করে (খাঁটি এলএলআর পার্সার নয়)। "টেমপ্লেট" সমস্যাটি সম্ভবত এই পদ্ধতিতে সমাধান করা যায় না। এই জাতীয় LALR (1) পার্সারের সুবিধা হ'ল ব্যাকরণ (নীচে দেখানো হয়েছে) হল একটি এলএলআর (1) ব্যাকরণ (কোনও অস্পষ্টতা নেই)।

/* C Typedef Solution. */

/* Terminal Declarations. */

   <identifier> => lookup();  /* Symbol table lookup. */

/* Rules. */

   Goal        -> [Declaration]... <eof>               +> goal_

   Declaration -> Type... VarList ';'                  +> decl_
               -> typedef Type... TypeVarList ';'      +> typedecl_

   VarList     -> Var /','...     
   TypeVarList -> TypeVar /','...

   Var         -> [Ptr]... Identifier 
   TypeVar     -> [Ptr]... TypeIdentifier                               

   Identifier     -> <identifier>       +> identifier_(1)      
   TypeIdentifier -> <identifier>      =+> typedefidentifier_(1,{typedef})

// The above line will assign {typedef} to the <identifier>,  
// because {typedef} is the second argument of the action typeidentifier_(). 
// This handles the context-sensitive feature of the C++ language.

   Ptr          -> '*'                  +> ptr_

   Type         -> char                 +> type_(1)
                -> int                  +> type_(1)
                -> short                +> type_(1)
                -> unsigned             +> type_(1)
                -> {typedef}            +> type_(1)

/* End Of Grammar. */

নিম্নলিখিত ইনপুটটি সমস্যা ছাড়াই পার্স করা যায়:

 typedef int x;
 x * y;

 typedef unsigned int uint, *uintptr;
 uint    a, b, c;
 uintptr p, q, r;

LRSTAR পার্সার জেনারেটর উপরে ব্যাকরণ স্বরলিপি লেখা এবং পার্সার উত্পন্ন যে হ্যান্ডলগুলি পার্স গাছ বা এবং AST মধ্যে অস্পষ্টতা ছাড়া "হয় typedef" সমস্যা। (প্রকাশ: আমিই সেই লোক, যিনি এলআরএসটিআর তৈরি করেছিলেন))


"এক্স * ওয়াই" এর মতো জিনিসের অস্পষ্টতা পরিচালনা করতে এর প্রাক্তন এলআর পার্সার দিয়ে জিসিসি ব্যবহার করা স্ট্যান্ডার্ড হ্যাক; হায়, অন্য নির্মাণগুলি পার্স করার জন্য নির্বিচারে বৃহত চেহারাগুলির প্রয়োজনীয়তা রয়েছে, সুতরাং এলআর (কে) কোনও স্থির সমাধানের সমাধান হতে ব্যর্থ। (জিসিসি আরও বিজ্ঞাপন হকারির সাথে পুনরাবৃত্তির উত্সে স্যুইচ করেছে)।
ইরা বাক্সটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.