资源简介

Python实现的编译原理中间代码生成程序,使用了PyQt5写图形界面 题目:设计一个程序,该程序能够将形如x=y op z的简单赋值语句翻译为对应的四元式序列,其中op可为+、-、*、/等二元运算符。要求用图形界面方式编程. 例如:若输入赋值语句a=b+c,则输出如下四元式序列: (+,b,c,t1) (=,t1,-,a)

资源截图

代码片段和文件信息

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# author:zhaoxiaolong
# 用于将简单表达式转换为四元式,(表达式等号左边只有一个字符),运算符只支持加减乘除
# 注:使用了pyqt5,需要安装相应模块
import sys
from PyQt5.QtWidgets import (QWidget QLabel QLineEdit
                             QTextEdit QGridLayout QApplication QPushButton)

#将输入表达式转换为后缀表达式并产生四元式
class Suffix:
    def __init__(self):
        self.symbol = {‘(‘:3 ‘*‘:1 ‘/‘:1 ‘+‘:2 ‘-‘:2}
        self.stack = []  #处理过程中需要用到的栈
        self.result = []  #存放转换为的后缀表达式
        
    #中缀转为后缀
    def transform(self ip):
        self.ip = ip
        for element in self.ip:
            ‘‘‘如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止
            左括号只弹出并不输出。‘‘‘
            if element == ‘)‘:
                while self.stack[-1] != ‘(‘:
                    self.result.append(self.stack[-1])
                    self.stack.pop()
                self.stack.pop()  #eject symbol ‘(‘
            #‘(‘也放入栈中
            elif element == ‘(‘:
                self.stack.append(element)
            #如果遇到操作符,则我们将其放入到栈中
            elif element in self.symbol:
                ‘‘‘如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,
                从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。
                弹出完这些元素后,才将遇到的操作符压入到栈中。
                有一点需要注意,只有在遇到‘)‘的情况下我们才弹出‘(‘
                ‘‘‘
                priority = self.symbol[element]
                if not self.stack:
                    self.stack.append(element)
                else:
                    while self.stack:
                        if self.symbol[self.stack[-1]] <= priority:
                            self.result.append(self.stack[-1])
                            self.stack.pop()
                        else:
                            break
                    self.stack.append(element)
            #如果遇到操作数,我们就直接将其输出(不入栈,只放入结果中)
            else:
                self.result.append(element)
        #如果读到了输入的末尾,则将栈中所有元素依次弹出
        while self.stack:
            self.result.append(self.stack[-1])
            self.stack.pop()
        return self.result
    
    #产生四元式存在answer[]中返回
    def siyuanshi(self result left):
        symbol = [‘+‘ ‘-‘ ‘*‘ ‘/‘]
        s = ‘‘.join(result)  #从s中用e遍历找到所有的操作符
        answer = []  #存放四元式,每一个元素形如(+abt1)
        tmp = 1  #用于产生中间变量t1t2...
        for 

评论

共有 条评论