এলআর পার্সিং বনাম এলআর পার্সিংয়ের একটি সহজ উদাহরণ আমাকে কেউ দিতে পারেন?
এলআর পার্সিং বনাম এলআর পার্সিংয়ের একটি সহজ উদাহরণ আমাকে কেউ দিতে পারেন?
উত্তর:
একটি উচ্চ স্তরে, এলএল পার্সিং এবং এলআর পার্সিংয়ের মধ্যে পার্থক্যটি হ'ল এলএল পার্সারগুলি শুরু চিহ্ন থেকে শুরু হয় এবং লক্ষ্য স্ট্রিংয়ে পৌঁছানোর জন্য প্রযোজনাগুলি প্রয়োগ করার চেষ্টা করে, যেখানে এলআর পার্সারগুলি লক্ষ্য স্ট্রিংয়ে শুরু হয় এবং শুরুতে ফিরে আসার চেষ্টা করে প্রতীক।
একটি এলএল পার্স হ'ল একটি বাম থেকে ডান, বাম দিকের উত্স ation এটি হ'ল আমরা বাম থেকে ডানে ইনপুট প্রতীক বিবেচনা করি এবং বাম দিকের ডেরাইভেশন নির্মাণের চেষ্টা করি। এটি শুরুর প্রতীকটি দিয়ে শুরু করে এবং টার্গেটের স্ট্রিংয়ে না পৌঁছা পর্যন্ত বারবার বাম দিকের অরক্ষীয় বাহ্যকে প্রসারিত করেই করা হয়। একটি এলআর পার্স হ'ল একটি বাম থেকে ডান, ডানদিকের ডেরাইভেশন, যার অর্থ আমরা বাম থেকে ডানে স্ক্যান করি এবং ডানদিকের ডেরাইভেশন তৈরির চেষ্টা করি। পার্সার অবিচ্ছিন্নভাবে ইনপুটটির একটি স্ট্রিং বাছাই করে এবং এটিকে আবার একটি অযৌক্তিকর দিকে ফেরানোর চেষ্টা করে।
এলএল পার্স করার সময়, পার্সার অবিচ্ছিন্নভাবে দুটি ক্রমের মধ্যে নির্বাচন করে:
উদাহরণস্বরূপ, এই ব্যাকরণ দেওয়া:
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) পার্সার (লুকোহেডের এক টোকেন সহ) নীচে একই স্ট্রিংটিকে পার্স করতে পারে:
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) সর্বাধিক-বহুল ব্যবহৃত হয়।
নির্লজ্জ প্লাগ হিসাবে আপনি যদি এলএল এবং এলআর পার্সিং সম্পর্কে আরও জানতে চান তবে আমি কেবল একটি সংকলক কোর্স পড়া শেষ করেছি এবং কোর্স ওয়েবসাইটে পার্সিংয়ের জন্য কিছু হ্যান্ডআউট এবং লেকচার স্লাইড পেয়েছি । আপনি যদি এটি কার্যকর মনে করেন তবে এগুলির যে কোনও একটিতে আমি বিস্তারিত জানাতে পেরে খুশি হব।
জোশ হ্যাবারম্যান তার নিবন্ধে এলএল এবং এলআর পার্সিং ডেমিস্টিফাইড দাবি করেছেন যে এলএল পার্সিং সরাসরি পোলিশ নোটেশনের সাথে মেলে , যেখানে এলআর রিভার্স পোলিশ নোটেশনের সাথে মিলে যায় । পিএন এবং আরপিএন এর মধ্যে পার্থক্য হল সমীকরণের বাইনারি গাছকে অনুসরণ করার ক্রম:
+ 1 * 2 3 // Polish (prefix) expression; pre-order traversal.
1 2 3 * + // Reverse Polish (postfix) expression; post-order traversal.
হাবম্যানের মতে, এটি এলএল এবং এলআর পার্সারগুলির মধ্যে প্রধান পার্থক্য চিত্রিত করে:
এলএল এবং এলআর পার্সারগুলি কীভাবে পরিচালিত হয় তার মধ্যে প্রাথমিক পার্থক্য হ'ল একটি এলএল পার্সার পার্স গাছের প্রাক-অর্ডার ট্র্যাভারসাল আউটপুট দেয় এবং একটি এলআর পার্সার পোস্ট-অর্ডার ট্র্যাভারসাল আউটপুট দেয়।
গভীরতার ব্যাখ্যার জন্য উদাহরণ এবং সিদ্ধান্তগুলি হাবম্যানের নিবন্ধটি পরীক্ষা করে ।
এলআর উপরে টপ ডাউন ব্যবহার করে, অন্যদিকে এলআর নীচে আপ পদ্ধতির ব্যবহার করে।
আপনি যদি একটি প্রগতিশীল ভাষা পার্স করেন:
এলআর পার্সিংটি প্রতিবন্ধী হয়, যখন এলআর এর সাথে তুলনা করা হয়। এখানে একটি ব্যাকরণ যা এলএল পার্সার জেনারেটরের জন্য দুঃস্বপ্ন:
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)
কোন 'বি'র মুখোমুখি না হওয়া অবধি কোন বিধিটি স্বীকৃত হচ্ছে তা বিবেচনা ছাড়াই; বা একটি '{'।
একটি এলএল পার্সার 'ইনট' এ স্তব্ধ হয়ে যায় কারণ কোন বিধিটি স্বীকৃত হচ্ছে তা জানতে হবে। অতএব এটি অবশ্যই একটি ''; বা '{'।
এলএল পার্সারদের জন্য অন্যান্য দুঃস্বপ্নটি ব্যাকরণে পুনরাবৃত্তি হয়। বাম পুনরাবৃত্তি ব্যাকরণগুলিতে একটি সাধারণ জিনিস, এলআর পার্সার জেনারেটরের কোনও সমস্যা হয় না, তবে এলএল এটি পরিচালনা করতে পারে না।
সুতরাং আপনাকে আপনার ব্যাকরণগুলি এলএল দিয়ে একটি অপ্রাকৃত উপায়ে লিখতে হবে।
বাম সর্বাধিক ডেরাইভেশন উদাহরণ: একটি ব্যাকরণ জি যা প্রসঙ্গমুক্ত, তার উত্পাদন রয়েছে
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)