সীমাবদ্ধ অটোম্যাটাতে কীভাবে ব্যাকরেফারেন্স, লুক হেডস এবং লুকবিহিন্ডগুলি অনুকরণ করা যায়?


26

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

বেগুনি ড্রাগনের বইটিতে আমি যা পড়েছি তা থেকে আমি বুঝতে পেরেছি যে লুকে হেড অনুকরণ করতে যেখানে নিয়মিত এক্সপ্রেশন আর এর সাথে মিলে যায় এবং কেবল যদি ম্যাচটি নিয়মিত এক্সপ্রেশন এর একটি ম্যাচ অনুসরণ করে তবে আপনি একটি অ-বিবাদাত্মক সীমাবদ্ধতা তৈরি করেন যা রাষ্ট্র যন্ত্রমানব / দ্বারা প্রতিস্থাপিত হয় ε । একইরকম একটি ডিটারমিনিস্টিক সসীম রাষ্ট্রীয় অটোম্যাটন তৈরি করা কি সম্ভব?r/srs/ε

নেতিবাচক লুক হেডস এবং লুকবিহিনগুলি সিমুলেট করার বিষয়ে কী? আমি যদি সত্যিই এটির প্রশংসা করব তবে আপনি যদি আমাকে এমন কোনও সংস্থার সাথে লিঙ্ক করেন যা কীভাবে বিশদভাবে এটি করবেন তা বর্ণনা করে।



উত্তর:


21

প্রথমত, ব্যাকরেফারেন্সগুলি সীমাবদ্ধ অটোমেটা দ্বারা সিমুলেটেড করা যায় না কারণ এগুলি আপনাকে নিয়মিত-নিয়মিত ভাষার বর্ণনার অনুমতি দেয়। উদাহরণস্বরূপ, ([ab]^*)\1ম্যাচ , যা এমনকি প্রসঙ্গ-মুক্ত নয়।{WW|W{একটি,}*}

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

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

উদাহরণস্বরূপ, পিছনের দিকে দেখুন। আমরা অবিলম্বে গ্রহনকারী "ম্যাচ-অল" রিজেক্সেপ একই সাথে চেকিং রেজিএক্সপ্যাক্ট এক্সিকিউট করে রিজেক্সএক্স সিনটিক্সের নকল করতে পারি। কেবলমাত্র সেই রাজ্যগুলি থেকে যেখানে লুক-পেছনের অভিব্যক্তিটির অটোমেটন একটি চূড়ান্ত অবস্থায় থাকে রক্ষিত অভিব্যক্তিটির অটোমেটন প্রবেশ করতে পারে। উদাহরণস্বরূপ, regexp /(?=c)[ab]+/(অভিমানী এটি রেগুলার এক্সপ্রেশন অনুবাদ নোট - সম্পূর্ণ বর্ণমালা) { একটি , , } *{ একটি , } + + { একটি , , }{একটি,,} - এর সাথে মিলে যেতে পারে{একটি,,}*{একটি,}+ +{একটি,,}*

এখানে চিত্র বর্ণনা লিখুন
[ উত্স ]

এবং আপনি করতে হবে

  • বর্তমান সূচক সংরক্ষণ যেমন যখনই আপনি প্রবেশ কুই 2 (প্রথমদিকে বা থেকে কুই 2 ) এবংআমিকুই2কুই2
  • থেকে বর্তমান সূচকে একটি (সর্বাধিক) মিলের প্রতিবেদন করুন ( - 1 ) যখনই আপনি (ছাড়ুন) কিউ 2 টি চাপুন ।আমি-1কুই2

অটোম্যাটনের বাম অংশটি যথাক্রমে [abc]*এবং c(পুনরাবৃত্ত) জন্য ক্যানোনিকাল অটোমেটার সমান্তরাল অটোমেটন কীভাবে তা নোট করুন ।

আমিআমি

মনে রাখবেন যে অ-নির্ধারণবাদ এর অন্তর্নিহিত: মূল এবং তাত্ক্ষণিকভাবে - -আপনার স্বয়ংক্রিয় মেটালটি ওভারল্যাপ হতে পারে, সুতরাং পরে মিলে যাওয়াগুলি বা ব্যাকট্র্যাকের প্রতিবেদন করার জন্য আপনাকে তাদের মধ্যে সমস্ত ট্রানজিশন সংরক্ষণ করতে হবে।


11

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

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

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

আমি http://www.regular-expressions.info/lookaround.html এ বর্ণনার উপর নির্ভর করছি । এই বৈশিষ্ট্যটিকে সমর্থনকারী রেজেক্স ইঞ্জিনগুলি (পার্ল, টিসিএল, পাইথন, রুবি, ...) সমস্তগুলি ব্যাকট্র্যাকিংয়ের উপর ভিত্তি করে বলে মনে হচ্ছে (যেমন, তারা কেবল নিয়মিত ভাষার চেয়ে অনেক বড় ভাষার সমর্থন করে)। তারা এই বৈশিষ্ট্যটি কার্য সম্পাদনের জন্য বাস্তব সসীম অটোমেটা তৈরির চেষ্টা না করে ব্যাকট্র্যাকিংয়ের তুলনামূলকভাবে "সাধারণ" এক্সটেনশন হিসাবে প্রয়োগ করছে বলে মনে হচ্ছে।

ইতিবাচক চেহারা

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

ব্যাকট্রাকিং ছাড়াই এর একমাত্র অংশটি হ'ল আপনাকে যে ইনপুটটির সেই বিন্দুটি মনে করতে হবে যেখানে লুথহ্যাড শুরু হয় এবং ম্যাচটি শেষ হওয়ার পরে আপনার ইনপুট টেপটি এই অবস্থানে ফিরিয়ে নিয়ে যায়।

নেতিবাচক লুকোহেড

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

আপনি যদি ব্যাকট্র্যাকিংয়ের উপর নির্ভর না করে এটি করতে চান তবে আপনি লুকোহেড এক্সপ্রেশনটির এনএফএকে অস্বীকার করতে পারেন, তবে আপনি ইতিবাচক চেহারাটির সাথে একইভাবে আচরণ করুন।

ইতিবাচক চেহারা

(?<=)(?=q)uuqqএনএনএন

আপনি ছেদ গ্রহণ করে backtracking না ছাড়াই এই বাস্তবায়ন করতে সক্ষম হতে পারেন "STRING যে সঙ্গে প্রান্ত Regex " Regex যে lookbehind অপারেটর সামনে আসে যাই হোক না কেন অংশ সঙ্গে। এই চতুর যদিও হতে কারণ lookbehind যাচ্ছে Regex ইনপুট বর্তমান শুরুতে চেয়ে আরও ফিরে দেখার প্রয়োজন হতে পারে।

নেতিবাচক লুকবিহাইড

নেতিবাচক লুকবাইন্ডের সিনট্যাক্সটি হ'ল (?<!রেজেক্স) । সুতরাং, উদাহরণস্বরূপ, (?<!q)uম্যাচগুলি u, তবে কেবল যদি এটির আগে না হয় q। সুতরাং এটি মেলে দিবে uমধ্যে umbrellaএবং uমধ্যে doubt, কিন্তু না uquick। আবার, এই দৈর্ঘ্য গণনা করে কাজ করতে হবে বলে মনে হয় Regex , যে অনেক অক্ষর ব্যাক আপ সঙ্গে ম্যাচের জন্য পরীক্ষা Regex , কিন্তু এখন যদি lookbehind ম্যাচ পুরো ম্যাচে ব্যর্থ।

আপনি অস্বীকৃতি গ্রহণ করে backtracking ছাড়াই এই বাস্তবায়ন করতে সক্ষম হতে পারেন Regex এবং তারপর একই কাজ হিসাবে আপনি ধনাত্মক lookbehind জন্য করতে হবে।


5

অন্তত ব্যাক-রেফারেন্সের জন্য, এটি সম্ভব নয়। উদাহরণস্বরূপ, রেজেক্স (.*)\1এমন একটি ভাষার প্রতিনিধিত্ব করে যা নিয়মিত নয়। এর অর্থ হ'ল এই ভাষাটি স্বীকৃতি দেবে এমন একটি সসীম অটোমেটন (নির্ধারক বা না) তৈরি করা অসম্ভব। আপনি যদি আনুষ্ঠানিকভাবে এটি প্রমাণ করতে চান তবে আপনি পাম্পিং লেমাকে ব্যবহার করতে পারেন ।


4

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

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

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

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