अनुसरण सेट खोजें


14

नीचे दी गई चुनौती के लिए आपको औपचारिक पार्सर सिद्धांत से परिचित होना चाहिए। यदि आप नहीं जानते हैं कि प्रश्न क्या पूछ रहा है क्योंकि आप नहीं जानते कि शब्दों का अर्थ क्या है, संदर्भ-मुक्त व्याकरण और प्रथम / अनुवर्ती सेट बहुत सारे विश्वविद्यालय पाठ्यक्रमों में शामिल हैं।

मैं इस स्टैनफोर्ड कोर्स की सिफारिश कर सकता हूं , विशेष रूप से 08 और 09 (पेज 7 से)। मैंने इन हैंडआउट्स से एक चीट शीट भी निकाली है - मैं किसी को भी इसे पढ़ने के लिए इस चुनौती का प्रयास करने की सलाह देता हूं


एक प्रोग्राम या फ़ंक्शन लिखें जो एक संदर्भ-मुक्त व्याकरण दिया गया हो, जो प्रत्येक गैर-विषयक का अनुसरण सेट पाता है। अनौपचारिक रूप से, एक नॉनटर्मिनल का अनुसरण सेट टर्मिनलों का एक सेट है और $(जिसका अर्थ एंड-ऑफ-इनपुट) है, जिसे आप संभवतः उस टर्मिनल के बाद एक वैध वाक्य में पा सकते हैं।

इनपुट को एकल मुद्रण योग्य ASCII स्ट्रिंग या मुद्रण योग्य ASCII लाइनों की सरणी के रूप में दिया गया है। आप $इनपुट के अंत को इंगित करने के लिए (या तो शाब्दिक आउटपुट, या एक सेट के अंदर स्ट्रिंग के रूप में) का उपयोग करके किसी भी उचित प्रारूप में सेट का उत्पादन कर सकते हैं । आप मान सकते हैं कि इनपुट हमेशा नीचे दिए गए प्रारूप के अनुसार मान्य है।

संदर्भ मुक्त व्याकरण बहुत ही सरलीकृत तरीके से दिया गया है। हर लाइन में एक ही उत्पादन होता है। हर उत्पादन प्रतीकों की एक अलग सूची है। एक टर्मिनल एपोस्ट्रोफस (जैसे '**') से घिरे पात्रों की एक स्ट्रिंग है । सादगी के लिए आप मान सकते हैं कि टर्मिनलों में रिक्त स्थान नहीं हैं, लेकिन यह अच्छा होगा यदि आपका कार्यक्रम इसकी अनुमति देता है। एक nonterminal रिक्त स्थान या नहीं युक्त किसी भी स्ट्रिंग हो सकता है $। खाली उत्पादन (आमतौर पर ε के साथ संकेत दिया जाता है) केवल एक पंक्ति है जिसमें केवल बाएं हाथ की तरफ नॉनटर्मिनल होता है। पहली पंक्ति प्रारंभ प्रतीक को परिभाषित करने वाला उत्पादन है।

एक उदाहरण के रूप में, निम्नलिखित व्याकरण:

एस → आसा | bSb | ε

के रूप में दिया जाएगा:

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
यह विश्वविद्यालय में " संकलक निर्माण " से कुछ यादें वापस लाता है , जहां हमें बहुत सारे समान कार्यों को हल करना था।
इन्सर्टसर्नमीयर

जवाबों:


3

पर्ल, 257 बाइट्स

के लिए +4 शामिल है -0p

STDIN पर व्याकरण दें (बिना अनुगामी रिक्त स्थान के। दूसरे उदाहरण में अतिरिक्त स्थान निकालना सुनिश्चित करें)। गैर-टर्मिनल नामों में केवल अक्षर, अंक और होते हैं _। इनपुट के अंत को इंगित करने के #बजाय उपयोग करता है $। रिक्त स्थान वाले शाब्दिक संभाल सकते हैं

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है, वर्तमान में बहुत ही अजीब है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.