【COMPILER 语法分析器 代码清单】

语法分析器重复代码点击链接:词法分析器代码部分

语法分析器

1.parserclass.py

import scannerclass as sc
class ExprNode(object):     ## 语法树节点类
    def __init__(self,item):        ## item 表示符号类型Token_Type
        self.item = item #表示对应的元素
        if self.item == sc.Token_Type.PLUS or self.item == sc.Token_Type.MINUS or \
                self.item == sc.Token_Type.MUL or self.item == sc.Token_Type.DIV or \
                self.item == sc.Token_Type.POWER:
            # 运算符 - 两个孩子
            self.left=None
            self.right=None
        elif self.item == sc.Token_Type.FUNC:
            self.FuncPtr = None
            self.center = None      ## 一个孩子
        self.value = None       ## 传入的所有类型都有value
    def __str__(self):      ## 叶子节点
        return str(self.item)  #print 一个 Node 类时会打印 __str__ 的返回值

    def GetExprValue(self):
        if self.item == sc.Token_Type.PLUS:
            self.value = self.right.value + self.left.value
        elif self.item == sc.Token_Type.MINUS:
            self.value = self.left.value - self.right.value
        elif self.item == sc.Token_Type.MUL:
            self.value = self.left.value * self.right.value
        elif self.item == sc.Token_Type.DIV:
            self.value = self.left.value / self.right.value
        elif self.item == sc.Token_Type.POWER:
            self.value = self.left.value ** self.right.value
        elif self.item == sc.Token_Type.FUNC:
            self.value = self.FuncPtr(self.center.value)
        return self.value

2.parserfunc.py

import scannerclass as sc
class ExprNode(object):     ## 语法树节点类
    def __init__(self,item):        ## item 表示符号类型Token_Type
        self.item = item #表示对应的元素
        if self.item == sc.Token_Type.PLUS or self.item == sc.Token_Type.MINUS or \
                self.item == sc.Token_Type.MUL or self.item == sc.Token_Type.DIV or \
                self.item == sc.Token_Type.POWER:
            # 运算符 - 两个孩子
            self.left=None
            self.right=None
        elif self.item == sc.Token_Type.FUNC:
            self.FuncPtr = None
            self.center = None      ## 一个孩子
        self.value = None       ## 传入的所有类型都有value
    def __str__(self):      ## 叶子节点
        return str(self.item)  #print 一个 Node 类时会打印 __str__ 的返回值

    def GetExprValue(self):
        if self.item == sc.Token_Type.PLUS:
            self.value = self.right.value + self.left.value
        elif self.item == sc.Token_Type.MINUS:
            self.value = self.left.value - self.right.value
        elif self.item == sc.Token_Type.MUL:
            self.value = self.left.value * self.right.value
        elif self.item == sc.Token_Type.DIV:
            self.value = self.left.value / self.right.value
        elif self.item == sc.Token_Type.POWER:
            self.value = self.left.value ** self.right.value
        elif self.item == sc.Token_Type.FUNC:
            self.value = self.FuncPtr(self.center.value)
        return self.value

3.parsermain.py

import scannerfunc as sf
import parserfunc as pf

file_name = 'test.txt'
scanner = sf.scanner(file_name)
parser = pf.Parsef(scanner)
parser.Parser()

4.测试文件test.txt

原本的测试文件是FOR T FROM 0 TO 2*PI STEP PI/50 DRAW(COS(T),SIN(T));
但是出现一点错误:COS(T)、和SIN(T)没能正确识别。
由于时间来不及了,就简化为常数。

FOR T FROM 0 TO 2*PI STEP PI/50 DRAW(COS(30),COS(45));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值