কোনও লেসারের জন্য টোকেন নিয়ে আসা


14

আমি তৈরি করেছি এমন একটি মার্কআপ ভাষার জন্য একটি পার্সার লিখছি (পাইথনটিতে লেখা, তবে এটি এই প্রশ্নের সাথে আসলেই প্রাসঙ্গিক নয় - আসলে যদি এটি একটি খারাপ ধারণা বলে মনে হয় তবে আমি আরও ভাল পথের জন্য একটি পরামর্শ পছন্দ করব) ।

আমি এখানে পার্সারগুলি সম্পর্কে পড়ছি: 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 এর জন্য স্পেস তৈরি করা শুরু করবে)? আমি জিজ্ঞাসা করছি কারণ আমার এটিও জানা উচিত।

আমার চূড়ান্ত প্রশ্নটি মূ ?়তম প্রশ্ন: কেন একজন লেক্সার এমনকি প্রয়োজনীয়? আমার কাছে মনে হয় যে পার্সার চরিত্র অনুসারে চরিত্রটিতে যেতে পারে এবং এটি কোথায় এবং কী প্রত্যাশা করে তা নির্ধারণ করতে পারে। লেক্সার কি সরলতার উপকার যোগ করে?


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

কেন একটি কাস্টম চাকা পুনরুদ্ধার? কাস্টম বিল্ট লেক্সারের প্রয়োজন এমন একটি ভাষা ডিজাইন করার পরিবর্তে, আপনি কি কোনও বিদ্যমান ভাষা ব্যবহারের কথা বিবেচনা করেছেন যা ইতিমধ্যে বিল্ট-ইন লেক্সারের সাথে এলআইএসপি, বা এমনকি ফোরথের মতো আসে?
জন আর স্ট্রোহম

2
একাডেমিক উদ্দেশ্যে @ জনআর.স্ট্রোহম ভাষা নিজেই সম্ভবত ব্যবহারিকভাবে কার্যকর হবে না।
বিস্ফোরণ বড়ি

উত্তর:


11

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

উত্তরটি হল, সামনের দিকে - বা পিছনে-সীমাবদ্ধতার সীমাবদ্ধতাগুলি ব্যবহার করার প্রয়োজন ছাড়াই লেক্সারে যতটা সম্ভব আপনি করুন।

এর অর্থ হ'ল (ভাষার বিবরণগুলির উপর নির্ভর করে) আপনার একটি স্ট্রিংকে "নোটের ক্রম অনুসারে" এবং তার পরে অন্য একটি "চরিত্র হিসাবে স্বীকৃতি দেওয়া উচিত that এটি একটি একক হিসাবে পার্সারে ফিরে যান several বেশ কয়েকটি রয়েছে are এটির কারণগুলি, তবে গুরুত্বপূর্ণগুলি হ'ল

  1. এটি পার্সারকে তার মেমরির খরচ সীমাবদ্ধ করে বজায় রাখতে প্রয়োজনীয় পরিমাণের পরিমাণ হ্রাস করে।
  2. এটি লেক্সার বাস্তবায়নকে মৌলিক বিল্ডিং ব্লকগুলি সনাক্তকরণে মনোনিবেশ করার অনুমতি দেয় এবং পার্সারকে কীভাবে প্রোগ্রাম তৈরির জন্য পৃথক সিনট্যাকটিক উপাদান ব্যবহার করা হয় তা বর্ণনা করতে মুক্তি দেয়।

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

আমি যা বলতে চাইছি তা পুনরুদ্ধার করার জন্য, তবে আলাদাভাবে, লেক্সারের জিনিসগুলির বানান, এবং জিনিসগুলির কাঠামোর সাথে বিশ্লেষণকারী সম্পর্কে উদ্বিগ্ন হওয়া উচিত।

আপনি লক্ষ্য করতে পারেন যে স্ট্রিংটি দেখতে কেমন তার আমার বিবরণটি অনেকটা নিয়মিত অভিব্যক্তির মতো মনে হয়। এটা কোন কাকতালীয় ঘটনা নয়। লেক্সিকাল বিশ্লেষকরা প্রায়শই সামান্য ভাষায় প্রয়োগ করা হয় ( জন বেন্টলির দুর্দান্ত প্রোগ্রামিং পার্লস বইয়ের অর্থে ) যা নিয়মিত প্রকাশ প্রকাশ করে। পাঠ্যকে স্বীকৃতি দেওয়ার সময় আমি কেবল নিয়মিত প্রকাশের শর্তে চিন্তা করতে অভ্যস্ত।

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

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

ডিজাইনের ভাষা পার্সিং সিস্টেমগুলি করার অন্যান্য উপায় রয়েছে। অবশ্যই সেখানে কম্পাইলার নির্মাণ সিস্টেম যে আপনি একটি সম্মিলিত lexer এবং পার্সার সিস্টেম নির্দিষ্ট করার অনুমোদন দেবে আছে (আমি জাভা সংস্করণ মনে ANTLR এই আছে) কিন্তু আমি এক কখনও ব্যবহৃত হয়েছে।

শেষ একটি noteতিহাসিক নোট। কয়েক দশক আগে পার্সারের কাছে হস্তান্তর করার আগে লেক্সারের পক্ষে যথাসম্ভব যতটা করা সম্ভব ছিল, কারণ দুটি প্রোগ্রাম একই সাথে মেমরির সাথে খাপ খায় না। লেজারে আরও কিছু করা পার্সারকে স্মার্ট করতে আরও মেমরি উপলব্ধ রাখে। আমি বেশ কয়েক বছর ধরে হোয়াইটস্মিথ সি কম্পাইলার ব্যবহার করতাম, এবং আমি যদি সঠিকভাবে বুঝতে পারি তবে এটি কেবলমাত্র 64KB র্যামে চালিত হবে (এটি একটি ছোট মডেলের এমএস-ডস প্রোগ্রাম ছিল) এবং এমনকি এটি সিটির একটি বৈকল্পিক অনুবাদ করেছিল যে এএনএসআই সি এর খুব কাছে ছিল


মেমরির আকার সম্পর্কে ভাল historicalতিহাসিক নোটটি প্রথম স্থানে লেক্সার এবং পার্সারে চাকরি বিভক্ত করার এক কারণ।
স্টিভেট

3

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

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

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

আমি বলব যে ব্যবহারিক বিবেচনার কারণে লোকেরা আলাদা লেক্সার এবং পার্সার রাখার সিদ্ধান্ত নিতে পারে।


হ্যাঁ - এবং সি স্ট্যান্ডার্ড নিজেই একই কাজ করে, যেন আমি সঠিকভাবে স্মরণ করি, কার্নিগান এবং রিচি উভয় সংস্করণই করেছে।
জেমস ইয়ংম্যান

3

দেখে মনে হচ্ছে আপনি ব্যাকরণকে না বুঝেই কোনও লেক্সার / পার্সার লেখার চেষ্টা করছেন। সাধারণত, লোকেরা যখন একটি লেক্সার এবং পার্সার লিখছেন, তারা কিছু ব্যাকরণ মেনে চলার জন্য সেগুলি লিখছেন। যখন পার্সার সেই টোকেন ব্যবহার বিধি / অ টার্মিনাল মেলে lexer ব্যাকরণ টোকেন ফেরত পাঠাবেন । আপনি যদি সহজেই বাইট বাই বাইট করে আপনার ইনপুটটি পার্স করতে পারেন তবে কোনও লেক্সার এবং পার্সার ওভারকিল হতে পারে।

লেক্সাররা জিনিসগুলি সহজ করে তোলে।

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

simple_command:
 WORD DIGIT AND_SYMBOL
simple_command:
     addition_expression

addition_expression:
    NUM '+' NUM

এই ব্যাকরণটির অর্থ
হ'ল - একটি সরল_কম্যান্ড দুটি এ দ্বারা গঠিত
) WORD এর পরে AIGSYMBOL (এটি "টোকেন" যা আমি সংজ্ঞায়িত করি)
খ) একটি " সংযোজন_প্রকাশ " (এটি একটি নিয়ম বা "নন-টার্মিনাল")

একটি সংযোজন_প্রকাশ নিয়ে গঠিত:
NUM এর পরে একটি '+' পরে একটি NUM (NUM একটি 'টোকেন' যা আমি সংজ্ঞায়িত করি, '+' একটি আক্ষরিক যোগ চিহ্ন)।

সুতরাং, যেহেতু সরল_কম্যান্ডটি "সূচনা প্রতীক" (আমি যে জায়গাটি শুরু করি) তাই আমি যখন একটি টোকেন পাই তখন এটি সরল_কমন্ডের সাথে খাপ খায় কিনা তা পরীক্ষা করে দেখি। যদি ইনপুটটিতে প্রথম টোকেনটি একটি WORD হয় এবং তার পরের টোকেনটি ডিজিট এবং তার পরের টোকেনটি একটি AND_SYMBOL হয়, তবে আমি কিছু সহজ_কম্যান্ডের সাথে মেলে এবং কিছু পদক্ষেপ নিতে পারি। অন্যথায়, আমি এটিকে সরল_কম্যান্ডের অন্য নিয়মের সাথে মেলে দেখার চেষ্টা করব যা সংযোজন_প্রকাশ হয়। সুতরাং, যদি প্রথম টোকেনটি একটি NUM এর পরে '+' পরে একটি NUM পরে থাকে, তবে আমি একটি সাধারণ_কম্যান্ডের সাথে মেলে এবং আমি কিছু পদক্ষেপ নিই। যদি এটি things জিনিসগুলির মধ্যে না হয় তবে আমার একটি সিনট্যাক্স ত্রুটি রয়েছে।

এটি ব্যাকরণের একটি খুব, খুব প্রাথমিক ভূমিকা। আরও পুঙ্খানুপুঙ্খ বোঝার জন্য, এই উইকি নিবন্ধটি দেখুন এবং প্রসঙ্গমুক্ত ব্যাকরণ টিউটোরিয়ালগুলির জন্য ওয়েবে সন্ধান করুন।

লেক্সার / পার্সার বিন্যাসটি ব্যবহার করে আপনার পার্সার কীভাবে দেখতে পারে তার একটি উদাহরণ এখানে রয়েছে:

bool simple_command(){
   if (peek_next_token() == WORD){
       get_next_token();
       if (get_next_token() == DIGIT){
           if (get_next_token() == AND_SYMBOL){
               return true;
           } 
       }
   }
   else if (addition_expression()){
       return true;
   }

   return false;
}

bool addition_expression(){
    if (get_next_token() == NUM){
        if (get_next_token() == '+'){
             if (get_next_token() == NUM){
                  return true;
             }
        }
    }
    return false;
}

ঠিক আছে, যাতে কোডটি কুশ্রী ধরনের এবং আমি বিবৃতি যদি কখনও ট্রিপল নেস্টেড সুপারিশ করব না। তবে মুল বক্তব্যটি হ'ল আপনার সুন্দর মডুলার "get_next_token" এবং "পিক_নেক্সট_ টোকেন" ফাংশনগুলি ব্যবহার না করে চরিত্রের উপরের জিনিসটি উপরে বর্ণন করার চেষ্টা করুন । সিরিয়াসলি, এটি একটি শট দিন। আপনি ফলাফল পছন্দ করবেন না। এখন মনে রাখবেন যে উপরের ব্যাকরণটি প্রায় কোনও দরকারী ব্যাকরণের চেয়ে প্রায় 30x কম জটিল। আপনি কোনও লেসচার ব্যবহারের সুবিধা দেখতে পাচ্ছেন?

সত্যিই, লেক্সার এবং পার্সার্স বিশ্বের সর্বাধিক প্রাথমিক বিষয় নয়। আমি প্রথমে ব্যাকরণ সম্পর্কে পড়া এবং বোঝার পরামর্শ দেব, তারপরে লেক্সার / পার্সার সম্পর্কে কিছুটা পড়ার পরে ডাইভিংয়ের পরামর্শ দেব।


ব্যাকরণ সম্পর্কে শেখার জন্য আপনার কি কোনও প্রস্তাবনা আছে?
বিস্ফোরণ বড়ি

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

1

আমার চূড়ান্ত প্রশ্নটি মূ ?়তম প্রশ্ন: কেন একজন লেক্সার এমনকি প্রয়োজনীয়? আমার কাছে মনে হয় যে পার্সার চরিত্র অনুসারে চরিত্রটিতে যেতে পারে এবং এটি কোথায় এবং কী প্রত্যাশা করে তা নির্ধারণ করতে পারে।

এটি বোকা নয়, এটি কেবল সত্য।

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

কোনও লেক্সার ব্যবহার বা না ব্যবহার করা আপনার ভাষা এবং চরিত্রের স্তরের মধ্যে বিমূর্ততার একটি স্তর থাকার বিষয়। নোট করুন যে আজকাল অক্ষর স্তরটি বাইট স্তরের উপরে আরেকটি বিমূর্ততা, যা বিট স্তরের উপরে বিমূর্ততা।

সুতরাং, অবশেষে, আপনি বিট স্তরে পার্স করতে পারেন।


0
STRING_START + (IDENTIFIER | WHITESPACE) + STRING_START.

না, এটা পারে না। কি হবে "("? আপনার মতে, এটি কোনও বৈধ স্ট্রিং নয়। আর পালিয়ে যায়?

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

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