在类Zork类游戏中,玩家的输入常常不是固定的,甚至可以有语法错误,但是程序不能因此卡到这里,中断是最差劲的,不停的提示异常也很烦,程序仍要做出决定,所以需要解析关键词。
比如我想表达,我要往南方走,我的表述可以是以下(甚至有语法错误):
i will go north
i will go to the north
go to the north
go north
.....
一句话最基本的关键词为主、谓、宾, 比如我要去南方,主语“我”,谓语“去”,宾语“南方”。如何提取这些关键词?
文件:lexicon.py、parser.py
lexicon.py的结构:
lexicon = {key1: type1, key2: type2, ......}
def scan(sentence):
作用:得到一个以(key: type)元素的列表。
流程:
(1)lexicon是一个字典,储存了可能用到的单词以及它的类型,比如go to the north,字典的内容可以包括:
lexicon = {......
"go": "verb",
"to" : "trash",
"the": "trash",
"north": "noun"
......}
(2)sentence 为一个 string 参数.
(a) scan()函数得到一个sentence,先构造一个列表储存它的每一个单词。
比如得到 words = ["go", "to", "the", "north"]
(b)将words中的每一个元素对照字典得到它的类型, 并把它们存储到一个列表中。
比如得到word_list = [("go", "verb"), ("to", "trash"), ("the", "trash"), ("north", "noun")]
parser.py的结构:
class ParserError(Exception): # 抛出异常
class Sentence(object): # 有三个变量,分别储存主谓宾关键词
def peek(word_list): # 返回 word_list的第一个元素的类型
def match(word_list, expecting): # 如果word_list第一个元素的类型等于预期的类型,返回这个元组。
并在word_list中剔除这个元组。
def skip(word_list, word_type): # 剔除word_list的word_type元素直到遇到第一个非word_type元素
def parse_verb(word_list): # 得到verb类型的元素,并在word_list中剔除
def parse_object(word_list): # 得到object类型的元素,并在word_list中剔除
def parse_subject(word_list): # 得到subject类型的元素,并在word_list中剔除
def parse_sentence(word_list): # 得到一个Sentence对象,有不同的变量储存相应的关键词。
总的流程:
(1)lexicon.py 得到raw word_list.
(2)parser.py 解析word_list得到关键词。