আমি আস্তে আস্তে আমার ডিগ্রি শেষ করার জন্য কাজ করছি, এবং এই সেমিস্টারটি হ'ল সংকলকগণ 101. আমরা ড্রাগন বুক ব্যবহার করছি । কোর্সের খুব শীঘ্রই এবং আমরা লেজিকাল বিশ্লেষণের কথা বলছি এবং কীভাবে এটি ডিটারমিনিস্টিক সসীম অটোমেটা (পরবর্তীকালে, ডিএফএ) এর মাধ্যমে প্রয়োগ করা যেতে পারে। আপনার বিভিন্ন ল্যাক্সার রাজ্যগুলি সেট আপ করুন, তাদের মধ্যে রূপান্তর সংজ্ঞা দিন ইত্যাদি
তবে অধ্যাপক এবং বই উভয়ই রূপান্তর টেবিলগুলির মাধ্যমে এগুলি প্রয়োগের প্রস্তাব দেয় যা একটি বিশাল 2 ডি অ্যারের পরিমাণে (বিভিন্ন অ-টার্মিনাল একটি মাত্রা হিসাবে, এবং অন্য হিসাবে সম্ভাব্য ইনপুট চিহ্নগুলি) এবং টার্মিনালের সমস্তগুলি পরিচালনা করার জন্য একটি সুইচ স্টেটমেন্ট ose অস্থায়ী অবস্থায় থাকলে রূপান্তর টেবিলগুলিতে প্রেরণ করুন।
তত্ত্বটি সমস্ত ভাল এবং ভাল, তবে কেউ কেউ যিনি আসলে কয়েক দশক ধরে কোড লিখেছেন, বাস্তবায়নটি অসম্পূর্ণ। এটি পরীক্ষণযোগ্য নয়, এটি রক্ষণযোগ্য নয়, এটি পঠনযোগ্য নয় এবং এটি ডিবাগ করার জন্য একটি ব্যথা এবং দেড় ঘন্টা আরও খারাপ বিষয়, ভাষাটি ইউটিএফ সক্ষম হলে এটি কীভাবে দূরবর্তী বাস্তব হতে পারে তা আমি দেখতে পাচ্ছি না। নন-টার্মিনাল রাজ্যে প্রতি মিলিয়ন বা তাই ট্রানজিশন টেবিল এন্ট্রি থাকলে তাড়াহুড়ো করে অদ্ভুত হয়।
তাহলে চুক্তি কী? বিষয়টির সুনির্দিষ্ট বই কেন এভাবে বলছে?
ফাংশন কলগুলির ওভারহেড কি সত্যিই এত বেশি? ব্যাকরণ সময়ের আগে (নিয়মিত প্রকাশ?) জানা না থাকলে এটি কি ভাল কাজ করে বা প্রয়োজনীয়? অথবা সম্ভবত এমন কিছু যা সমস্ত ক্ষেত্রে পরিচালনা করে, এমনকি যদি আরও নির্দিষ্ট সমাধান আরও নির্দিষ্ট ব্যাকরণগুলির জন্য আরও ভাল কাজ করে?
( দ্রষ্টব্য: সম্ভাব্য সদৃশ "" জায়ান্ট স্যুইচ স্টেটমেন্টের পরিবর্তে কেন ওও পদ্ধতির ব্যবহার করবেন? "নিকটবর্তী, তবে আমি ওও সম্পর্কে যত্ন নিই না stand স্ট্যান্ডার্ডোন ফাংশন সহ একটি কার্যকরী পদ্ধতির বা এমনকি স্যানার অপরিহার্য পদ্ধতিও ভাল হবে))
এবং উদাহরণস্বরূপ, এমন একটি ভাষা বিবেচনা করুন যা কেবল সনাক্তকারী থাকে এবং সেই শনাক্তকারীরা [a-zA-Z]+
। ডিএফএ বাস্তবায়নে আপনি এমন কিছু পাবেন:
private enum State
{
Error = -1,
Start = 0,
IdentifierInProgress = 1,
IdentifierDone = 2
}
private static State[][] transition = new State[][]{
///* Start */ new State[]{ State.Error, State.Error (repeat until 'A'), State.IdentifierInProgress, ...
///* IdentifierInProgress */ new State[]{ State.IdentifierDone, State.IdentifierDone (repeat until 'A'), State.IdentifierInProgress, ...
///* etc. */
};
public static string NextToken(string input, int startIndex)
{
State currentState = State.Start;
int currentIndex = startIndex;
while (currentIndex < input.Length)
{
switch (currentState)
{
case State.Error:
// Whatever, example
throw new NotImplementedException();
case State.IdentifierDone:
return input.Substring(startIndex, currentIndex - startIndex);
default:
currentState = transition[(int)currentState][input[currentIndex]];
currentIndex++;
break;
}
}
return String.Empty;
}
(যদিও এমন কিছু যা ফাইলের শেষটি সঠিকভাবে পরিচালনা করবে)
আমি যা আশা করব তার তুলনায়:
public static string NextToken(string input, int startIndex)
{
int currentIndex = startIndex;
while (currentIndex < startIndex && IsLetter(input[currentIndex]))
{
currentIndex++;
}
return input.Substring(startIndex, currentIndex - startIndex);
}
public static bool IsLetter(char c)
{
return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
}
NextToken
ডিএফএ শুরু হওয়ার পরে আপনার একাধিক গন্তব্য হয়ে গেলে কোডটি তার নিজের ফাংশনে রিফ্যাক্টরেড করে।