অনুসরণ সেট খুঁজুন


14

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

আমি এই স্ট্যানফোর্ড কোর্সের জন্য বিশেষ হ্যান্ডআউট 08 এবং 09 (পৃষ্ঠা 7 থেকে) সুপারিশ করতে পারি । আমি এই হ্যান্ডআউটগুলি থেকে একটি চিট শীটও বের করে নিয়েছি - আমি এই চ্যালেঞ্জটি যে কেউ এটি পড়তে চাইছে তা প্রস্তাব করছি


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

ইনপুটটি একক মুদ্রণযোগ্য ASCII স্ট্রিং বা মুদ্রণযোগ্য ASCII লাইনের অ্যারে হিসাবে দেওয়া হয়। $ইনপুটটির শেষ নির্দেশ করতে আপনি যেকোন যুক্তিসঙ্গত বিন্যাসে সেটগুলি আউটপুট করতে পারেন (হয় আক্ষরিক আউটপুট হিসাবে, বা কোনও সেট এর ভিতরে স্ট্রিং ইত্যাদি)। আপনি ধরে নিতে পারেন নিচের বিন্যাস অনুসারে ইনপুটটি সর্বদা বৈধ।

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

উদাহরণ হিসাবে, নিম্নলিখিত ব্যাকরণ:

এস S এসা | বিএসবি | ε

হিসাবে দেওয়া হবে:

S 'a' S 'a'
S 'b' S 'b'
S

ইনপুট / আউটপুট উদাহরণ:

In:
S 'a' S 'a'
S 'b' S 'b'
S

Out:
S {'a', 'b', $}

In:
S A B C
A 'a'
A C 'b'
A
B C
B 'd' A
B
C 'e'
C 'f' 

Out:
S {$}
A {'d', 'e', 'f'}
B {'e', 'f'}
C {'b', 'e', 'f', $}

In:
Start Alice Bob
Alice Charlie 'a'
Alice
Bob Bob 'a' Alice Charlie
Bob '!!!'
Charlie 'b'
Charlie

Out:
Start {$}
Alice {'a', '!!!', 'b', $}
Bob {'a', $}
Charlie {'a', $}

বাইটস মধ্যে সংক্ষিপ্ত কোড।


4
অনুমান করা যায় যে লোকেদের কোনও প্রসঙ্গমুক্ত ব্যাকরণটি কী ভাল বলে মনে হয় তা ঠিক মনে হয় তবে আমি মনে করি যে আপনি যদি এখানে কেবল অনুসরণের পরিবর্তে কোনও অনুসরণের সংজ্ঞাটি এখানে যুক্ত করেন তবে এটি চ্যালেঞ্জের ক্ষতি করবে না।
মার্টিন ইন্ডার

1
এটি বিশ্ববিদ্যালয়ে " সংকলক নির্মাণ " থেকে কিছু স্মৃতি ফিরিয়ে আনে , যেখানে আমাদের প্রচুর অনুরূপ কাজগুলি সমাধান করতে হয়েছিল।
insertusernamehere

উত্তর:


3

পার্ল, 257 বাইট

জন্য +4 অন্তর্ভুক্ত -0p

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

perl -M5.010 follow.pl
E T e
e '+' T e
e
T F t
t '*' F t
t
F '(' E ')'
F 'id'
^D

non-terminal literalকোনও নির্দিষ্ট ক্রমে একটি তালিকা হিসাবে অনুসরণ সেটগুলি আউটপুট করে । এটির উপরের উদাহরণের জন্য ফলাফলগুলি:

F ')'
F #
t ')'
t #
T ')'
T #
F '+'
t '+'
T '+'
F '*'
e ')'
e #
E ')'
E #

follow.pl:

#!/usr/bin/perl -0n
s/'.*?'/~$&/eg;s% (?=(\w.*\n))%$_.=">$1"%reg;/\s/;$_.=">$` #\n";s%^((\w+)\K ?\S*).*%$s{$1}++||"\$a.=s/ $2\\b/$&/rg"%eemgr,s%^(\w+ ).*?(\w+)$%"\$a.=s/>$1/>$2 /rg"%eermg,$_.=$a,s%>.*\xd8\K .*%%g,s%.+\n%$&x!/\n$&/g%eg until$$_++;s/\xd8.*?\xd8/~$&/eg;say/>(\w+ \W\S*\n)/g

যেমন দেখানো হয়েছে তেমন কাজ করে তবে দাবি করা স্কোরটি পাওয়ার জন্য প্রতিস্থাপন করুন \xd8এবং \nতাদের আক্ষরিক সংস্করণ দ্বারা।

এটির উন্নতি করা সম্ভব হবে কারণ firstসেটগুলিতে সেটগুলিতে রূপান্তর followকরা বর্তমানে খুব বিশ্রী।

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