আমি তৈরি করেছি এমন একটি মার্কআপ ভাষার জন্য একটি পার্সার লিখছি (পাইথনটিতে লেখা, তবে এটি এই প্রশ্নের সাথে আসলেই প্রাসঙ্গিক নয় - আসলে যদি এটি একটি খারাপ ধারণা বলে মনে হয় তবে আমি আরও ভাল পথের জন্য একটি পরামর্শ পছন্দ করব) ।
আমি এখানে পার্সারগুলি সম্পর্কে পড়ছি: http://www.ferg.org/parsing/index.html , এবং আমি লেক্সার লেখার উপর কাজ করছি যা যদি আমি সঠিকভাবে বুঝতে পারি তবে বিষয়বস্তু টোকেনে বিভক্ত করা উচিত। আমার বুঝতে কী সমস্যা হচ্ছে তা হ'ল আমার কী ধরণের টোকেন ব্যবহার করা উচিত বা সেগুলি কীভাবে তৈরি করা যায়। উদাহরণস্বরূপ, আমি সংযুক্ত উদাহরণে টোকেনের ধরণগুলি হ'ল:
- STRING এর
- IDENTIFIER
- NUMBER টি
- হোয়াইটস্পেস
- মন্তব্য
- ফাইলের শেষে
- অনেক চিহ্ন যেমন their এবং (তাদের নিজস্ব টোকেন প্রকার হিসাবে গণনা করা হয়)
আমার যে সমস্যাটি হচ্ছে তা হ'ল আরও সাধারণ টোকেন ধরণগুলি আমার কাছে কিছুটা নির্বিচার মনে হয়। উদাহরণস্বরূপ, কেন STRING এর নিজস্ব পৃথক টোকেন প্রকারের বনাম আইডেন্টিফায়ার। একটি স্ট্রিংটি STRING_START + (আইডেন্টিফায়ার | হোয়াইটস্পেস) + STRING_START হিসাবে উপস্থাপিত হতে পারে।
এটি আমার ভাষার সমস্যার সাথেও থাকতে পারে। উদাহরণস্বরূপ, চলক ঘোষণাগুলি হিসাবে লেখা হয় {var-name var value}
এবং এর সাথে স্থাপন করা হয় {var-name}
। দেখে মনে হচ্ছে '{'
এবং '}'
এটি তাদের নিজস্ব টোকেন হওয়া উচিত তবে VAR_NAME এবং VAR_VALUE টি কি যোগ্য টোকেন ধরণের, নাকি এই দুটোই আইডিএনটিআইফিরের আওতায় পড়বে? আরও কি VAR_VALUE আসলে সাদা স্থান থাকতে পারে। পরে শ্বেত স্পেসটি var-name
ঘোষণাপত্রে মানটির সূচনা করতে ব্যবহৃত হয় .. অন্য কোনও শ্বেত স্পেস মানটির অংশ। এই সাদা স্থানটি কি তার নিজস্ব টোকেন হয়ে যায়? হোয়াইটস্পেসের কেবলমাত্র এই প্রসঙ্গেই এর অর্থ রয়েছে। তদুপরি, {
পরিবর্তনশীল ঘোষণার সূচনা নাও হতে পারে .. এটি প্রসঙ্গে নির্ভর করে (আবার সেই শব্দটি আছে!)। {:
একটি নাম ঘোষণা শুরু, এবং{
এমনকি কিছু মান অংশ হিসাবে ব্যবহার করা যেতে পারে।
আমার ভাষা পাইথনের অনুরূপ যে ব্লকগুলি ইনডেন্টেশন দিয়ে তৈরি করা হয়েছে। আমি কিভাবে পাইথন ইন্ডেন্ট এবং DEDENT টোকেন (যে হিসাবে কি বেশী বা কম পরিবেশন করা তৈরি করতে lexer ব্যবহার করে সে সম্পর্কে পড়া ছিল {
এবং }
অন্যান্য ভাষায় অনেকটা না হবে)। পাইথন প্রসঙ্গমুক্ত বলে দাবি করেছে যার অর্থ আমার কাছে যে টোকেন তৈরির সময় কমপক্ষে লেক্সারের প্রবাহটি কোথায় রয়েছে সেদিকে নজর দেওয়া উচিত নয়। পাইথনের ল্যাক্সার কীভাবে জানতে পারবেন যে এটি পূর্ববর্তী অক্ষরগুলি সম্পর্কে না জেনে নির্দিষ্ট দৈর্ঘ্যের একটি ইন্ডেন্ট টোকেন তৈরি করছে (উদাহরণস্বরূপ যে পূর্ববর্তী লাইনটি একটি নতুন লাইন ছিল, সুতরাং INDENT এর জন্য স্পেস তৈরি করা শুরু করবে)? আমি জিজ্ঞাসা করছি কারণ আমার এটিও জানা উচিত।
আমার চূড়ান্ত প্রশ্নটি মূ ?়তম প্রশ্ন: কেন একজন লেক্সার এমনকি প্রয়োজনীয়? আমার কাছে মনে হয় যে পার্সার চরিত্র অনুসারে চরিত্রটিতে যেতে পারে এবং এটি কোথায় এবং কী প্রত্যাশা করে তা নির্ধারণ করতে পারে। লেক্সার কি সরলতার উপকার যোগ করে?