lexicon.py的代码如下:
#-*- coding: utf-8 -*-
#预定单词词汇表
directions = ('north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back')
verbs = ('go', 'stop', 'kill', 'eat')
stops = ('the', 'in', 'of', 'from', 'at', 'it')
nouns = ('door', 'bear', 'princess', 'cabinet')
#扫描器
def scan(stuff):
#断句
words = stuff.split()
#创建一个空列表
sentence = []
#循环判断每个单词,并给每个单词添加记号
#最后,返回由记号和单词组成的列表
for word in words:
if word in directions:
sentence.append(('direction', word))
elif word in verbs:
sentence.append(('verb', word))
elif word in stops:
sentence.append(('stop', word))
elif word in nouns:
sentence.append(('noun', word))
else:
try:
sentence.append(('number', int(word)))
except ValueError:
sentence.append(('error', word))
return sentence
测试用例的代码如下(原书提供):
from nose.tools import *
from ex48 import lexicon
def test_directions():
assert_equal(lexicon.scan("north"), [('direction', 'north')])
result = lexicon.scan("north south east")
assert_equal(result, [('direction', 'north'), ('direction', 'south'), ('direction', 'east')])
def test_verbs():
assert_equal(lexicon.scan("go"), [('verb', 'go')])
result = lexicon.scan("go kill eat")
assert_equal(result, [('verb', 'go'), ('verb', 'kill'), ('verb', 'eat')])
def test_stops():
assert_equal(lexicon.scan("the"), [('stop', 'the')])
result = lexicon.scan("the in of")
assert_equal(result, [('stop', 'the'), ('stop', 'in'), ('stop', 'of')])
def test_nouns():
assert_equal(lexicon.scan("bear"), [('noun', 'bear')])
result = lexicon.scan("bear princess")
assert_equal(result, [('noun', 'bear'), ('noun', 'princess')])
def test_numbers():
assert_equal(lexicon.scan("1234"), [('number', 1234)])
result = lexicon.scan("3 91234")
assert_equal(result, [('number', 3), ('number', 91234)])
def test_errors():
assert_equal(lexicon.scan("ASDFADFASDF"), [('error', 'ASDFADFASDF')])
result = lexicon.scan("bear IAS princess")
assert_equal(result, [('noun', 'bear'), ('error', 'IAS'), ('noun', 'princess')])
测试结果如下:
脚本测试如下
print scan("go north")
print scan("kill the princess")
print scan("eat the bear")
print scan("open the door and smack the bear in the nose")
输出结果与ex49一致