সাধারণ ব্যক্তির ভাষায়, পুনরাবৃত্তি কি বাকি?


12

কোড .google.com.com এর একটি পৃষ্ঠা অনুসারে , "বাম পুনরাবৃত্তি" নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে:

বাম পুনরাবৃত্তি কেবল যে কোনও পুনরাবৃত্ত নন-টার্মিনালকে বোঝায় যে, যখন এটি একটি সংশ্লেষপূর্ণ ফর্ম তৈরি করে, যখন নিজের নতুন কপি উত্পাদন রুলের বামদিকে প্রদর্শিত হয়।

উইকিপিডিয়া দুটি ভিন্ন সংজ্ঞা দেয়:

  1. প্রসঙ্গমুক্ত ব্যাকরণের শর্তে একটি অ-টার্মিনাল আর যদি বাম-সর্বাধিক প্রতীক হয় তবে আর এর যে কোনও প্রোডাকশনে ('বিকল্প') হয় তাত্ক্ষণিকভাবে (সরাসরি / তাত্ক্ষণিক বাম-পুনরাবৃত্ত) বা অন্য কোনও নন-টার্মিনালের মাধ্যমে সংজ্ঞাগুলি (অপ্রত্যক্ষ / লুকিয়ে থাকা বাম-পুনরাবৃত্ত) আবার পুনরায় লেখায়।

  2. "ব্যাকরণটি বাম-পুনরাবৃত্ত হয় যদি আমরা এমন কিছু অ-টার্মিনাল এ খুঁজে পাই যা শেষ পর্যন্ত বাম-প্রতীক হিসাবে নিজেই একটি শৃঙ্খলাবদ্ধ রূপ নেবে" "

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

উত্তর:


21

কোনও নিয়ম Rবামে পুনরাবৃত্তিযোগ্য যদি, Rম্যাচগুলি কিনা তা খুঁজে বের করার জন্য , আপনাকে প্রথমে Rম্যাচগুলি কিনা তা খুঁজে বের করতে হবে । Rপ্রত্যক্ষ বা অপ্রত্যক্ষভাবে নিজের কিছু উত্পাদনের প্রথম শব্দ হিসাবে উপস্থিত হলে এটি ঘটে ।

ব্যাসারতা এড়াতে কেবল সংযোজন এবং গুণ সহ গাণিতিক প্রকাশের জন্য ব্যাকরণের একটি খেলনা সংস্করণটি কল্পনা করুন:

Expression ::= Multiplication '+' Expression
            || Multiplication

Multiplication ::= Term '*' Term
                 || Term

Term ::= Number | Variable

যেমনটি লিখিত আছে, এখানে কোনও বাম-পুনরাবৃত্তি নেই - আমরা এই ব্যাকরণটি পুনরাবৃত্ত-বংশদ্ভূত পার্সারে যেতে পারি।

তবে ধরুন আপনি এইভাবে লেখার চেষ্টা করেছেন:

Expression ::= Expression '*' Expression
            || Expression '+' Expression
            || Term

Term ::= Number | Variable

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

বিধিটি প্রত্যক্ষ বা পরোক্ষভাবে নিজেকে বোঝায় কিনা তা বিবেচ্য নয়; যদি Aএমন কোনও বিকল্প থাকে যা দিয়ে শুরু হয় Bএবং Bএর বিকল্পটি শুরু হয় A, তবে Aএবং Bউভয়ই পরোক্ষভাবে বাম-পুনরাবৃত্ত হয় এবং পুনরাবৃত্ত-বংশদ্ভুত পার্সারে তাদের মিলনীয় কার্যগুলি অন্তহীন পারস্পরিক পুনরাবৃত্তির দিকে পরিচালিত করে।


তাই দ্বিতীয় উদাহরণে, যদি আপনি পরে খুব প্রথম জিনিস পরিবর্তিত ::=থেকে Expressionথেকে Term, এবং যদি আপনি প্রথম পর একই করেনি ||এটি আর বাম-রিকার্সিভ হবে? তবে আপনি যদি এটি কেবল পরে করেন ::=তবে তা না ||, এটি এখনও বাম-পুনরাবৃত্তি হবে?
Panzercrisis

দেখে মনে হচ্ছে আপনি বলছেন যে প্রচুর পার্সার বাম থেকে ডানে চলেছে, প্রতিটি প্রতীককে থামিয়ে এবং ঘটনাস্থলে পুনরাবৃত্তির সাথে মূল্যায়ন করে। এই ক্ষেত্রে, প্রথমটি যদি প্রথমে এবং পরে উভয় পরে Expressionস্যুইচ করা হয় তবে সবকিছু ঠিকঠাক হবে; কারণ যত তাড়াতাড়ি বা পরে, এটি এমন কোনও Term::=||NumberVariableExpression
কিছুর মধ্যে ছড়িয়ে পড়বে

... তবে তাদের মধ্যে যে কোনও একটি যদি এখনও শুরু করে Expression, এটি সম্ভবত এমন একটি জিনিস খুঁজে পাবে যা একটি নয় Term, এবং এটি কেবল সবকিছু Expressionশেষ এবং অবিচ্ছিন্ন কিনা তা পরীক্ষা করে রাখা উচিত । এটা কি?
Panzercrisis

1
পছন্দ করুন আপনার সত্যিই এলএল, এলআর এবং পুনরাবৃত্ত-বংশদ্ভুত পার্সারগুলির অর্থ সন্ধান করতে হবে।
hobbs

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

4

আমি এটিকে সাধারণ লোকের শর্তে রেখে ছুরিকাঘাত করব।

আপনি যদি পার্স গাছের কথা বিবেচনা করেন (এএসটি নয়, তবে পার্সারের পরিদর্শন এবং ইনপুটটির বিস্তৃতি), বাম পুনরাবৃত্তির ফলে গাছটি বাম এবং নীচের দিকে বৃদ্ধি পায় grows ডান পুনরাবৃত্তি ঠিক বিপরীত।

উদাহরণস্বরূপ, সংকলকটিতে একটি সাধারণ ব্যাকরণ হ'ল আইটেমগুলির তালিকা। স্ট্রিংগুলির একটি তালিকা ("লাল", "সবুজ", "নীল") নিতে এবং এটি বিশ্লেষণ করতে দেয়। আমি ব্যাকরণ কয়েকভাবে লিখতে পারতাম। নিম্নলিখিত উদাহরণগুলি যথাক্রমে সরাসরি বাম বা ডান পুনরাবৃত্ত হয়:

arg_list:                           arg_list:
      STRING                              STRING
    | arg_list ',' STRING               | STRING ',' arg_list 

এই পার্সের জন্য গাছগুলি:

         (arg_list)                       (arg_list)
          /      \                         /      \
      (arg_list)  BLUE                  RED     (arg_list)
       /       \                                 /      \
   (arg_list) GREEN                          GREEN    (arg_list)
    /                                                  /
 RED                                                BLUE

এটি পুনরাবৃত্তির দিকের দিকে কীভাবে বৃদ্ধি পায় তা নোট করুন।

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

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

উপরের ব্যাকরণের জন্য, বাম পুনরাবৃত্তি প্রদর্শন করা এলএল বাস্তবায়নটি এর মতো দেখায়। পার্সার একটি তালিকা পূর্বাভাস দিয়ে শুরু হবে ...

bool match_list()
{
    if(lookahead-predicts-something-besides-comma) {
       match_STRING();
    } else if(lookahead-is-comma) {
       match_list();   // left-recursion, infinite loop/stack overflow
       match(',');
       match_STRING();
    } else {
       throw new ParseException();
    }
}

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

নীচের অংশীদারদের উভয় দিকেই পুনরাবৃত্ত নিয়মের সমস্যা নেই, কারণ তারা বাক্যটির শুরুটিকে পৃথক করে না, তারা বাক্যটি আবার একসাথে রেখে কাজ করে।

ব্যাকরণে পুনরাবৃত্তি কেবল তখনই সমস্যা হয় যদি আমরা উপরে থেকে নীচে উত্পাদন করি, অর্থাৎ। আমাদের পার্সার টোকেন গ্রহণ করার সাথে সাথে আমাদের পূর্বাভাসগুলি "প্রসারিত" করে কাজ করে। যদি প্রসারণের পরিবর্তে, আমরা ভেঙে যাই (প্রযোজনাগুলি "হ্রাস" হয়) যেমনটি এলএলআর (ইয়্যাক / বাইসন) নীচে আপ পার্সারের মতো হয়, তবে উভয় পক্ষের পুনরাবৃত্তি কোনও সমস্যা নয়।

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