নিয়মিত এক্সপ্রেশন একটি প্রোগ্রামিং ভাষা?


27

একাডেমিক অর্থে, নিয়মিত প্রকাশগুলি কি প্রোগ্রামিং ভাষা হিসাবে যোগ্যতা অর্জন করে?

আমার কৌতূহলের প্রেরণা হ'ল এমন একটি প্রশ্ন যা আমি সবেমাত্র জিজ্ঞাসা করলাম "এক্স কি রেজেক্স করতে পারে?" এবং এটি আমাকে অবাক করে দিয়েছিল যে এগুলি ব্যবহারের সম্ভাব্য সমাধানগুলি সম্পর্কে জেনেরিক অর্থে কী বলা যেতে পারে।

আমি মূলত জিজ্ঞাসা করছি, "নিয়মিত প্রকাশগুলি কি টুরিং সম্পূর্ণ"?


9
সুতরাং মূলত, আপনি কি জিজ্ঞাসা করছেন "নিয়মিত প্রকাশগুলি কি টুরিং সম্পূর্ণ"?
হতাশ

এটির সাথে যদি কেউ আরও বিশদ
বিবরণী দেয়

4
"নিয়মিত প্রকাশগুলি সম্পূর্ণরূপে সম্পূর্ণ হয়" এর জন্য ভাষার ধরণের এবং চমস্কি হায়ারচারি

5
(একটি সম্পাদনার চেয়ে 1 মিনিট পরে) এবং আপনি যদি প্রশ্ন এবং ব্যাখ্যাটির সেই পথটি শীর্ষে রাখতে চান তবে আপনি সিএস তত্ত্বের মত বিনিময়টি সন্ধান করতে পারেন । পাম্পিং থিম জন্য সবচেয়ে সহজ অপ্রমাণ হয় "একটি নিয়মিত ভাষা মেলাতে পারে একটি ^ বিশেষ দ্রষ্টব্য ^ n" (এখানে যা টুরিং মেশিন দ্বারা তুলনীয় যায়)।

1
আমি মনে করি তিনি জিজ্ঞাসা করছেন যে তিনি তার "প্রোগ্রামিং ভাষাগুলি" বিভাগের অধীনে তার জীবনবৃত্তান্তটি রাখতে পারেন কিনা। সেক্ষেত্রে উত্তরটি হ'ল না। এটি "প্রযুক্তি" বিভাগের অধীনে যায়।
নীল

উত্তর:


46

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

প্রোগ্রামিং ভাষাসমূহ সাধারণত ভাষা হিসেবে সংজ্ঞায়িত করা হয় সম্পূর্ণ টুরিং । এই জাতীয় ভাষা অবশ্যই কোনও গণনীয় ফাংশন প্রক্রিয়া করতে সক্ষম হবে । রেজেক্স এই বিভাগে ফিট করে না।

যদি আপনি এমন একটি ভাষা চান যা দেখে রেগেক্সের মতো লাগে তবে জে চেষ্টা করুন try


1
+1, আমি দেখেছি তবে নিয়মিত প্রকাশের টিউরিংয়ের সম্পূর্ণতার ভাল আলোচনা / অস্বীকৃতি খুঁজে পাইনি।
হতাশ

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

1
এছাড়া নোট গুরুত্বপূর্ণ যে Regex যে সঞ্চালিত primality পরীক্ষামূলক ( montreal.pm.org/tech/neil_kandalgaonkar.shtml#primality_regex ) Perl regexes যে একাডেমিক অর্থে চেয়ে "নিয়মিত প্রকাশ" আরো শক্তিশালী বৈশিষ্ট্য ব্যবহার করে - যেমন, সঞ্চিত গ্রুপ । নিয়মিত ভাষাগুলিতে স্বেচ্ছাসেবী মেমরির প্রয়োজন হয় না।
এরিক ডব্লিউ।

5
@ ওয়ার্ল্ড ইঞ্জিনিয়ার: আকর্ষণীয় এবং দরকারী প্রোগ্রামিং ভাষা রয়েছে যা টুরিং সম্পূর্ণ নয়। ডেটাগলজ, এসকিউএল এবং এসিএল 2 হ'ল কয়েকটি উদাহরণ যা মাথায় আসে, তেমনি টাইপ-থিওরি-ভিত্তিক উপপাদ্য প্রবাদগুলির মতো জিনিসগুলিতে ব্যবহৃত বেশ কয়েকটি দৃ calc়-স্বাভাবিককরণের ল্যাম্বদা ক্যালকুলি ব্যবহৃত হয়।
রায়ান কুল্পিপার

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

14

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

" প্রোগ্রামিং ল্যাঙ্গুয়েজ " বলতে আমরা কী বুঝি ?

একটি সহজ উত্তর "প্রোগ্রাম তৈরি করতে ব্যবহৃত একটি ভাষা" হতে পারে। অবশ্যই, তবে: কি ধরণের প্রোগ্রাম? এমন কোনও ভাষা সম্পর্কে যা কিছু ধরণের প্রোগ্রাম তৈরিতে ব্যবহৃত হতে পারে তবে অন্যান্য ধরণের প্রোগ্রাম নয়? চরম ঘটনাগুলি চিত্রিত করার জন্য এখানে দুটি নির্দিষ্ট উদাহরণ দেওয়া হল:

1) এম নামে একটি কাল্পনিক ভাষা এইভাবে কাজ করে: প্রোগ্রামটিতে যদি "m" একক অক্ষর থাকে তবে এটি মাইনসুইপারের একটি খেলা তৈরি করে। বাকি সমস্ত একটি বাক্য গঠন ত্রুটি।

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

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

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

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

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

" নিয়মিত অভিব্যক্তি " বলতে আমরা কী বুঝি ?

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

নিয়মিত এক্সপ্রেশনগুলি প্রকাশ করার কথা: "কিছুই নয়", "এই চিঠি", "এটি, এরপরে" "," এটি বা এটি "," এটি, এক বা একাধিকবার পুনরাবৃত্তি ", এবং" এটি নয় "। - এটি গাণিতিক সংজ্ঞা। অন্য যে কোনও কিছুই হ'ল পূর্ববর্তী উপাদানগুলি থেকে তৈরি একটি সুবিধাজনক শর্টকাট। উদাহরণস্বরূপ "এটি, দুই বা তিনবার পুনরাবৃত্তি করা" অনুবাদ করা যেতে পারে "এটি এর পরে, এরপরে (এটি বা কিছুই নয়)", তবে "বা {২,৩}" লেখার চেয়ে এটি "বাবার চেয়ে আরও সুবিধাজনক হতে পারে" (বি। এ)?".

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

সুতরাং, মূল বিষয়টিতে ফিরে আসুন: নিয়মিত এক্সপ্রেশন হয় (যেমন সংজ্ঞায়িত হয়: চমস্কি শ্রেণিবদ্ধের নিয়মিত ভাষাগুলির বিবরণ; বা হিসাবে: প্রাক্তন, আরও \ 1 ক্রিয়াকলাপ) একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ (সংজ্ঞায়িত: টুরিং-সম্পূর্ণ)? উত্তর না হয় । না, আপনি নিয়মিত অভিব্যক্তি ব্যবহার করে কোনও অ্যালগরিদম বাস্তবায়ন করতে পারবেন না এবং যে কোনও অ্যালগরিদম বাস্তবায়নের সক্ষমতা হ'ল কম্পিউটার বিজ্ঞান অধ্যয়নরত লোকেরা সাধারণত প্রোগ্রামিং ভাষার মর্ম হিসাবে বুঝতে পারে।

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

এবং যদি আপনি হয় না প্রযুক্তিগত বিবরণ আগ্রহী, উত্তর হতে পারে: আপনি নিয়মিত এক্সপ্রেশন (এবং অন্য কিছুই) একটি প্রোগ্রাম করতে ব্যবহার করতে পারি? না, তবে কেন এটিকে প্রোগ্রামিং ভাষা বলবেন? (তবে এর মতো একটি উত্তর এখানে ডাউনলোড এবং মুছে ফেলা হয়েছিল, এ কারণেই আমি এই দীর্ঘ সংস্করণটি লিখেছি))

সম্পাদনা: এছাড়াও, যে কোনও নতুন সংযোজিত নতুন বৈশিষ্ট্যগুলি সহ "নিয়মিত অভিব্যক্তিগুলির" নিজস্ব নিজস্ব বৈকল্পিক প্রয়োগ করে একটি গ্রন্থাগার তৈরি করতে পারে। কিছু মুহুর্তে, নতুন সিস্টেমগুলি পুরো সিস্টেমটিকে ট্যুরিং-সম্পূর্ণ হওয়ার পক্ষে যথেষ্ট হতে পারে। একটি তুচ্ছ উদাহরণ হ'ল কিছু নতুন বাক্য গঠন ব্যবহার করে টিউরিং-সম্পূর্ণ ভাষা এম্বেড করা হবে; তবে এটি স্পষ্টতই কম ঘটতে পারে। এটি ইতিমধ্যে ঘটেছে।


0

নেট। এ, রেজেক্স কেবলমাত্র একাধিক রূপের শর্তাদি পরিচালনা করতে পারে না, পরিবর্তনের এবং বর্ণমালার বিভিন্ন সংমিশ্রণ ব্যবহার করে এটি তার নিজের স্ট্যাকটিও পরিচালনা করতে পারে।

(?xm)
    (?>
        <(?<Tagname>table)[^>]*>
    )
(?(Tagname)
    (
        </(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)
    |
        (?>
            <(?<Tagname>[a-z][^\s>]*)[^>]*>
        )
    |
        [^<]+
    )+?
    (?(Tagname)(?!))
)

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

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

রেগেক্সের সাথে (কখনও নয়) পার্স এইচটিএমএল-এর অত্যধিক ব্যবহৃত স্কোয়াংয়ের প্রতিক্রিয়ায় আমি এগিয়ে গিয়েছিলাম এবং পোস্ট টাইপ করা একটি প্রতিক্রিয়া পোস্ট করতে পারি যা এইচটিএমএল পার্সিং করছে

অ্যানোটার উদাহরণ (কেবল একটি প্রদর্শন) নিম্নলিখিত:

Function Regex("<(td>)((?:[^<]*(?(?!</\1)<))*)</\1")
    Group(0) = "<"
    Group(1) = "td>"
    Group(0) += Group(1)
    Group(2) = LoopMethod()
    Group(0) += Group(2)
    Group(0) += "</" & Group(1)
    Return Group()
End Function

Function LoopMethod()
    retGroup = ""
    Do
        tmpGroup = Everything that is NOT an Opening HTML Delimeter
        If the Text following tmpGroup Does NOT Equal "</" & Group(1) Then
            tmpGroup += "<"
            retGroup += tmpGroup
        Else
            Exit Do
        End If
    Loop
    Return retGroup
End Function

আবার, এইচটিএমএল তোতা জন্য: এইচটিএমএল পার্সিং

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

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


যদি আপনি এটি "পরীক্ষা" করেন এবং এটি কাজ করে না, আপনাকে অবশ্যই বুঝতে হবে যে বেশিরভাগ রেজেক্স ইঞ্জিন "পরীক্ষক" হ্যান্ডেল করে না et নেট রেজেক্স (ব্যালেন্সিং গ্রুপ)। আপনাকে এটি নেট। প্রোগ্রামে ব্যবহার করতে হবে '
সুমেমে

3
ওগো গোশ, এইচটিএমএলকে বিশ্লেষণ করার জন্য আপনাকে কখনই রেজিেক্সগুলি ব্যবহার করা উচিত নয় এর জন্য এটি প্রথম প্রমাণ । কখনো।
টাকরোয়

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

1
প্রতিক্রিয়া হিসাবে তোতা স্কোয়াওকিং। আমি এটি তৈরি করেছি: এইচটিএমএলকে পার্সিং করছি
সুমের

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

0

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

নিয়মিত প্রকাশের সাথে বার বার সন্ধান / প্রতিস্থাপন করা একটি টুরিং-সম্পূর্ণ প্রোগ্রামিং ভাষা

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

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

0000#12345:01-5:0#0000000

এটি একটি পাঠকের সাথে প্রতীকগুলির টেপ হিসাবে পড়া যেতে পারে:

[left symbols]#[set of states]:[set of symbols]-[current state]:[current symbol]#[right symbols]

রাজ্য 5 এ 0 পড়ার নিয়মের জন্য, 1 লিখুন এবং এর রাজ্যটি 3 তে পরিবর্তন করে বাম দিকে সরানোর জন্য, আমরা নিম্নলিখিত সূচনাটি ব্যবহার করে এটি বিমূর্ত করি:

5:0 => 1, 3:[left]

আমরা পূর্বের স্বরলিপিটিকে অনুসন্ধানের নিয়মিত অভিব্যক্তিতে এনকোড করি:

(\d)#(1)(2)(3)(4)(5):(0)(1)-5:0#

এবং এর প্রতিস্থাপন এক্সপ্রেশন (জাভাস্ক্রিপ্ট-মত)

#12345:01-$4:$1#$8

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

5:0 => 1, 3:left
3:0 => 1, 5:right
5:1 => 1, 5:right
3:1 => 1: 3:stop

আমরা এগুলিকে একটি অনুসন্ধানে এনকোড করেছি এবং এক্সপ্রেশনটি প্রতিস্থাপন করব:

Search:
(\d)#(1)(2)(3)(4)(5):(0)(1)-5:0#|#(1)(2)(3)(4)(5):(0)(1)-3:0#(\d)|#(1)(2)(3)(4)(5):(0)(1)-5:1#(\d)|#(1)(2)(3)(4)(5):(0)(1)-3:1#

Replace by:
$15$23#12345:01-$4$13$21$27:$1$16$24$31#$8

আপনার প্রিয় জাভাস্ক্রিপ্ট ইঞ্জিনে এটি ব্যবহার করে দেখুন:

function turingstep(s) {
  return s.replace(/(\d)#(1)(2)(3)(4)(5):(0)(1)-5:0#|#(1)(2)(3)(4)(5):(0)(1)-3:0#(\d)|#(1)(2)(3)(4)(5):(0)(1)-5:1#(\d)|#(1)(2)(3)(4)(5):(0)(1)-3:1#/g,"$15$23#12345:01-$4$13$21$27:$1$16$24$31#$8");
}

var tape = "0000#12345:01-5:0#0000000"
for(var i = 0; i < 6; i++) {
  console.log(tape)
  tape = turingstep(tape)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.