এলএল এবং এলআর পার্সিংয়ের মধ্যে পার্থক্য কী?


225

এলআর পার্সিং বনাম এলআর পার্সিংয়ের একটি সহজ উদাহরণ আমাকে কেউ দিতে পারেন?

উত্তর:


483

একটি উচ্চ স্তরে, এলএল পার্সিং এবং এলআর পার্সিংয়ের মধ্যে পার্থক্যটি হ'ল এলএল পার্সারগুলি শুরু চিহ্ন থেকে শুরু হয় এবং লক্ষ্য স্ট্রিংয়ে পৌঁছানোর জন্য প্রযোজনাগুলি প্রয়োগ করার চেষ্টা করে, যেখানে এলআর পার্সারগুলি লক্ষ্য স্ট্রিংয়ে শুরু হয় এবং শুরুতে ফিরে আসার চেষ্টা করে প্রতীক।

একটি এলএল পার্স হ'ল একটি বাম থেকে ডান, বাম দিকের উত্স ation এটি হ'ল আমরা বাম থেকে ডানে ইনপুট প্রতীক বিবেচনা করি এবং বাম দিকের ডেরাইভেশন নির্মাণের চেষ্টা করি। এটি শুরুর প্রতীকটি দিয়ে শুরু করে এবং টার্গেটের স্ট্রিংয়ে না পৌঁছা পর্যন্ত বারবার বাম দিকের অরক্ষীয় বাহ্যকে প্রসারিত করেই করা হয়। একটি এলআর পার্স হ'ল একটি বাম থেকে ডান, ডানদিকের ডেরাইভেশন, যার অর্থ আমরা বাম থেকে ডানে স্ক্যান করি এবং ডানদিকের ডেরাইভেশন তৈরির চেষ্টা করি। পার্সার অবিচ্ছিন্নভাবে ইনপুটটির একটি স্ট্রিং বাছাই করে এবং এটিকে আবার একটি অযৌক্তিকর দিকে ফেরানোর চেষ্টা করে।

এলএল পার্স করার সময়, পার্সার অবিচ্ছিন্নভাবে দুটি ক্রমের মধ্যে নির্বাচন করে:

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

উদাহরণস্বরূপ, এই ব্যাকরণ দেওয়া:

  • এস → ই
  • E → T + E
  • E → T
  • টি int

তারপরে স্ট্রিংটি দেওয়া হলে int + int + intএকটি এলএল (2) পার্সার (যা দুটি টোকেন লুকোহেড ব্যবহার করে) নীচে স্ট্রিংটিকে পার্স করবে:

Production       Input              Action
---------------------------------------------------------
S                int + int + int    Predict S -> E
E                int + int + int    Predict E -> T + E
T + E            int + int + int    Predict T -> int
int + E          int + int + int    Match int
+ E              + int + int        Match +
E                int + int          Predict E -> T + E
T + E            int + int          Predict T -> int
int + E          int + int          Match int
+ E              + int              Match +
E                int                Predict E -> T
T                int                Predict T -> int
int              int                Match int
                                    Accept

লক্ষ্য করুন যে প্রতিটি পদক্ষেপে আমরা আমাদের উত্পাদনের সবচেয়ে বাম প্রতীকটি দেখি। এটি যদি টার্মিনাল হয় তবে আমরা এটি মেলে এবং এটি যদি একটি অযৌক্তিক হয় তবে আমরা নিয়মগুলির মধ্যে একটি চয়ন করে এটি কী হতে চলেছে তা অনুমান করি।

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

  1. শিফট : বিবেচনার জন্য বাফারে ইনপুটটির পরবর্তী টোকেন যুক্ত করুন।
  2. হ্রাস করুন : এই বাফারটিতে টার্মিনাল এবং ননটার্মিনালগুলির সংগ্রহকে কোনও উত্পাদনকে উল্টো করে কিছু নন-টার্মিনালে ফিরিয়ে আনুন।

উদাহরণস্বরূপ, একটি এলআর (1) পার্সার (লুকোহেডের এক টোকেন সহ) নীচে একই স্ট্রিংটিকে পার্স করতে পারে:

Workspace        Input              Action
---------------------------------------------------------
                 int + int + int    Shift
int              + int + int        Reduce T -> int
T                + int + int        Shift
T +              int + int          Shift
T + int          + int              Reduce T -> int
T + T            + int              Shift
T + T +          int                Shift
T + T + int                         Reduce T -> int
T + T + T                           Reduce E -> T
T + T + E                           Reduce E -> T + E
T + E                               Reduce E -> T + E
E                                   Reduce S -> E
S                                   Accept

আপনি উল্লিখিত দুটি পার্সিং অ্যালগরিদমগুলির (এলএল এবং এলআর) বিভিন্ন বৈশিষ্ট্য রয়েছে বলে জানা যায়। এলএল পার্সারগুলি হাত দ্বারা লেখার পক্ষে সহজ হতে থাকে তবে তারা এলআর পার্সারদের চেয়ে কম শক্তিশালী এবং এলআর পার্সারদের তুলনায় অনেক ছোট ব্যাকরণের সেট গ্রহণ করে। এলআর পার্সারগুলি অনেক স্বাদে আসে (এলআর (0), এসএলআর (1), এলএলআর (1), এলআর (1), আইইএলআর (1), জিএলআর (0), ইত্যাদি) এবং আরও বেশি শক্তিশালী। তাদের আরও অনেক জটিল থাকে এবং প্রায়শই সর্বদা yaccবা এর মতো সরঞ্জাম দ্বারা উত্পাদিত হয় bison। এলএল পার্সারগুলি অনেক স্বাদেও আসে (এলএল (*) যা ANTLRসরঞ্জাম দ্বারা ব্যবহৃত হয় ), যদিও বাস্তবে এলএল (1) সর্বাধিক-বহুল ব্যবহৃত হয়।

নির্লজ্জ প্লাগ হিসাবে আপনি যদি এলএল এবং এলআর পার্সিং সম্পর্কে আরও জানতে চান তবে আমি কেবল একটি সংকলক কোর্স পড়া শেষ করেছি এবং কোর্স ওয়েবসাইটে পার্সিংয়ের জন্য কিছু হ্যান্ডআউট এবং লেকচার স্লাইড পেয়েছি । আপনি যদি এটি কার্যকর মনে করেন তবে এগুলির যে কোনও একটিতে আমি বিস্তারিত জানাতে পেরে খুশি হব।


40
আপনার বক্তৃতা স্লাইডগুলি অসাধারণ, সহজেই দেখা সবচেয়ে মজার ব্যাখ্যা যা আমি দেখেছি :) এটি এমন এক ধরণের জিনিস যা আসলে আগ্রহগুলি ছড়িয়ে দেয়।
kizzx2

1
আমাকেও স্লাইডগুলিতে মন্তব্য করতে হবে! এখন তাদের সকলের মধ্য দিয়ে যাচ্ছি। অনেক সাহায্য করে! ধন্যবাদ!
কর্নফ্রিজ

সত্যিই স্লাইডগুলিও উপভোগ করছি। আমি মনে করি না আপনি প্রজেক্ট ফাইলগুলির নন-উইন্ডোজ সংস্করণ (এবং পিপি 2 এর জন্য স্ক্যানার.এল ফাইল) পোস্ট করতে পারবেন? :)
এরিক পি।

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

1
দুর্দান্ত সম্পদ! স্লাইড, হ্যান্ডআউট, প্রকল্পগুলি সরবরাহ করার জন্য ধন্যবাদ।
পি। হিঙ্কার

58

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

একটি সমীকরণের বাইনারি ট্রি

+ 1 * 2 3  // Polish (prefix) expression; pre-order traversal.
1 2 3 * +  // Reverse Polish (postfix) expression; post-order traversal.

হাবম্যানের মতে, এটি এলএল এবং এলআর পার্সারগুলির মধ্যে প্রধান পার্থক্য চিত্রিত করে:

এলএল এবং এলআর পার্সারগুলি কীভাবে পরিচালিত হয় তার মধ্যে প্রাথমিক পার্থক্য হ'ল একটি এলএল পার্সার পার্স গাছের প্রাক-অর্ডার ট্র্যাভারসাল আউটপুট দেয় এবং একটি এলআর পার্সার পোস্ট-অর্ডার ট্র্যাভারসাল আউটপুট দেয়।

গভীরতার ব্যাখ্যার জন্য উদাহরণ এবং সিদ্ধান্তগুলি হাবম্যানের নিবন্ধটি পরীক্ষা করে ।


9

এলআর উপরে টপ ডাউন ব্যবহার করে, অন্যদিকে এলআর নীচে আপ পদ্ধতির ব্যবহার করে।

আপনি যদি একটি প্রগতিশীল ভাষা পার্স করেন:

  • এলএল একটি উত্স কোড দেখেছে, এতে ফাংশন রয়েছে, যার মধ্যে প্রকাশ রয়েছে।
  • এলআর এক্সপ্রেশনটি দেখে, যা কার্যের সাথে সম্পর্কিত, যার ফলাফলটি পুরো উত্স।

6

এলআর পার্সিংটি প্রতিবন্ধী হয়, যখন এলআর এর সাথে তুলনা করা হয়। এখানে একটি ব্যাকরণ যা এলএল পার্সার জেনারেটরের জন্য দুঃস্বপ্ন:

Goal           -> (FunctionDef | FunctionDecl)* <eof>                  

FunctionDef    -> TypeSpec FuncName '(' [Arg/','+] ')' '{' '}'       

FunctionDecl   -> TypeSpec FuncName '(' [Arg/','+] ')' ';'            

TypeSpec       -> int        
               -> char '*' '*'                
               -> long                 
               -> short                   

FuncName       -> IDENTIFIER                

Arg            -> TypeSpec ArgName         

ArgName        -> IDENTIFIER 

একটি ফাংশনডিফ দেখতে '' 'অবধি অবধি ফাংশনডেকলের মতো লাগে; বা '{' এর মুখোমুখি।

কোনও এলএল পার্সার একই সাথে দুটি নিয়ম পরিচালনা করতে পারে না, সুতরাং এটি অবশ্যই ফাংশনডিফ বা ফাংশনডেকল বেছে নিতে পারে। তবে কোনটি সঠিক তা জানতে '' '' র সন্ধান করতে হবে; বা '{'। ব্যাকরণ বিশ্লেষণের সময়, চেহারা (কে) অসীম বলে মনে হয়। বিশ্লেষণের সময় এটি সীমাবদ্ধ তবে এটি বড় হতে পারে।

এলআর পার্সারটিকে তাকাতে হবে না, কারণ এটি একই সাথে দুটি নিয়ম পরিচালনা করতে পারে। সুতরাং LALR (1) পার্সার জেনারেটরগুলি সহজেই এই ব্যাকরণটি পরিচালনা করতে পারে।

ইনপুট কোড দেওয়া:

int main (int na, char** arg); 

int main (int na, char** arg) 
{

}

একটি এলআর পার্সার পার্স করতে পারে

int main (int na, char** arg)

কোন 'বি'র মুখোমুখি না হওয়া অবধি কোন বিধিটি স্বীকৃত হচ্ছে তা বিবেচনা ছাড়াই; বা একটি '{'।

একটি এলএল পার্সার 'ইনট' এ স্তব্ধ হয়ে যায় কারণ কোন বিধিটি স্বীকৃত হচ্ছে তা জানতে হবে। অতএব এটি অবশ্যই একটি ''; বা '{'।

এলএল পার্সারদের জন্য অন্যান্য দুঃস্বপ্নটি ব্যাকরণে পুনরাবৃত্তি হয়। বাম পুনরাবৃত্তি ব্যাকরণগুলিতে একটি সাধারণ জিনিস, এলআর পার্সার জেনারেটরের কোনও সমস্যা হয় না, তবে এলএল এটি পরিচালনা করতে পারে না।

সুতরাং আপনাকে আপনার ব্যাকরণগুলি এলএল দিয়ে একটি অপ্রাকৃত উপায়ে লিখতে হবে।


0

বাম সর্বাধিক ডেরাইভেশন উদাহরণ: একটি ব্যাকরণ জি যা প্রসঙ্গমুক্ত, তার উত্পাদন রয়েছে

z → xXY (বিধি: 1) এক্স → ওয়াইবিএক্স (বিধি: 2) ওয়াই বি (নিয়ম: 3) ওয়াই) সি (বিধি: 4)

বাম সর্বাধিক ডেরাইভেশন সহ স্ট্রিং w = 'xcbxbc' গণনা করুন।

z ⇒ xXY (বিধি: 1) ⇒ xYbxY (বিধি: 2) ⇒ xcbxY (বিধি: 4) ⇒ xcbxbY (বিধি: 3) ⇒ xcbxbc (বিধি: 4)


ডান সর্বাধিক ডেরাইভেশন উদাহরণ: কে → একে (বিধি: 1) এ A বি (বিধি: 2)

ডান সর্বাধিক ডেরাইভেশন সহ স্ট্রিং w = 'aababbb' গণনা করুন।

কে ⇒একেকে (বিধি: 1) ⇒একেবি (বিধি: 2) ⇒আকেকেবি (বিধি: 1) ⇒আকএকেবিবি (বিধি: 1) aআকাএকেবিবি (বিধি: 2) a আকাববি (বিধি: 2) ⇒ আবাববি (বিধি: 2)

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