আমি ব্যবহারকারী-সংজ্ঞায়িত ডোমেন নির্দিষ্ট ভাষাগুলি পার্স করতে চাই। এই ভাষাগুলি সাধারণত গাণিতিক স্বরলিপিগুলির নিকটে থাকে (আমি কোনও প্রাকৃতিক ভাষা পার্স করছি না)। ব্যবহারকারীরা তাদের ডিএসএল একটি বিএনএফ স্বরলিপিতে সংজ্ঞায়িত করেছেন:
expr ::= LiteralInteger
| ( expr )
| expr + expr
| expr * expr
ইনপুটটিকে 1 + ( 2 * 3 )
অবশ্যই গ্রহণ করতে হবে, যখন ইনপুটটিকে 1 +
অবশ্যই ভুল হিসাবে প্রত্যাখ্যান করতে হবে, এবং ইনপুটটিকে 1 + 2 * 3
অবশ্যই অস্পষ্ট হিসাবে প্রত্যাখ্যান করতে হবে।
এখানে একটি কেন্দ্রীয় সমস্যা হ'ল ব্যবহারকারী-বান্ধব উপায়ে অস্পষ্ট ব্যাকরণগুলি মোকাবেলা করা। ব্যাকরণকে দ্ব্যর্থহীন বলে সীমাবদ্ধ করা কোনও বিকল্প নয়: ভাষাটি সেইভাবেই হয় - ধারণাটি হল যে লেখকরা অস্পষ্টতা এড়াতে যখন প্রয়োজন হয় না তখন তাদের প্রথম বন্ধনী বাদ দিতে পছন্দ করেন। যতক্ষণ না কোনও অভিব্যক্তি অস্পষ্ট নয়, ততক্ষণ আমার এটি বিশ্লেষণ করা দরকার, এবং যদি তা না হয় তবে আমার এটি প্রত্যাখ্যান করা দরকার।
আমার পার্সার অবশ্যই কোনও প্রসঙ্গ-মুক্ত ব্যাকরণ, এমনকি দ্ব্যর্থহীন বিষয়গুলিতে কাজ করতে হবে এবং অবশ্যই সমস্ত দ্ব্যর্থহীন ইনপুট গ্রহণ করতে হবে। সমস্ত গৃহীত ইনপুটটির জন্য আমার পার্স গাছ দরকার। অবৈধ বা অস্পষ্ট ইনপুটটির জন্য, আমি আদর্শভাবে ভাল ত্রুটি বার্তাগুলি চাই, তবে যা শুরু করতে পারি তা দিয়েই শুরু করব।
আমি সাধারণত মাঝেমধ্যে দীর্ঘতর ইনপুট সহ অপেক্ষাকৃত সংক্ষিপ্ত ইনপুটগুলিতে পার্সারটি প্রার্থনা করব। সুতরাং asyptotically দ্রুত অ্যালগরিদম সেরা পছন্দ নাও হতে পারে। আমি প্রায় 80% ইনপুটগুলি 20 টিরও কম প্রতীকের দীর্ঘ বিতরণ, 20% থেকে 50 এর মধ্যে 19% এবং 1% বিরল দীর্ঘ ইনপুট বিতরণের জন্য অনুকূল করতে চাই। অবৈধ ইনপুটগুলির গতি কোনও বড় উদ্বেগ নয়। তদুপরি, আমি প্রতি 1000 থেকে 100000 ইনপুটগুলির ডিএসএল পরিবর্তনের প্রত্যাশা করি; আমি আমার ব্যাকরণ প্রসেসোসিস করতে কয়েক সেকেন্ড ব্যয় করতে পারি, কয়েক মিনিট নয়।
আমার সাধারণ ইনপুট মাপের ভিত্তিতে আমার কী পার্সিং অ্যালগরিদম (গুলি) তদন্ত করা উচিত? ত্রুটি প্রতিবেদন করা কি আমার নির্বাচনের একটি উপাদান হতে পারে, বা আমি কি দ্ব্যর্থহীন ইনপুটগুলি পার্সিংয়ে মনোনিবেশ করব এবং ত্রুটির প্রতিক্রিয়া সরবরাহ করার জন্য সম্ভবত একটি সম্পূর্ণ পৃথক, ধীর পার্সার চালনা করব?
(যে প্রকল্পে আমার এটির প্রয়োজন হয়েছিল (কিছুক্ষণ আগে), আমি সিওয়াইকে ব্যবহার করেছি , যা প্রয়োগ করা খুব বেশি কঠিন ছিল না এবং আমার ইনপুট আকারের জন্য পর্যাপ্ত পরিশ্রম করেছিলাম তবে খুব সুন্দর ত্রুটি ঘটেনি।)
x+y+z
।
+
, তাই x+y+z
প্রকৃতপক্ষে অস্পষ্ট তাই ভুল r