ठीक है, इसलिए मैंने इस परियोजना के बारे में छोटे प्रश्नों के एक समूह से पूछा है, लेकिन मुझे अभी भी उन डिज़ाइनों में अधिक विश्वास नहीं है जिनके साथ मैं आ रहा हूं, इसलिए मैं एक व्यापक पैमाने पर एक प्रश्न पूछने जा रहा हूं ।एक साधारण व्याकरण का विश्लेषण कैसे करें?
मैं पाठ्यक्रम सूची के लिए पूर्व-आवश्यक विवरण पार्स कर रहा हूं। विवरण लगभग हमेशा एक निश्चित रूप का पालन करते हैं, जो मुझे लगता है कि मैं उनमें से अधिकांश को पार्स कर सकता हूं।
पाठ से, मैं पाठ्यक्रम के पूर्व-आवश्यक संबंधों का एक ग्राफ उत्पन्न करना चाहता हूं। (यह हिस्सा है, आसान हो जाएगा के बाद मैं डेटा पार्स है।)
कुछ नमूना इनपुट और आउटपुट:
"CS 2110" => ("CS", 2110) # 0
"CS 2110 and INFO 3300" => [("CS", 2110), ("INFO", 3300)] # 1
"CS 2110, INFO 3300" => [("CS", 2110), ("INFO", 3300)] # 1
"CS 2110, 3300, 3140" => [("CS", 2110), ("CS", 3300), ("CS", 3140)] # 1
"CS 2110 or INFO 3300" => [[("CS", 2110)], [("INFO", 3300)]] # 2
"MATH 2210, 2230, 2310, or 2940" => [[("MATH", 2210), ("MATH", 2230), ("MATH", 2310)], [("MATH", 2940)]] # 3
पूरी विवरण सिर्फ एक कोर्स है, तो यह उत्पादन सीधे है।
पाठ्यक्रम संयुक्त ("और") कर रहे हैं, वे एक ही सूची
पाठ्यक्रम disjoined रहे हैं ("या") के सभी उत्पादन कर रहे हैं, वे अलग-अलग सूचियों में हैं
यहां, हमारे पास "और" और "या" दोनों हैं।
एक चेतावनी करना अधिक आसान हो: ऐसा लगता है कि की "और"/"या" वाक्यांशों नेस्टिंग कभी नहीं से अधिक के रूप में उदाहरण में दिखाया गया है 3.
क्या यह करने के लिए सबसे अच्छा तरीका है ? मैंने पीएलवाई के साथ शुरुआत की, लेकिन मैं समझ नहीं पाया कि संघर्ष को कम/कम करने के तरीके को कैसे हल किया जाए। यह कैसे parseString()
के उत्पादन में संशोधित करने के लिए कम स्पष्ट है,
def p_course(p):
'course : DEPT_CODE COURSE_NUMBER'
p[0] = (p[1], int(p[2]))
PyParse साथ
: प्लाई का लाभ यह है हेरफेर करने के लिए क्या प्रत्येक पार्स नियम उत्पन्न करता है आसान है। मैं एक ऑब्जेक्ट में राज्य को रखने और उस से आउटपुट बनाने के @ एलेक्स मार्टेलि के विचार पर निर्माण पर विचार कर रहा था, लेकिन मुझे यकीन नहीं है कि यह वास्तव में कैसे किया जाता है।
def addCourse(self, str, location, tokens):
self.result.append((tokens[0][0], tokens[0][1]))
def makeCourseList(self, str, location, tokens):
dept = tokens[0][0]
new_tokens = [(dept, tokens[0][1])]
new_tokens.extend((dept, tok) for tok in tokens[1:])
self.result.append(new_tokens)
उदाहरण के लिए, संभाल करने के लिए "या" मामलों:
def __init__(self):
self.result = []
# ...
self.statement = (course_data + Optional(OR_CONJ + course_data)).setParseAction(self.disjunctionCourses)
def disjunctionCourses(self, str, location, tokens):
if len(tokens) == 1:
return tokens
print "disjunction tokens: %s" % tokens
कैसे disjunctionCourses()
पता है जो छोटे वाक्यांशों अंगों को अलग-अलग करना के लिए? यह सब टोकन है, लेकिन अब तक पार्स किया गया है result
में संग्रहीत किया गया है, तो फ़ंक्शन कैसे बता सकता है कि result
में कौन सा डेटा token
के कौन से तत्वों से मेल खाता है? मुझे लगता है मैं टोकन के माध्यम से खोज सकते हैं, तो एक ही डेटा के साथ result
का एक तत्व मिल जाए, लेकिन यह है कि जटिल लग रहा है ...
इसके अलावा, कई विवरण इस तरह, विविध पाठ शामिल हैं:
"CS 2110 or permission of instructor"
"INFO 3140 or equivalent experience"
"PYSCH 2210 and sophomore standing"
लेकिन यह महत्वपूर्ण नहीं है कि मैं उस पाठ को पार्स करता हूं।
इस समस्या से संपर्क करने का एक बेहतर तरीका क्या है?
आपके नमूना इनपुट और आउटपुट में संख्या उनकी चर्चा में नंबरिंग से मेल नहीं खाती है। –