資源簡(jiǎn)介
Python實(shí)現(xiàn)的編譯原理中間代碼生成程序,使用了PyQt5寫圖形界面
題目:設(shè)計(jì)一個(gè)程序,該程序能夠?qū)⑿稳鐇=y op z的簡(jiǎn)單賦值語句翻譯為對(duì)應(yīng)的四元式序列,其中op可為+、-、*、/等二元運(yùn)算符。要求用圖形界面方式編程.
例如:若輸入賦值語句a=b+c,則輸出如下四元式序列:
(+,b,c,t1)
(=,t1,-,a)
代碼片段和文件信息
#!/usr/bin/python3
#?-*-?coding:?utf-8?-*-
#?author:zhaoxiaolong
#?用于將簡(jiǎn)單表達(dá)式轉(zhuǎn)換為四元式,(表達(dá)式等號(hào)左邊只有一個(gè)字符),運(yùn)算符只支持加減乘除
#?注:使用了pyqt5,需要安裝相應(yīng)模塊
import?sys
from?PyQt5.QtWidgets?import?(QWidget?QLabel?QLineEdit
?????????????????????????????QTextEdit?QGridLayout?QApplication?QPushButton)
#將輸入表達(dá)式轉(zhuǎn)換為后綴表達(dá)式并產(chǎn)生四元式
class?Suffix:
????def?__init__(self):
????????self.symbol?=?{‘(‘:3?‘*‘:1?‘/‘:1?‘+‘:2?‘-‘:2}
????????self.stack?=?[]??#處理過程中需要用到的棧
????????self.result?=?[]??#存放轉(zhuǎn)換為的后綴表達(dá)式
????????
????#中綴轉(zhuǎn)為后綴
????def?transform(self?ip):
????????self.ip?=?ip
????????for?element?in?self.ip:
????????????‘‘‘如果遇到一個(gè)右括號(hào),則將棧元素彈出,將彈出的操作符輸出直到遇到左括號(hào)為止
????????????左括號(hào)只彈出并不輸出。‘‘‘
????????????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:
????????????????‘‘‘如果遇到任何其他的操作符,如(“+”,?“*”,“(”)等,
????????????????從棧中彈出元素直到遇到發(fā)現(xiàn)更低優(yōu)先級(jí)的元素(或者棧為空)為止。
????????????????彈出完這些元素后,才將遇到的操作符壓入到棧中。
????????????????有一點(diǎn)需要注意,只有在遇到‘)‘的情況下我們才彈出‘(‘
????????????????‘‘‘
????????????????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)
????????????#如果遇到操作數(shù),我們就直接將其輸出(不入棧,只放入結(jié)果中)
????????????else:
????????????????self.result.append(element)
????????#如果讀到了輸入的末尾,則將棧中所有元素依次彈出
????????while?self.stack:
????????????self.result.append(self.stack[-1])
????????????self.stack.pop()
????????return?self.result
????
????#產(chǎn)生四元式存在answer[]中返回
????def?siyuanshi(self?result?left):
????????symbol?=?[‘+‘?‘-‘?‘*‘?‘/‘]
????????s?=?‘‘.join(result)??#從s中用e遍歷找到所有的操作符
????????answer?=?[]??#存放四元式,每一個(gè)元素形如(+abt1)
????????tmp?=?1??#用于產(chǎn)生中間變量t1t2...
????????for?
評(píng)論
共有 條評(píng)論