পৃথক পার্সিং এবং লেক্সিং পার্সার সংযুক্তকারীগুলির সাথে ভাল অনুশীলনগুলি পাস করে?


18

আমি যখন পার্সার কম্বিনেটরগুলি ব্যবহার করতে শুরু করি তখন আমার প্রথম প্রতিক্রিয়াটি পার্সিং এবং লেক্সিংয়ের মধ্যে একটি কৃত্রিম পার্থক্যের মতো অনুভূত হওয়া থেকে মুক্তির অনুভূতি ছিল। হঠাৎ সব কিছু কেবল পার্সিং করছিল!

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

পার্সার সংযুক্তকারীগুলিতে ইতিমধ্যে লেক্সড স্ট্রিমের পার্সিংয়ের সুবিধা / অসুবিধাগুলি কী কী?


দয়া করে কেউ [পার্সার-কম্বিনেটর] ট্যাগ যুক্ত করতে পারেন?
এলি ফ্রে

উত্তর:


15

বিশ্লেষণের অধীনে আমরা প্রায়শই প্রাসঙ্গিক ভাষা বিশ্লেষণ বুঝতে পারি analysis একটি প্রসঙ্গমুক্ত ভাষা একটি নিয়মিত ভাষার চেয়ে বেশি শক্তিশালী, তাই পার্সারটি (বেশিরভাগ ক্ষেত্রে) এখনই লেজিকাল বিশ্লেষকের কাজটি করতে পারে।

তবে এটি একটি) বেশ অপ্রাকৃত খ) প্রায়শই অদক্ষ।

একটি জন্য), আমি যদি আমার মনে হয় কিভাবে উদাহরণস্বরূপ একটি ifঅভিব্যক্তি কেমন লাগে, আমি যদি মনে করেন expr তাহলে expr ছাড়া আর অন্য expr এবং 'আমি' 'F', হয়তো কিছু স্পেস, যেকোনো চরিত্র একটি অভিব্যক্তি দিয়ে শুরু করতে পারেন, ইত্যাদি আপনি পেতে ধারণা.

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

সর্বোপরি, আপনি যদি ভাবেন যে কোনও পার্সার নিম্ন স্তরের স্টাফ নিয়ে ব্যস্ত থাকতে হবে তবে কেন অক্ষরগুলি মোটেই প্রসেস করা যায়? এটি বিটের স্তরেও লিখতে পারে! আপনি দেখুন, এই জাতীয় পার্সার যা বিট স্তরে কাজ করে তা প্রায় বোধগম্য হবে। অক্ষর এবং টোকেনগুলির সাথে এটি একই।

শুধু আমার 2 সেন্ট।


3
কেবল নির্ভুলতার খাতিরে: কোনও পার্সার সর্বদা একটি লেসিকাল বিশ্লেষকের কাজ করতে পারে ।
জর্জিও

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

@ জর্জিও - আপনার প্রথম মন্তব্য সম্পর্কিত: আপনি ঠিক বলেছেন। আমার এখানে যা মনে ছিল তা হ'ল লেক্সার বাস্তবিকভাবে এমন কিছু কাজ করে যা ব্যাকরণকে সহজ করে তোলে, যাতে কেউ এলএলআর (2) এর পরিবর্তে এলএলআর (1) ব্যবহার করতে পারে।
ইঙ্গো

2
আমি আরও উত্তর পরীক্ষা এবং প্রতিবিম্বের পরে আপনার উত্তর আমার গ্রহণযোগ্যতা অপসারণ করেছি। এটি আপনারা দুজনেই এন্টলার এবং সমস্তেরই বিশ্ব থেকে এসেছেন ams পার্সার সংযুক্তকারীগুলির প্রথম শ্রেণীর প্রকৃতি বিবেচনা করে আমি প্রায়শই আমার টোকেন পার্সারদের জন্য একটি মোড়ক পার্সার সংজ্ঞায়িত করে পার্সার পার্সিং স্তরটিতে প্রতিটি টোকেনকে একক নাম হিসাবে রেখে চলেছি। উদাহরণস্বরূপ আপনার যদি উদাহরণটি দেখতে চাই if = string "if" >> expr >> string "then" >> expr >> string "else" >> expr
এলি ফ্রে

1
পারফরম্যান্স এখনও একটি উন্মুক্ত প্রশ্ন, আমি কিছু মানদণ্ড করব।
এলি ফ্রে

8

লেক্সিং এবং পার্সিং পৃথক করা একটি "ভাল অনুশীলন" - এমন পরামর্শ দেওয়ার জন্য প্রত্যেককেই আমার একমত হতে হবে - অনেক ক্ষেত্রে লেকসিং করা এবং একক পাসে পার্স করা অনেক বেশি শক্তি দেয়, এবং পারফরম্যান্সের প্রভাবগুলি যেমন উপস্থাপিত হয় তেমন খারাপ হয় না অন্যান্য উত্তর ( প্যাকেট দেখুন )।

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


আমার উত্তরে আমি প্রস্তাব দিয়েছি যে এটি একটি "নির্দিষ্ট প্রসঙ্গে ভাল অনুশীলন" এবং এটি "সমস্ত ক্ষেত্রে সর্বোত্তম অনুশীলন" নয়।
জর্জিও

5

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

অন্যদিকে, নিয়মিত ভাষার (এবং তাই একটি লেজিকাল বিশ্লেষক) মাধ্যমে প্রসঙ্গ-মুক্ত ভাষার কিছু উপাদান ক্যাপচারে এটি কার্যকর হতে পারে কারণ

  1. প্রায়শই এই উপাদানগুলি প্রায়শই উপস্থিত হয় যে এগুলি একটি স্ট্যান্ডার্ড উপায়ে মোকাবেলা করা যেতে পারে: সংখ্যা এবং স্ট্রিং আক্ষরিক, কীওয়ার্ড, শনাক্তকরণ, সাদা স্থান বাদ দেওয়া ইত্যাদি recogn
  2. টোকেনগুলির একটি নিয়মিত ভাষা সংজ্ঞায়িত করার ফলে ফলাফল প্রকরণমুক্ত ব্যাকরণকে সহজতর করে তোলে, উদাহরণস্বরূপ, কেউ পৃথক চরিত্রের ক্ষেত্রে নয়, শনাক্তকারীদের ক্ষেত্রে বিবেচনা করতে পারে বা যদি সেই নির্দিষ্ট ভাষার জন্য প্রাসঙ্গিক না হয় তবে কেউ সাদা স্থানটিকে সম্পূর্ণ উপেক্ষা করতে পারে।

সুতরাং লেজিকাল বিশ্লেষণ থেকে পার্সিং পৃথক করার সুবিধা রয়েছে যে আপনি একটি সহজ প্রসঙ্গ-মুক্ত ব্যাকরণ নিয়ে কাজ করতে পারেন এবং লেজিকাল অ্যানালাইজারে কিছু বিভক্ত (প্রায়শই রুটিন) ট্যাপসেট করতে পারেন (ডিভিড এট ইম্পেরা)।

সম্পাদনা

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


2
লেক্সেমিস নিয়মিত ব্যাকরণে পড়ে প্রাকৃতিকভাবে নয়, তবে কনভেনশন অনুসারে, যেহেতু সমস্ত লেক্সার নিয়মিত এক্সপ্রেশন ইঞ্জিনের উপর নির্মিত হয়। এটি আপনার নকশা করতে পারে এমন ভাষাগুলির ভাবগত শক্তি সীমিত করছে।
এসকে-যুক্তি

1
আপনি কি এমন ভাষার উদাহরণ দিতে পারেন যার জন্য নিয়মিত ভাষা হিসাবে বর্ণিত হতে পারে না এমন লেক্সেমিকে সংজ্ঞায়িত করা উপযুক্ত হবে?
জর্জিও

1
উদাহরণস্বরূপ, আমি তৈরি করেছি এমন কয়েকটি ডোমেন নির্দিষ্ট ভাষায়, সনাক্তকারীগুলি টেক্স এক্সপ্রেশন হতে পারে, যা কোডটি প্রিন্টিং-প্রিন্টিংকে সহজতর করেছিল, উদাহরণস্বরূপ, একটি এক্সপ্রেশন \alpha'_1 (K_0, \vec{T}), যেখানে \ alpha'_1, K_0 এবং \ vec {T} সনাক্তকারী হয়।
এসকে-যুক্তি

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

3
সুতরাং, আমি আপনার সাথে একমত: আপনি যদি কিছু স্বেচ্ছাচারিত বেসিক বিল্ডিং ব্লক ( লেক্সেমিস ) সংজ্ঞায়িত করেন এবং সেগুলি সনাক্ত করতে কোনও লেজিকাল বিশ্লেষক ব্যবহার করতে চান তবে এটি সর্বদা সম্ভব হয় না। আমি কেবল আশ্চর্য হই যে এটি কোনও লিক্সারের লক্ষ্য কিনা। আমি যতদূর বুঝতে পেরেছি, একটি লেজিকাল অ্যানালাইজারের লক্ষ্যটি আরও প্রযুক্তিগত: পার্সার থেকে কিছু নিম্ন-স্তরের, ক্লান্তিকর প্রয়োগের বিশদ নিয়ে যাওয়া।
জর্জিও

3

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

লেক্সে পার্সিং অ্যালগরিদম ব্যবহার করে আপনি অপচয় করছেন।


আপনি যদি লাক্ষিক বিশ্লেষণ করতে পার্সার ব্যবহার করেন, পিডিএ কখনও স্ট্যাকটি ব্যবহার করবে না, এটি মূলত ডিএফএ হিসাবে কাজ করবে: কেবল ইনপুট গ্রহণ এবং রাজ্যগুলির মধ্যে ঝাঁপিয়ে পড়া। আমি ১০০% নিশ্চিত নই, তবে আমি মনে করি যে ডিএফএ-তে প্রয়োগ করা যেতে পারে এমন অপ্টিমাইজেশন কৌশলগুলি (রাজ্যের সংখ্যা হ্রাস করা) পিডিএতেও প্রয়োগ করা যেতে পারে। তবে হ্যাঁ: আরও শক্তিশালী সরঞ্জাম ব্যবহার না করে যেমন লেজিকাল অ্যানালাইজার লিখতে এবং তারপরে একটি সহজ পার্সার লিখতে আরও সহজ।
জর্জিও

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

1
@ ইঙ্গো, এবং আপনাকে এটি আলাদা লেক্সারে করার দরকার কেন? কেবলমাত্র সেই টার্মিনালগুলি তৈরি করুন।
এসকে-যুক্তি

1
@ এসকে-যুক্তি: আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি। আলাদা লেক্সার কেন ভাল পোস্ট হতে পারে আমি নিজের পোস্টে প্রমাণ করার চেষ্টা করেছি।
ইঙ্গো

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

1

পৃথক পার্স / লেক্সের অন্যতম প্রধান সুবিধা হ'ল মধ্যবর্তী প্রতিনিধিত্ব - টোকেন স্ট্রিম। এটি বিভিন্ন উপায়ে প্রক্রিয়া করা যেতে পারে যা অন্যথায় সম্মিলিত লেক্স / পার্সের মাধ্যমে সম্ভব নয়।

এটি বলেছিল যে, আমি খুঁজে পেয়েছি যে ভাল 'অল রিকভার্সভ শালীন কিছু পার্সার জেনারেটর শিখতে বনামের সাথে কাজ করা কম জটিল এবং সহজ হতে পারে এবং পার্সার জেনারেটরের নিয়মের মধ্যে কীভাবে ব্যাকরণের দুর্বলতা প্রকাশ করতে হয় তা নির্ধারণ করতে হবে।


আপনি কি এমন ব্যাকরণ সম্পর্কে আরও ব্যাখ্যা করতে পারেন যা পার্স সময় পারফর্ম করা প্রিফ্যাবড স্ট্রিমটিতে আরও সহজে প্রকাশ করা হয়? আমার কাছে খেলনা ভাষা এবং কিছু সংখ্যক ডেটা ফর্ম্যাট বাস্তবায়নের অভিজ্ঞতা রয়েছে, তাই সম্ভবত আমি কিছু মিস করেছি। আপনার হাত-ঘূর্ণিত আরডি পার্সার / লেক্স কম্বোস এবং বিএনএফ ফিড (আমি ধরে নিচ্ছি) জেনারেটরের মধ্যে কোনও পারফরম্যান্স বৈশিষ্ট্য লক্ষ্য করেছেন?
এলি ফ্রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.