130242014067+李清灿+第2次实验

Posted liqingcan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了130242014067+李清灿+第2次实验相关的知识,希望对你有一定的参考价值。

软件体系结构的第二次实验(解释器风格与管道过滤器风格)

一、实验目的

  1.熟悉体系结构的风格的概念

  2.理解和应用管道过滤器型的风格。

  3、理解解释器的原理

  4、理解编译器模型

二、实验环境

  硬件: 

  软件:Python或任何一种自己喜欢的语言

三、实验内容

  1、实现“四则运算”的简易翻译器。

  结果要求:

    1)实现加减乘除四则运算,允许同时又多个操作数,如:2+3*5-6 结果是11

    2)被操作数为整数,整数可以有多位

    3)处理空格

    4)输入错误显示错误提示,并返回命令状态“CALC”

     

      图1    实验结果示例

  加强练习:

    1、有能力的同学,可以尝试实现赋值语句,例如x=2+3*5-6,返回x=11。(注意:要实现解释器的功能,而不是只是显示)

    2、尝试实现自增和自减符号,例如x++ 

    3、采用管道-过滤器(Pipes and Filters)风格实现解释器

 

                        图2  管道-过滤器风格

 

 

                     图 3  编译器模型示意图

  本实验,实现的是词法分析和语法分析两个部分。

四、实验步骤:

 代码如下:

#定义加号、减号、乘号、除号、结束符
INTEGER, PLUS, MINUS, MUL, DIV, EOF = (
    \'INTEGER\', \'PLUS\', \'MINUS\', \'MUL\', \'DIV\', \'EOF\'
)

class Token(object):
    def __init__(self, type, value):
        # 标记的类型: INTEGER, PLUS, MINUS, MUL, DIV, or EOF
        self.type = type
        # 标记的值: 非负整数的值, \'+\', \'-\', \'*\', \'/\', 或者无
        self.value = value

    def __str__(self):
        return \'Token({type}, {value})\'.format(
            type=self.type,
            value=repr(self.value)
        )

    def __repr__(self):
        return self.__str__()

class Lexer(object):
    def __init__(self, text):
        self.text = text
        # self.pos是self.text的索引值
        self.pos = 0
        self.current_char = self.text[self.pos]

    def error(self):
        raise Exception(\'Invalid character\')

    def advance(self):
        self.pos += 1
        if self.pos > len(self.text) - 1:
            self.current_char = None  # 输入结束
        else:
            self.current_char = self.text[self.pos]

    def skip_whitespace(self):
        while self.current_char is not None and self.current_char.isspace():
            self.advance()

    def integer(self):
        result = \'\'
        while self.current_char is not None and self.current_char.isdigit():
            result += self.current_char
            self.advance()
        return int(result)

    def get_next_token(self):
        while self.current_char is not None:
            if self.current_char.isspace():
                self.skip_whitespace()
                continue
            if self.current_char.isdigit():   #如果current_char是数字
                return Token(INTEGER, self.integer())
            if self.current_char == \'+\':     #如果current_char是+
                self.advance()
                return Token(PLUS, \'+\')
            if self.current_char == \'-\':     #如果current_char是-
                self.advance()
                return Token(MINUS, \'-\')
            if self.current_char == \'*\':     #如果current_char是*
                self.advance()
                return Token(MUL, \'*\')
            if self.current_char == \'/\':     #如果current_char是/
                self.advance()
                return Token(DIV, \'/\')
            self.error()                     #如果都不符合就返回错误
        return Token(EOF, None)

class Interpreter(object):
    def __init__(self, lexer):
        self.lexer = lexer
        # 将当前标记设置为输入的第一次标记
        self.current_token = self.lexer.get_next_token()

    def error(self):
        raise Exception(\'Invalid syntax\')

    def eat(self, token_type):
        if self.current_token.type == token_type:
            self.current_token = self.lexer.get_next_token()
        else:
            self.error()

    def factor(self):
        token = self.current_token
        self.eat(INTEGER)
        return token.value

    def term(self):
        result = self.factor()
        while self.current_token.type in (MUL, DIV):
            token = self.current_token
            if token.type == MUL:
                self.eat(MUL)
                result = result * self.factor()
            elif token.type == DIV:
                self.eat(DIV)
                result = result / self.factor()
        return result

    def expr(self):
        result = self.term()
        while self.current_token.type in (PLUS, MINUS):
            token = self.current_token
            if token.type == PLUS:
                self.eat(PLUS)
                result = result + self.term()
            elif token.type == MINUS:
                self.eat(MINUS)
                result = result - self.term()
        return result

def main():
    while True:
        try:
            text = raw_input(\'calc> \')
        except EOFError:
            break
        if not text:
            continue
        lexer = Lexer(text)
        interpreter = Interpreter(lexer)
        result = interpreter.expr()
        print(result)

if __name__ == \'__main__\':
    main()

 

以上是关于130242014067+李清灿+第2次实验的主要内容,如果未能解决你的问题,请参考以下文章

130242014067“电商系统购物车功能模块”需求分析与设计实验课小结

201772020113 李清华《面向对象程序设计(java)》第17周学习总结

李清华201772020113《面向对象程序设计(java)》第十三周学习总结

李清华 201772020113《面向对象程序设计(java)》第十四周学习总结

201772020113 李清华《面向对象程序设计(java)》第18周学习总结

130242014034-“电商系统某功能模块”需求分析与设计实验课小结