简单赋值语句翻译(python)

逆波兰实现中间代码生成

  • 全部代码如下:
# -*- coding: utf-8 -*-
# @File  : exp4.py
# @Author: kimoto
# @Date  : 2018/12/21
# @Desc  : 编译原理——简单的翻译程序

# 定义优先权
ops_rule = {
    '+': 1,
    '-': 1,
    '*': 2,
    '/': 2
}

# expression = []

def middle_to_after(s):
    """
    中缀表达式转化后缀表达式.
    :param s: 中缀表达式的字符串表示,本程序中采用操作符跟数值之间用空格分开,例如:
    "9 + ( 3 - 1 ) * 3 + 10 / 2"
    :return: 后缀表达式,数组的形式,每个数值或者操作符占一个数组下标.
    """
    expression = []
    ops = []
    for item in s:
        if item in ['+', '-', '*', '/']:   # 操作符
            while len(ops) >= 0:
                if len(ops) == 0:
                    ops.append(item)
                    break
                op = ops.pop()
                if op == '(' or ops_rule[item] > ops_rule[op]:
                    ops.append(op)
                    ops.append(item)
                    break
                else:
                    expression.append(op)
        elif item == '(':  # 左括号,直接入操作符栈
            ops.append(item)
        elif item == ')':  # 右括号,循环出栈道
            while len(ops) > 0:
                op = ops.pop()
                if op == '(':
                    break
                else:
                    expression.append(op)
        else:
            expression.append(item)   # 数值,直接入表达式栈

    while len(ops) > 0:
        expression.append(ops.pop())

    return expression


def get_result(expression, i):
    """
    :param expression:  表达式栈
    :return: 四元式存放栈
    """
    ss = [] # 输出栈
    tmp = [] # 临时栈


    for item in expression:

        if(item not in ops_rule.keys()):
            tmp.append(item)
        else:
            # print(tmp)
            x = tmp.pop()
            y = tmp.pop()
            s = "({}, {}, {}, t{})".format(item, x, y, i)
            tmp.append("t{}".format(i))
            i+=1
            ss.append(s)

    return ss, i

def mprint(ss):

    res = ""
    for s in ss:
        res += s + "\n"

    return res


def app(slist):

    i=1
    output = []
    for s in slist:
        frist, later = s.split("=")
        exps = middle_to_after(later)
        # print(exps)
        res, i = get_result(exps, i)
        res.append("(=, t{}, -, {})".format(i - 1, frist))
        #print(res)
        output.extend(res)
        # print(output)
    return output


if __name__ == '__main__':


    slist = ["a=b+c", "d=2*a"]
    output = app(slist)
    print(mprint(output))

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 链接地址:https://www.tutorialspoint.com/compiler_design/compi...
    dannyvi阅读 4,801评论 1 12
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,251评论 4 61
  • (三) 那一日大雪封城 你为何偏要夜间起来 不是要把经幡摇动 也不是悟了某卷经书 只不过是想一会梦里精灵
    星辰如洒揽凉风阅读 106评论 0 1
  • 桥西,纱遮首,凝水迷。 古驿伴客假斟酒,独赏秋草稀。 隐幕苏胡残声,纤指落厚甲曾皙。 二十载,妇欲朝庵剃。深闺中,...
    京城少年阅读 279评论 0 1
  • 孩子啊,我拿什么拯救你 我想帮你却无从下手 我倾尽所有却走不进你的心 我想陪你却远在天边 我想知道你一个人躲避时的...
    Weii阅读 229评论 0 1