Python: 简单绘图语言语法分析器

在这里插入图片描述

parserclass.py

import scannerclass as sc
#或许可以在这里不分子类型,python没有定义类型的必须要求
class ExprNode:   #包含make、tree_trace、Print以及深度优先后序遍历求值的GetExprValue
    def __init__(self):
        self.OpCode = None
        self.CaseConst = None
        self.CaseParmPtr = None
        self.left = None
        self.right = None
        self.child = None
        self.MathFuncPtr = None

    #是把初始化的节点传入参数,如果不初始化,就不能直接让self引用方法
    def MakeExprNode(self,opcode=None, left=None, right=None, child=None, MathFuncPtr=None, CaseConst=None,CaseParmPtr=None):
        self.OpCode = opcode
        # python没有switch语句!!!
        if opcode == sc.Token_Type.CONST_ID:  # 常数,绑定右值
            self.CaseConst = CaseConst
        elif opcode == sc.Token_Type.T:  # 参数T,绑定地址??
            self.CaseParmPtr = CaseParmPtr
        elif opcode == sc.Token_Type.FUNC:
            self.MathFuncPtr = MathFuncPtr
            self.child = child  # 怎么关联新的节点
        else:
            self.left = left
            self.right = right

        #在expression中引用,虽然x=1,但是Print中的递归打印完了整个树
    def Tree_trace(self):
        self.PrintSyntaxTree(1)


    def PrintSyntaxTree(self, indent):
        # 由于python的print函数会自动换行,所以改为乘空,而不用for循环
        if self.OpCode == sc.Token_Type.PLUS:
            print(indent * "    " + "+")
        elif self.OpCode == sc.Token_Type.MINUS:
            print(indent * "    " + "-")
        elif self.OpCode == sc.Token_Type.MUL:
            print(indent * "    " + "*")
        elif self.OpCode == sc.Token_Type.DIV:
            print(indent * "    " + "/")
        elif self.OpCode == sc.Token_Type.POWER:
            print(indent * "    " + "**")
        elif self.OpCode == sc.Token_Type.FUNC:
            print(indent * "    " + "%s" % self.MathFuncPtr)
        elif self.OpCode == sc.Token_Type.CONST_ID:
            print(indent * "    " + "%f" % self.CaseConst)
        elif self.OpCode == sc.Token_Type.T:
            print(indent * "    " + "T")
        else:
            print("Error Tree Node!\n")
            exit(0)

        if self.OpCode == sc.Token_Type.CONST_ID or self.OpCode == sc.Token_Type.T:
            return

        if self.OpCode == sc.Token_Type.FUNC:
            self.child.PrintSyntaxTree(indent + 1)
        else:
            self.left.PrintSyntaxTree(indent + 1)
            self.right.PrintSyntaxTree(indent + 1)

    ## 深度优先后序遍历,面向对象的思想,是从面向过程修改的,这里有1个必要参数T还是得传
    #必须预定义,因为在大多数情况下不用传T值.
    #经过改错,必须传,因为子树的子树可能是FUNC,而子树不是
    def GetExprValue(self,Parameter=None):
        if self.OpCode == sc.Token_Type.NONTOKEN:
            return 0.0
        else:
            if self.OpCode == sc.Token_Type.PLUS
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值