わかりました、このプロジェクトについてたくさんの小さな質問をしましたが、私が思いついたデザインにはまだあまり自信がありませんので、より広いスケールで質問します.
コースカタログの前提条件の説明を解析しています。ほとんどの場合、記述は特定の形式に従っているため、ほとんどの記述を解析できると思います。
テキストから、コースの前提関係のグラフを生成したいと思います。(データを解析した後、その部分は簡単になります。)
入力と出力の例:
"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
説明全体が単なるコースの場合は、直接出力されます。
コースが結合されている場合 ("and")、それらはすべて同じリストに出力されます。
コースが切り離されている(「または」)場合、それらは別々のリストにあります
ここでは、"and" と "or" の両方があります。
簡単にするための 1 つの警告: "and"/"or" 句の入れ子は、例 3 に示されているよりも大きくなることはないようです。
これを行う最善の方法は何ですか?PLY から始めましたが、reduce/reduce の競合を解決する方法がわかりませんでした。PLY の利点は、各解析ルールが生成するものを簡単に操作できることです。
def p_course(p):
'course : DEPT_CODE COURSE_NUMBER'
p[0] = (p[1], int(p[2]))
PyParse では、 の出力を変更する方法があまり明確ではありませんparseString()
。オブジェクトに状態を保持し、そこから出力を構築するという@Alex Martelliのアイデアに基づいて構築することを検討していましたが、それがどのように行われるのが最適かは正確にはわかりません。
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"
しかし、そのテキストを解析することは重要ではありません。
この問題にアプローチするより良い方法は何ですか?