习题四十九

一,首先看书中提到的三个函数:

peek 函数:

def peek(word_list):
    if word_list:
        word = word_list[0]
        return word[0]
    else:
        return None

输入的参数是上一节所创建的函数返回的列表,当列表为空时, peek 返回 None 。

当列表不为空时,返回 word_list[0][0],即列表第一个元组的第一项。

match 函数:

def match(word_list, expecting):
    if word_list:
        word = word_list.pop(0)
        
        if word[0] == expecting:
            return word
        else:
            return None
    else:
        return None

同上,当输入参数为空列表时,match 返回 None 。

当列表不为空时,查看列表第一个元组的第一项是否为所期望的单词,

是则从列表中删除并返回第一个元组,不是则返回 None 。

skip 函数:

def skip(word_list, word_type):
    while peek(work_list) == word_type:
        match(word_list, word_type)

skip 函数通过调用其他两个函数实现。

首先判断第一个元组中储存的用户输入是否为所期望的类型,是则进行循环,

循环中将此元组删除并返回。否则不循环,即“跳过”。

解析句子的代码:

class ParserError(Exception):
    pass
    
    
class Sentence(object):

    def __init__(self, subject, verb, object):
        # remember we take ('noun','princess') tuples and convert them
        self.subject = subject[1]
        self.verb = verb[1]
        self.object = object[1]
        

def peek(word_list):
    if word_list:
        word = word_list[0]
        return word[0]
    else:
        return None
        
        
def match(word_list, expecting):
    if word_list:
        word = word_list.pop(0)
        
        if word[0] == expecting:
            return word
        else:
            return None
    else:
        return None
        
        
def skip(word_list, word_type):
    while peek(work_list) == word_type:
        match(word_list, word_type)
        
        
def parse_verb(word_list):
    skip(word_list, 'stops')
    
    if peek(word_list) == 'verb':
        return match(word_list, 'verb')
    else:
        raise ParserError("Expected a verb next.")
        
        
def parse_object(word_list):
    skip(word_list, 'stops')
    next = peek(word_list)
    
    if next == 'noun':
        return match(word_list, 'noun')
    elif next == 'direction':
        return match(word_list, 'direction')
    else:
        raise ParserError("Expected a noun or direction next.")
        
        
def parse_subject(word_list, subj):
    verb = parse_verb(word_list)
    obj = parse_object(word_list)
    
    return Sentence(subj, verb, obj)
    

def parse_sentence(word_list):
    skip(word_list, 'stops')
    
    start = peek(word_list)
    
    if start == 'noun':
        subj = match(word_list, 'noun')
        return parse_subject(word_list, subj)
    elif start == 'verb':
        #assume the subject is the player then
        return parse_subject(word_list, ('noun', 'player'))
    else:
        raese ParseError("Must start with subject, object, or verb not: %s" % start)

以下进行解析:

1~2 行:自定义异常类 ParserError ,通过继承基类 Exception 得到。

5~11 行:自定义类 Sentence ,用于储存分类后的用户输入的句子的词汇。

14~36 行:定义三个工具函数 peek, match, skip便于以后调用。

39~45 行:函数 parse_verb ,首先跳过无用的关键词(即类型为 'stop' 的词汇),

                  之后如果列表中第一个元组中存储的是 'verb' 类型,则从列表中删除

                  并返回,否则抛出异常。

48~57 行:函数 parse_object , 功能同函数 parse_verb 类似,只不过是对 'noun'

                 和 'direction' 类型进行处理。

60~64 行:函数 parse_subject, 通过调用函数 parse_verbparse_object ,

                  接收一个参数作为用户输入的主语,对用户输入进行处理,返回类 Sentence。


67~79 行:函数 parse_sentence, 这个函数相当于引擎,用来完成整个过程的调度。

                  除去无用关键词后,首先查看用户输入的第一个单词,如果是名词,则将

                 其作为主语,再通过调用 Sentence 将用户输入中的主谓宾储存起来,

                 若第一个词为动词,则将 'player' 作为主语,再调用 Sentence 类。否则

                 抛出异常。

以下是测试方案:

from nose.tools import *
from ex49.lexicon import *

def test_parse_verb():
    assert_raises(ParserError, parse_verb, [('noun', 'door')])
    assert_equal(parse_verb([('verb', 'go')]), ('verb','go'))
def test_parse_object():
    assert_raises(ParserError, parse_object, [('verb', 'go')])
    assert_equal(parse_object([('noun', 'bear')]), ('noun', 'bear'))
def tesst_parse_sentence():
    assert_raises(ParserError, parse_sentence, [('direction', 'north')])
def test_Sentence():
    sentence=Sentence(('noun','player'),('verb', 'go'),('noun', 'bear'))
    assert_equal(sentence.subject, 'player')
    assert_equal(sentence.verb, 'go')
    assert_equal(sentence.object, 'bear')


转载于:https://my.oschina.net/u/2519674/blog/644702

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的纺织品企业财务管理系统,源码+数据库+毕业论文+视频演示 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对纺织品企业财务信息管理的提升,也为了对纺织品企业财务信息进行更好的维护,纺织品企业财务管理系统的出现就变得水到渠成不可缺少。通过对纺织品企业财务管理系统的开发,不仅仅可以学以致用,让学到的知识变成成果出现,也强化了知识记忆,扩大了知识储备,是提升自我的一种很好的方法。通过具体的开发,对整个软件开发的过程熟练掌握,不论是前期的设计,还是后续的编码测试,都有了很深刻的认知。 纺织品企业财务管理系统通过MySQL数据库与Spring Boot框架进行开发,纺织品企业财务管理系统能够实现对财务人员,员工,收费信息,支出信息,薪资信息,留言信息,报销信息等信息的管理。 通过纺织品企业财务管理系统对相关信息的处理,让信息处理变的更加的系统,更加的规范,这是一个必然的结果。已经处理好的信息,不管是用来查找,还是分析,在效率上都会成倍的提高,让计算机变得更加符合生产需要,变成人们不可缺少的一种信息处理工具,实现了绿色办公,节省社会资源,为环境保护也做了力所能及的贡献。 关键字:纺织品企业财务管理系统,薪资信息,报销信息;SpringBoot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值