栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【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));
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968468.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号