本编译程序是基于自设计的类c模板语言开发的,样本语言的文法如下所述,为LL(1)文法,其中产生式左边的单词表示非终结符,这将成为之后设计递归子程序的依据。

基本文法:
P ->  begin DS end
D -> int id; D|@
S -> if (B) then S1 A S| while (B) do S1 S | {L} S | id = E;S | for(S;B;S) S1 S| read(id);S|write(id);S   |@
S1->{L}
A -> else S1 |@
L -> SH
H -> L|@
B -> B1B2
B1 -> B3B4
B2 -> '|'B1B2|@
B4 -> &B3B4|@
B3 -> E Q
Q -> relop E|@
E -> E1E2
E2 -> +E1E2|-E1E2|@
E1 -> FE3
E3 -> *FE3|/FE3|@
F -> (E)|num|id

非终结符号

含义及功能

P

程序

D

变量定义

S

程序主体

S1

分支循环主体程序

A

else分支

L、H

生成任意数量的S

B、B1-4、Q

生成布尔表达式

E、E1-3、F

生成算术表达式

重点非终结符号

含义及功能

@

空字符

&

与运算

|

或运算

relop

关系运算符

num

数字

id

变量标识符

read

从键盘读入值赋给目标id

write

将目标id写到屏幕

话不多说上代码,先是词法分析

class DFA:file_obj = '' #文件line_number = 0 #行号state = 0 #状态ResWord = ['int', 'if', 'then', 'else', 'end', 'while', 'do', 'begin', 'read', 'write','for']error_message = []  #保存错误信息,存储元组,元组第一个参数是行号,第二个参数是错误字符annotate_message = [] #注释信息,存储元组,元组第一个参数是行号,第二个参数是注释char_message = [] #识别的字符串,存储元组,元组第一个参数是类型,第二个参数是该字符串def __init__(self, file_name):self.file_obj = file_nameself.state = 0self.line_number = 0self.error_message = []self.annotate_message = []self.char_message = []#特殊符号tsfh,关键字gjz,标识符bsf,数字sz,布尔relopself.symtable={}self.last=' 'self.flag=0def get_symtable(self):i=1while(self.char_message[i][1]=='int'):      self.symtable[self.char_message[i+1][1]]=0i=i+3return self.symtabledef start_convert(self):for line in self.file_obj:    #每一行的最后一个符号必须是可以直接识别的line = line.strip('\n')line = line.strip('\t')line = line.strip(' ')self.line_number += 1line_length = len(line)i = 0string = ''while i < line_length:ch = line[i] #读取一个字符i += 1if self.state == 0:#初始状态string = ch#累加字符if ch.isalpha():  #字母self.state = 1elif ch.isdigit():#数字self.state = 3elif ch == '+':self.state = 5elif ch == '-':self.state = 9elif ch == '*':self.state = 13elif ch == '/':self.state = 16elif ch == '=':self.state = 20elif ch == '<':self.state = 21elif ch == '>':self.state = 31elif ch == '{':self.state = 22i -= 1elif ch == '}':self.state = 23i -= 1elif ch=='(':self.state=32i-=1elif ch==')':self.state=33i-=1elif ch=='&':self.state=34i-=1elif ch=='|':self.state=35i-=1elif ch=='!':self.state=42elif ch == ';':self.state = 24i -= 1elif ch.isspace():self.state = 25else:self.state = 26 #不可识别i -= 1if (i==line_length) and not(self.last=='begin' or self.last=='end' or self.last=='then' or self.last=='do' or ch=='{' or ch=='}' or self.last=='else'):  #一行中最后的一个单个字符单词不可直接识别print('第',self.line_number,'行缺少;或)或}')self.flag=1elif self.state == 1: #判断字母数while ch.isalpha() or ch.isdigit():string += chif i < line_length:ch = line[i]i += 1else:       #ch读到了末尾字符breakself.state = 2i -= 2 #回退2个字符,回退到即将被归约的末尾字符elif self.state == 2: if string in self.ResWord:content = ('gjz',string,self.line_number)else:content = ('bsf',string,self.line_number)#print (content)if string !='':self.char_message.append(content)self.last=stringstring = '' #回到初始状态self.state = 0elif self.state == 3: #判断数字while ch.isdigit():string += chif i < line_length:ch = line[i]i += 1else:breakself.state = 4i -= 2elif self.state == 4:content = ('sz',string,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 5: #遇加号if ch == '+':self.state = 6i -= 1elif ch == '=':self.state = 7i -= 1 else:self.state = 8i -= 2elif self.state == 6: #判断++content = ('tsfh',string+ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 7: #判断+=content = ('tsfh',string+ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 8: #判断+content = ('tsfh',ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 9: #遇减号if ch == '-':self.state = 10i -= 1elif ch == '=':self.state = 11i -= 1 else:self.state = 12i -= 2elif self.state == 10: #判断--content = ('tsfh',string+ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 11: #判断-=content = ('tsfh',string+ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 12: #判断-content = ('tsfh','-',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 13: #遇乘号if ch == '=':self.state = 14i -= 1else:self.state = 15i -= 2elif self.state == 14: #判断*=content = ('tsfh',string+ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 15: #判断*content = ('tsfh',ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 16: #遇除号if ch == '/':self.state = 17i -= 1elif ch == '=':self.state = 18else:self.state = 19i -= 2elif self.state == 17: #判断//content = ('zs', line[i:],self.line_number )self.annotate_message.append(content)i=999self.state=0breakelif self.state == 18: #判断/=content = ('tsfh',string+ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 19: #判断/content = ('tsfh',ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state==20:if ch=='=':self.state=40i-=1else:self.state=41i-=2elif self.state==40:  #==content = ('relop',string+ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 41:#<content = ('relop','=',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state==42:if ch=='=':self.state=43i-=1else:self.state=26i-=2elif self.state==43:  #!=content = ('relop',string+ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state==21:if ch=='=':self.state=36i-=1else:self.state=37i-=2elif self.state==36:  #<=content = ('relop',string+ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 37:#<content = ('relop','<',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state==31:if ch=='=':self.state=38i-=1else:self.state=39i-=2elif self.state==38:  #>=content = ('relop',string+ch,self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 39:#>content = ('relop','>',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 22:content = ('tsfh','{',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 23:content = ('tsfh','}',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 32:content = ('tsfh','(',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 33:content = ('tsfh',')',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 34:content = ('tsfh','&',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 35:content = ('tsfh','|',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 24:content = ('tsfh',';',self.line_number)self.char_message.append(content)string = ''self.state = 0elif self.state == 25:while ch.isspace():if i < line_length:ch = line[i]i += 1else:breakself.state = 0i -= 1elif self.state == 26: #不可识别字符self.flag=1content = ('ffzf',  ch,self.line_number )self.error_message.append(content)self.state= 0string = ''def Get_error(self):#获取错误信息return self.error_messagedef Get_annotate(self):#获取注释信息return self.annotate_messagedef Get_char(self):#获取识别信息return self.char_messageif __name__ == '__main__':try:file_obj = open('input1.txt',encoding='utf-8')dfa = DFA(file_obj)dfa.start_convert()     #填满char_messagedfa.get_symtable()content = dfa.Get_char()for item in content:print (item)print ("*************注释信息*************")content = dfa.Get_annotate()for item in content:print (item)print ("*************错误字符*************")content = dfa.Get_error()for item in content:print (item)print ("*************初始变量表*************")print(dfa.symtable)finally:file_obj.close()

接下来是语法语义分析、中间代码生成以及解释程序:

'''
基本文法:
P ->  begin DS end
D -> int id; D|@
S -> if (B) then S1 A S| while (B) do S1 S | {L} S | id = E;S | for(S;B;S) S1 S| read(id);S|write(id);S   |@
S1->{L}
A -> else S1 |@
L -> SH
H -> L|@
B -> B1B2
B1 -> B3B4
B2 -> '|'B1B2|@
B4 -> &B3B4|@
B3 -> E Q
Q -> relop E|@
E -> E1E2
E2 -> +E1E2|-E1E2|@
E1 -> FE3
E3 -> *FE3|/FE3|@
F -> (E)|num|id
'''from cifa import DFA
dic = {}   #符号表
table = []   #单词栈
wenfa = []   #字符串文法
siyuan = []  #四元式
error = {}#语法错误
err=[]#语义错误
process=[]#中间代码执行过程
class Parser():def __init__(self):self.i=0self.flag=0#记录临时变量的数目self.lb=0#记录标签的数目self.p()def p(self): #P -> begin DS endif (table[self.i][1] == 'begin'):self.i += 1wenfa.append('P -> begin DS end')self.d()self.s()if (self.i is not len(table)-1):   #语法分析结束时,若单词栈指针与单词表长度不相等,报错print ("\n语法分析程序检查到错误")print(table[self.i])#识别终止位置for key in wenfa:print (key)else:print ('\n字符串语法是:')       #若一切正确,则输出语法树文法for key in wenfa:print (key)print ('语法正确')def d(self): #D -> int ID; D|&if (table[self.i][1] == 'int'):self.i += 1wenfa.append('D -> int ID;D')if(table[self.i][0]=='bsf'):self.i += 1if(table[self.i][1] == ';'):self.i += 1self.d()else:error[table[self.i][2]]='缺少分号'else:error[table[self.i][2]]='缺少id'else:wenfa.append('D -> @')def s1(self):#S1->{L}if table[self.i][1] == '{':self.i+=1wenfa.append('S1->{L}')self.l()if table[self.i][1] == '}':self.i+=1else:error[table[self.i][2]]='缺少}'else:error[table[self.i][2]]='invalid syntax'def s(self): #S -> if (B) then S1 A S| while (B) do S1 S | {L} S | id = E;S | for(S;B;S) S1 S| read(id);S|write(id);S   |@if (table[self.i][1] == 'if'):self.i += 1wenfa.append('S -> if (B) then S1 A S ')if(table[self.i][1] == '('):self.i += 1          ret1=self.b()if(table[self.i][1] == ')'):self.i += 1if table[self.i][1] == 'then':self.i += 1             self.lb+=1temp1=self.lbself.lb+=1temp2=self.lbsiyuan.append(('JZ',ret1,'_','label'+str(temp1)))self.s1()self.lb+=1siyuan.append(('JP','_','_','label'+str(temp2)))siyuan.append('label'+str(temp1))self.a()siyuan.append('label'+str(temp2))self.s()else:error[table[self.i][2]]='缺少then'else:error[table[self.i][2]]='缺少)'else:error[table[self.i][2]]='缺少('elif(table[self.i][1] == 'for'):self.lb+=1temp1=self.lbself.lb+=1temp2=self.lbself.lb+=1temp4=self.lbself.lb+=1temp5=self.lbself.i+=1wenfa.append('S -> for(S;B;S) S1 S')if table[self.i][1] == '(':self.i+=1self.s()if table[self.i][1] == ';':self.i+=1siyuan.append('label'+str(temp5))ret1=self.b()siyuan.append(('JZ',ret1,'_','label'+str(temp1)))siyuan.append(('JP','_','_','label'+str(temp2)))siyuan.append('label'+str(temp4))if table[self.i][1] == ';':self.i+=1self.s()siyuan.append(('JP','_','_','label'+str(temp5)))siyuan.append('label'+str(temp2))if table[self.i][1] == ')':self.i+=1self.s1()siyuan.append(('JP','_','_','label'+str(temp4)))siyuan.append('label'+str(temp1))self.s()else:error[table[self.i][2]]='缺少)'else:error[table[self.i][2]]='缺少;'else:error[table[self.i][2]]='缺少;'else:error[table[self.i][2]]='缺少('elif(table[self.i][1] == 'read'):self.i += 1wenfa.append('S -> read(id); S')if table[self.i][1]=='(':self.i+=1if table[self.i][0]=='bsf':siyuan.append(('read','_','_',table[self.i][1]))self.i+=1if table[self.i][1]==')':self.i+=1if table[self.i][1]==';':self.i+=1self.s()else:error[table[self.i][2]]='缺少;'else:error[table[self.i][2]]='缺少)'else:error[table[self.i][2]]='缺少变量'else:error[table[self.i][2]]='缺少('elif(table[self.i][1] == 'write'):self.i += 1wenfa.append('S -> write(id); S')if table[self.i][1]=='(':self.i+=1if table[self.i][0]=='bsf':siyuan.append(('write','_','_',table[self.i][1]))self.i+=1if table[self.i][1]==')':self.i+=1if table[self.i][1]==';':self.i+=1self.s()else:error[table[self.i][2]]='缺少;'else:error[table[self.i][2]]='缺少)'else:error[table[self.i][2]]='缺少变量'else:error[table[self.i][2]]='缺少('elif(table[self.i][1] == 'while'):self.i += 1wenfa.append('S -> while (B) do S1 S')if(table[self.i][1] == '('):self.i += 1      self.lb+=1temp1=self.lbsiyuan.append('label'+str(self.lb))ret1=self.b()self.lb+=1temp2=self.lbsiyuan.append(('JZ',ret1,'_','label'+str(temp2)))if(table[self.i][1] == ')'):self.i += 1if table[self.i][1] == 'do':self.i += 1self.s1()siyuan.append(('JP','_','_','label'+str(temp1)))siyuan.append('label'+str(temp2))self.s()else:error[table[self.i][2]]='缺少do'else:error[table[self.i][2]]='缺少)'else:error[table[self.i][2]]='缺少('elif (table[self.i][1] == '{'):self.i += 1wenfa.append('S -> {L} S')self.l()if (table[self.i][1] == '}'):self.i += 1self.s()else:error[table[self.i][2]]='缺少}'elif  table[self.i][0] == 'bsf':temp=self.iif not(table[temp][1] in symtable.keys()):err.append('第'+str(table[temp][2])+'行:'+"变量表中无对应的变量"+table[temp][1])self.i += 1wenfa.append('S -> id = E; S')if (table[self.i][1] == '='):self.i += 1ret1=self.e()if (table[self.i][1] == ';'):self.i += 1siyuan.append(('=',ret1,'_',table[temp][1]))self.s()else:error[table[self.i][2]]='缺少;'else:error[table[self.i][2]]='缺少='else:wenfa.append('S->@')def a(self):if table[self.i][1]=='else':wenfa.append('A->else S1')self.i+=1self.s1()else:wenfa.append('A-> @')def l(self): #L -> SHwenfa.append('L -> SH')self.s()self.h()def h(self): #H -> L|@if (table[self.i][1] == 'if' or table[self.i][1] == 'while' or table[self.i][1] == '{' or table[self.i][0] == 'bsf'):        wenfa.append('H -> L')self.l()else:wenfa.append('H -> @')def b(self):   #B -> B1B2wenfa.append('B -> B1B2')ret1=self.b1()ret2,ret3=self.b2()if ret2=='@':return ret1else:self.flag+=1siyuan.append((ret2,ret1,ret3,'T'+str(self.flag)))return 'T'+str(self.flag)def b1(self):   #B1 -> B3B4wenfa.append('B1 -> B3B4')ret1=self.b3()ret2,ret3=self.b4()if ret2=='@':return ret1else:self.flag+=1siyuan.append((ret2,ret1,ret3,'T'+str(self.flag)))return 'T'+str(self.flag)def b2(self):   #B2 -> |B1B2|@if (table[self.i][1] == '|'):self.i += 1wenfa.append('B2 -> |B1B2')ret1=self.b1()ret2,ret3=self.b2()if ret2=='@':return ret1else:self.flag+=1siyuan.append((ret2,ret1,ret3,'T'+str(self.flag)))return '|','T'+str(self.flag)else:wenfa.append('B2 -> @')return '@','@'def b3(self):   #B3 -> E Qwenfa.append('B3 -> E Q')ret1=self.e()ret2,ret3=self.q()if ret2=='@':return ret1else:self.flag+=1siyuan.append((ret2,ret1,ret3,'T'+str(self.flag)))return 'T'+str(self.flag)def b4(self):   #B4 -> &B3B4 | @if (table[self.i][1] == '&'):self.i += 1wenfa.append('B4 -> &B3B4')ret1=self.b3()ret2,ret3=self.b4()if ret2=='@':return '&',ret1else:self.flag+=1siyuan.append((ret2,ret1,ret3,'T'+str(self.flag)))return '&','T'+str(self.flag)else:wenfa.append('B4 -> @')return '@','@'def q(self):   #Q -> relop E | @if (table[self.i][0] == 'relop'):ret1=table[self.i][1]   #运算符号wenfa.append('Q -> relop E')self.i += 1ret2=self.e()return ret1,ret2else:wenfa.append('Q -> @')return '@','@'def e(self): #E -> e1e2wenfa.append('E -> E1E2')ret1=self.e1()ret2,ret3=self.e2()if ret2!='@':self.flag+=1siyuan.append((ret2,ret1,ret3,'T'+str(self.flag)))return 'T'+str(self.flag)else:return ret1def e1(self): #E1->FE3wenfa.append('E1 -> FE3')ret1=self.f()ret2,ret3=self.e3()if ret2!='@':self.flag+=1siyuan.append((ret2,ret1,ret3,'T'+str(self.flag)))return 'T'+str(self.flag)else:return ret1def e2(self):#E2->+E1E2/-E1E2/@if table[self.i][1] == '+':self.i+=1wenfa.append('E2->+E1E2')ret1=self.e1()ret2,ret3=self.e2()if ret2=='@':return '+',ret1else:self.falg+=1siyuan.append(('+',ret1,ret3,'T'+str(self.flag)))return '+','T'+str(self.flag)elif table[self.i][1] == '-':self.i+=1wenfa.append('E2->-E1E2')ret1=self.e1()ret2,ret3=self.e2()if ret2=='@':return '-',ret1else:self.falg+=1siyuan.append(('-',ret1,ret3,'T'+str(self.flag)))return '-','T'+str(self.flag)else:wenfa.append('E2->@')return '@','@'def e3(self):#E3->*FE3//FE3/@if table[self.i][1] == '*':self.i+=1wenfa.append('E3->*FE3')ret1=self.f()ret2,ret3=self.e3()if ret2=='@':return '*',ret1else:self.flag+=1siyuan.append(('*',ret1,ret3,'T'+str(self.flag)))return '*','T'+str(self.flag)elif table[self.i][1] == '/':self.i+=1wenfa.append('E3->/FE3')ret1=self.f()ret2,ret3=self.e3()if ret2=='@':if ret1=='0':err.append('第'+str(table[self.i][2])+'行除数为0')return '/',ret1else:self.flag+=1siyuan.append(('/',ret1,ret3,'T'+str(self.flag)))return '/','T'+str(self.flag)else:wenfa.append('E3->@')return '@','@'def f(self):#F -> (E)|num|id if table[self.i][1]=='(':self.i+=1wenfa.append('F->(E)')ret1=self.e()if table[self.i][1]==')':self.i+=1else:error[table[self.i][2]]='缺少)'return ret1elif table[self.i][0]=='sz':self.i+=1wenfa.append('F->num')return table[self.i-1][1]elif table[self.i][0]=='bsf':self.i+=1wenfa.append('F->id')return table[self.i-1][1]else:error[table[self.i][2]]='invalid syntax'''' #预测分析表法
class MyFrame1(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"LL(1)分析器", pos=wx.DefaultPosition,size=wx.Size(460,327), style=wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.SYSTEM_MENU|wx.TAB_TRAVERSAL, name=u"Main")self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)self.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT))self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))bSizer1 = wx.BoxSizer(wx.VERTICAL)fgSizer2 = wx.FlexGridSizer(0, 2, 0, 0)fgSizer2.SetFlexibleDirection(wx.BOTH)fgSizer2.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)self.m_staticText3 = wx.StaticText(self, wx.ID_ANY, u"请选择文法文件的位置", wx.DefaultPosition, wx.DefaultSize, 0)self.m_staticText3.Wrap(-1)self.m_staticText3.SetFont(wx.Font(wx.NORMAL_FONT.GetPointSize(), 70, 90, 90, False, wx.EmptyString))fgSizer2.Add(self.m_staticText3, 0, wx.ALL, 5)self.m_filePicker1 = wx.FilePickerCtrl(self, wx.ID_ANY, wx.EmptyString, u"Select a file", u"*.*",wx.DefaultPosition, wx.Size(300, -1),wx.FLP_DEFAULT_STYLE | wx.FLP_SMALL)fgSizer2.Add(self.m_filePicker1, 0, wx.ALL, 5)bSizer1.Add(fgSizer2, 0, wx.EXPAND, 5)fgSizer4 = wx.FlexGridSizer(0, 3, 0, 0)fgSizer4.SetFlexibleDirection(wx.BOTH)fgSizer4.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)self.m_staticText4 = wx.StaticText(self, wx.ID_ANY, u"请输入要分析的字符串", wx.DefaultPosition, wx.DefaultSize, 0)self.m_staticText4.Wrap(-1)fgSizer4.Add(self.m_staticText4, 0, wx.ALL, 5)self.m_textCtrl3 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.Point(-1, -1), wx.Size(200, -1), 0)str1 = self.m_textCtrl3.GetValue()fgSizer4.Add(self.m_textCtrl3, 0, wx.ALL, 5)self.m_button3 = wx.Button(self, wx.ID_ANY, u"分析", wx.DefaultPosition, wx.DefaultSize, 0)fgSizer4.Add(self.m_button3, 0, wx.ALL, 5)bSizer1.Add(fgSizer4, 0, wx.EXPAND, 5)fgSizer5 = wx.FlexGridSizer(0, 1, 0, 0)fgSizer5.SetFlexibleDirection(wx.BOTH)fgSizer5.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)self.m_ListCtrl1 = wx.ListCtrl(self, -1, style=wx.LC_REPORT, size=wx.Size(445, 210))self.m_ListCtrl1.InsertColumn(0, "分析栈")self.m_ListCtrl1.InsertColumn(1, "剩余输入串")self.m_ListCtrl1.InsertColumn(2, "所用产生式")self.m_ListCtrl1.InsertColumn(3, "动作")fgSizer5.Add(self.m_ListCtrl1, 0, wx.ALL, 5)bSizer1.Add(fgSizer5, 0, wx.EXPAND, 5)self.SetSizer(bSizer1)self.Layout()self.Centre(wx.BOTH)self.m_button3.Bind(wx.EVT_BUTTON, self.m_button3OnButtonClick)def __del__(self):passdef get_lan(self):#非终结符tab串1|串2|...file_path = self.m_filePicker1.GetPath()file = open(file_path, "r") #读文法文件for line in file.readlines():splitlist = line[2:].replace("\n", "").split("|")LAN[line[0]] = splitlistdef get_first(self):for k in LAN:l = LAN[k]#列表FIRST[k] = list()for s in l:if not (s[0].isupper()): #终结符FIRST[k].append(s[0])for i in range(2):for k in LAN:l = LAN[k]for s in l:if (s[0].isupper()): #非终结符FIRST[k].extend(FIRST[s[0]])FIRST[k] = list(set(FIRST[k]))# 去重print ("文法为: %s" % LAN)print ("FIRST集为:%s" % FIRST)def get_follow(self):condition = lambda t: t != 'ε'  # 过滤器用于过滤空串for k in LAN: #新建listFOLLOW[k] = list()if k == list(LAN.keys())[0]:FOLLOW[k].append('#')for i in range(2):for k in LAN:l = LAN[k]for s in l:if s[len(s) - 1].isupper():FOLLOW[s[len(s) - 1]].extend(FOLLOW[k]) # 若A→αB是一个产生式,则把FOLLOW(A)加至FOLLOW(B)中FOLLOW[s[len(s) - 1]] = list(filter(condition, FOLLOW[s[len(s) - 1]]))  # 去除空串for index in range(len(s) - 1):if s[index].isupper():if s[index + 1].isupper():# 若A→αBβ是一个产生式,则把FIRST(β)\{ε}加至FOLLOW(B)中;FOLLOW[s[index]].extend(FIRST[s[index + 1]])FOLLOW[s[index]] = list(filter(condition, FOLLOW[s[index]]))# 去除空串if not (s[index + 1].isupper()) and (s[index + 1] != 'ε'):FOLLOW[s[index]].append(s[index + 1])emptyflag = 1for i in range(index + 1, len(s)):if not (s[i].isupper()) or (s[i].isupper() & ('ε' not in FIRST[s[i]])):emptyflag = 0breakif emptyflag == 1:FOLLOW[s[index]].extend(FOLLOW[k])  # A→αBβ是一个产生式而(即ε属于FIRST(β)),则把FOLLOW(A)加至FOLLOW(B)中FOLLOW[s[index]] = list(filter(condition, FOLLOW[s[index]]))  # 去除空串for k in FOLLOW: #去重FOLLOW[k] = list(set(FOLLOW[k]))print('FOLLOW集为:%s' % FOLLOW)def get_VT(self):VT.add('#')for l in LAN.values():for s in l:for c in s:if not (c.isupper()) and (c != 'ε'): VT.add(c)print('终结符为:%s' % VT)def generate_table(self):self.get_VT()for k in LAN: # 初始化分析表Table[k] = dict()for e in VT:Table[k][e] = Nonefor k in LAN:l = LAN[k]for s in l:if s[0].isupper():for e in VT:if e in FIRST[s[0]]: Table[k][e] = sif s[0] in VT:Table[k][s[0]] = sif (s[0].isupper() and ('ε' in FIRST[s[0]])) or (s == 'ε'):for c in FOLLOW[k]:Table[k][c] = sprint('分析表为:%s' % Table)def analyze(self):inputstr = self.m_textCtrl3.GetValue()  # 输入任意字符串inputstr = inputstr[1:]inputstr = list(inputstr[::-1])print (inputstr)process = list()process.append('#') # #入栈process.append(list(LAN.keys())[0]) #开始符入栈errorflag = 0count = 0 #输入列表时的索引ProcessList.clear()ProcessList[count] = (''.join(process), ''.join(inputstr), ' ', '初始化')while True:count += 1current = process.pop()if current == inputstr[-1] == '#': #分析成功结束ProcessList[count] = ('√', '√', '恭喜你', '成功')break;if (current in VT) and (current == inputstr[-1]): # 遇到终结符inputstr.pop()ProcessList[count] = (''.join(process), ''.join(inputstr), ' ', 'GETNEXT')continueif inputstr[-1] in VT: # 判断是不是终结符new = Table[current][inputstr[-1]]else:errorflag = 1ProcessList[count] = (''.join(process), ''.join(inputstr), ' ', 'Error:输入不合法!')breakif (new == None): # 没有找到对应产生式errorflag = 1ProcessList[count] = (''.join(process), ''.join(inputstr), ' ', 'Error:没有找到对应产生式!')breakif (new == 'ε'):  # 产生式为空串ProcessList[count] = (''.join(process), ''.join(inputstr), current+'->ε', 'POP')continuefor c in reversed(new): # 将产生式入栈process.append(c)ProcessList[count] = (''.join(process), ''.join(inputstr), current+'->'+''.join(new), 'POP,PUSH')if errorflag == 0:print("分析成功!")else:print("分析失败!")items = ProcessList.items()self.m_ListCtrl1.DeleteAllItems()for key, data in items:index = self.m_ListCtrl1.InsertItem(self.m_ListCtrl1.GetItemCount(), str(key))self.m_ListCtrl1.SetItem(index, 0, data[0])self.m_ListCtrl1.SetItem(index, 1, data[1])self.m_ListCtrl1.SetItem(index, 2, data[2])self.m_ListCtrl1.SetItem(index, 3, data[3])self.m_ListCtrl1.SetColumnWidth(0, 80)self.m_ListCtrl1.SetColumnWidth(1, 80)self.m_ListCtrl1.SetColumnWidth(2, 100)self.m_ListCtrl1.SetColumnWidth(3, 175)def m_button3OnButtonClick(self, event):self.get_lan()  # 得到文法self.get_first()  # 得到FIRST集self.get_follow()  # 得到FOLLOW集self.generate_table()  # 得到分析表self.analyze()  # 对输入字符串进行分析
'''def explain(symtable):i=0while i<len(siyuan):process.append(i)if type(siyuan[i])==str:  #遇到标签i+=1elif siyuan[i][0] == '=':if siyuan[i][3] in symtable.keys():if siyuan[i][1] in symtable.keys():symtable[siyuan[i][3]] = int(symtable[siyuan[i][1]])else:symtable[siyuan[i][3]] = int(siyuan[i][1])i=i+1else:err.append("变量表中无对应的变量"+siyuan[i][3])i+=1elif siyuan[i][0] == 'read':if siyuan[i][3] in symtable.keys():temp=int(input("请为"+siyuan[i][3]+'赋值:'))symtable[siyuan[i][3]]=tempi+=1else:err.append("变量表中无对应的变量"+siyuan[i][3])i+=1elif siyuan[i][0] == 'write':if siyuan[i][3] in symtable.keys():print(siyuan[i][3]+'='+str(symtable[siyuan[i][3]]))i+=1else:err.append("变量表中无对应的变量"+siyuan[i][3])i+=1elif siyuan[i][0]=='+':if siyuan[i][1] in symtable.keys():a = int(symtable[siyuan[i][1]])else:a = int(siyuan[i][1])if siyuan[i][2] in symtable.keys():b = int(symtable[siyuan[i][2]])else:b = int(siyuan[i][2])symtable[siyuan[i][3]] = a + bi=i+1elif siyuan[i][0] == '-':if siyuan[i][1] in symtable.keys():a = int(symtable[siyuan[i][1]])else:a = int(siyuan[i][1])if siyuan[i][2] in symtable.keys():b = int(symtable[siyuan[i][2]])else:b = int(siyuan[i][2])symtable[siyuan[i][3]] = a - bi+=1elif siyuan[i][0] == '*':if siyuan[i][1] in symtable.keys():a = int(symtable[siyuan[i][1]])else:a = int(siyuan[i][1])if siyuan[i][2] in symtable.keys():b = int(symtable[siyuan[i][2]])else:b = int(siyuan[i][2])symtable[siyuan[i][3]] = a * bi+=1elif siyuan[i][0] == '/':if siyuan[i][1] in symtable.keys():a = float(symtable[siyuan[i][1]])else:a = float(siyuan[i][1])if siyuan[i][2] in symtable.keys():b = float(symtable[siyuan[i][2]])else:b = float(siyuan[i][2])symtable[siyuan[i][3]] = a / bi+=1elif siyuan[i][0] == '<':if siyuan[i][1] in symtable.keys() and siyuan[i][2] in symtable.keys():if symtable[siyuan[i][1]] < symtable[siyuan[i][2]]:t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and not(siyuan[i][2] in symtable.keys()):if int(siyuan[i][1]) < int(siyuan[i][2]):t = 1else:t = 0elif siyuan[i][1] in symtable.keys() and not(siyuan[i][2] in symtable.keys()):if symtable[siyuan[i][1]] < int(siyuan[i][2]):t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and siyuan[i][2] in symtable.keys():if int(symtable[siyuan[i][1]]) < symtable[siyuan[i][2]]:t = 1else:t = 0symtable[siyuan[i][3]] = ti+=1elif siyuan[i][0] == '<=':if siyuan[i][1] in symtable.keys() and siyuan[i][2] in symtable.keys():if symtable[siyuan[i][1]] <= symtable[siyuan[i][2]]:t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and not(siyuan[i][2] in symtable.keys()):if int(siyuan[i][1]) <= int(siyuan[i][2]):t = 1else:t = 0elif siyuan[i][1] in symtable.keys() and not(siyuan[i][2] in symtable.keys()):if symtable[siyuan[i][1]] <= int(siyuan[i][2]):t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and siyuan[i][2] in symtable.keys():if int(symtable[siyuan[i][1]]) <= symtable[siyuan[i][2]]:t = 1else:t = 0symtable[siyuan[i][3]] = ti+=1elif siyuan[i][0] == '>':if siyuan[i][1] in symtable.keys() and siyuan[i][2] in symtable.keys():if symtable[siyuan[i][1]] > symtable[siyuan[i][2]]:t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and not(siyuan[i][2] in symtable.keys()):if int(siyuan[i][1]) > int(siyuan[i][2]):t = 1else:t = 0elif siyuan[i][1] in symtable.keys() and not(siyuan[i][2] in symtable.keys()):if symtable[siyuan[i][1]] > int(siyuan[i][2]):t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and siyuan[i][2] in symtable.keys():if int(symtable[siyuan[i][1]]) > symtable[siyuan[i][2]]:t = 1else:t = 0symtable[siyuan[i][3]] = ti+=1elif siyuan[i][0] == '&':if siyuan[i][1] in symtable.keys() and siyuan[i][2] in symtable.keys():if symtable[siyuan[i][1]] and symtable[siyuan[i][2]]:t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and not(siyuan[i][2] in symtable.keys()):if int(siyuan[i][1]) and int(siyuan[i][2]):t = 1else:t = 0elif siyuan[i][1] in symtable.keys() and not(siyuan[i][2] in symtable.keys()):if symtable[siyuan[i][1]] and int(siyuan[i][2]):t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and siyuan[i][2] in symtable.keys():if int(symtable[siyuan[i][1]]) and symtable[siyuan[i][2]]:t = 1else:t = 0symtable[siyuan[i][3]] = ti+=1elif siyuan[i][0] == '|':if siyuan[i][1] in symtable.keys() and siyuan[i][2] in symtable.keys():if symtable[siyuan[i][1]] or symtable[siyuan[i][2]]:t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and not(siyuan[i][2] in symtable.keys()):if int(siyuan[i][1]) or int(siyuan[i][2]):t = 1else:t = 0elif siyuan[i][1] in symtable.keys() and not(siyuan[i][2] in symtable.keys()):if symtable[siyuan[i][1]] or int(siyuan[i][2]):t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and siyuan[i][2] in symtable.keys():if int(symtable[siyuan[i][1]]) or symtable[siyuan[i][2]]:t = 1else:t = 0symtable[siyuan[i][3]] = ti+=1elif siyuan[i][0] == '>=':if siyuan[i][1] in symtable.keys() and siyuan[i][2] in symtable.keys():if symtable[siyuan[i][1]] >= symtable[siyuan[i][2]]:t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and not(siyuan[i][2] in symtable.keys()):if int(siyuan[i][1]) >= int(siyuan[i][2]):t = 1else:t = 0elif siyuan[i][1] in symtable.keys() and not(siyuan[i][2] in symtable.keys()):if symtable[siyuan[i][1]] >= int(siyuan[i][2]):t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and siyuan[i][2] in symtable.keys():if int(symtable[siyuan[i][1]]) >= symtable[siyuan[i][2]]:t = 1else:t = 0symtable[siyuan[i][3]] = ti+=1elif siyuan[i][0] == '!=':if siyuan[i][1] in symtable.keys() and siyuan[i][2] in symtable.keys():if symtable[siyuan[i][1]] != symtable[siyuan[i][2]]:t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and not(siyuan[i][2] in symtable.keys()):if int(siyuan[i][1]) != int(siyuan[i][2]):t = 1else:t = 0elif siyuan[i][1] in symtable.keys() and not(siyuan[i][2] in symtable.keys()):if symtable[siyuan[i][1]] != int(siyuan[i][2]):t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and siyuan[i][2] in symtable.keys():if int(symtable[siyuan[i][1]]) != symtable[siyuan[i][2]]:t = 1else:t = 0symtable[siyuan[i][3]] = ti+=1elif siyuan[i][0] == '==':if siyuan[i][1] in symtable.keys() and siyuan[i][2] in symtable.keys():if symtable[siyuan[i][1]] == symtable[siyuan[i][2]]:t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and  not(siyuan[i][2] in symtable.keys()):if int(siyuan[i][1]) == int(siyuan[i][2]):t = 1else:t = 0elif siyuan[i][1] in symtable.keys() and not(siyuan[i][2] in symtable.keys()):if symtable[siyuan[i][1]] == int(siyuan[i][2]):t = 1else:t = 0elif not(siyuan[i][1] in symtable.keys()) and siyuan[i][2] in symtable.keys():if int(symtable[siyuan[i][1]]) == symtable[siyuan[i][2]]:t = 1else:t = 0symtable[siyuan[i][3]] = ti+=1elif siyuan[i][0] == "JZ":if siyuan[i][1] in symtable.keys():if symtable[siyuan[i][1]] == 0:i = siyuan.index(siyuan[i][3])i+=1else:i+=1else:err.append("变量表中无对应的变量"+siyuan[i][1])i+=1elif siyuan[i][0] == "JP":i = siyuan.index(siyuan[i][3]) i+=1
if __name__ == '__main__':try:file_obj = open('input1.txt',encoding='utf-8')except Exception:print(file_obj, ': This FileName Not Found!')dfa = DFA(file_obj)dfa.start_convert()     #填满char_messagesymtable=dfa.get_symtable()  #初始变量表table = dfa.Get_char()   #符号栈for item in table:print (item)print ("*************注释信息*************")content = dfa.Get_annotate()for item in content:print (item)print ("*************错误字符*************")content = dfa.Get_error()for item in content:print (item)print ("*************初始变量表*************")print(dfa.symtable)print ("*************语法分析*************")if dfa.flag==0:Parser()print ("*************语法错误*************")print(error)print ("*************语义错误*************")print(err)print ("*************中间代码*************")for i in siyuan:print(i)print ("*************解释程序*************")if not(len(err)) and not(len(error)):explain(symtable)print(symtable)print ("*************中间代码执行过程*************")print(process)file_obj.close()

python3类c语言LL1文法编译器设计相关推荐

  1. C语言并行编译,分布式并行C语言与其预编译器设计与实现.pdf

    分布式并行C语言与其预编译器设计与实现 粤 伊 揍 术 挥 佩 晰 禽 贸 左 缝 狸 融 索 彰 昂 翠 鱼 绕 缓 钵 离 埋 吠 耘 噪 庙 惊 诈 兔 插 主 藕 去 搀 抱 凿 要 累 肩 ...

  2. c语言 ll1文法实验报告,C语言文法 LL(1)文法

    程序->外部声明 | 程序 外部声明 程序->外部声明A' A'->外部声明A'|ε 外部声明->修饰符 变量名 形参 修饰符->void | int | char | ...

  3. 【编译原理笔记02】计算机如何表示语言及其文法,字母表(及其运算)、串、推导和归约、句型和句子、文法分析树

    本次笔记内容: 2-1 词法语法分析基本概念 2-2 文法定义 2-3 语言的定义 2-4 文法的分类 2-5 CFG的分析树 文章目录 概述:计算机如何表示语言及其文法 字母表(Alphabet) ...

  4. 毕业设计 c语言编译器的设计开发-字节代码格式设计与实现 开题报告,C语言编译器设计与实现...

    C语言编译器设计与实现(任务书,外文翻译,毕业论文20000字,答辩PPT) 摘 要 随着计算机的广泛应用,计算机程序设计语言也从初期的机器语言发展为汇编语言,以及现在的各种高级程序设计语言.而编译技 ...

  5. 最严谨的计算机语言p,用于PLC的华P语言编译器设计及实现.pdf

    2009年10月 沈阳理工大学学报 V01.28No.5 OFSHENYANGUGONGUNIVERSITYOct.2 第28卷第5期 TRANSACTIONS 0 09 文章编号:1003-1251 ...

  6. c 语言编译器 论文,毕业论文--C语言编译器设计与实现.doc

    太原理工大学毕业设计(论文)用纸 太 原 理 工 大 学 毕业设计(论文)任务书 第1页 毕业设计(论文)题目: C语言编译器设计与实现 毕业设计(论文)要求及原始数据(资料): 1.C语言简介和国内 ...

  7. SysY文法编译器前端设计实现

    一.实验概述 1.1编译器概况 本次实验,我实现了SysY文法的编译器前端,在windows环境下使用mingw32-make进行编译,具体细节如下: 词法分析使用flex自动生成; 语法分析使用bi ...

  8. c语言编译器2017,2016-2017年本科C语言编译器设计与实现毕业论文设计.doc

    北京邮电 大 学 毕业设计(论文)任务书 第1页 毕业设计(论文)题目: C语言编译器设计与实现 毕业设计(论文)要求及原始数据(资料): 1.C语言简介和国内外编译器技术研究现状: 2.深入了解编译 ...

  9. 幼儿园语言活动包括哪几类_幼儿园语言教育活动及设计答案

    <幼儿园语言教育活动及设计>练习题一 一.简答题 1 .幼儿期语言表达能力的发展有哪些特点? 2 .确定幼儿园语言教育目标的依据是什么? 3 .幼儿园通过哪些途径开展语言教育? 4 .儿童 ...

  10. 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言

    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个60 ...

最新文章

  1. DeepFashion: Powering Robust Clothes Recognition and Retrieval with Rich Annotations – CVPR 2016
  2. 144. Binary Tree Preorder Traversal
  3. Spark之数据倾斜 --采样分而治之解决方案
  4. python数据分析师书籍_如何自学成为数据分析师
  5. LeetCode 1057. 校园自行车分配(map有序+贪心)
  6. 全球IT公司100强排行榜出炉
  7. slack 使用说明_如何使用Node.js为Slack构建Meetupbot
  8. python使用正则化预处理数据
  9. mustache.js html模板,js模板引擎Mustache将h5模板页面转化为小程序页面
  10. Object.defineProperty()属性设置介绍
  11. 指南-AT应用指南-AT指令指南-音频播放和TTS
  12. Excel VBA批注
  13. 智能快递柜在小区的应用
  14. Linux软件开发工程师
  15. 如何给WORD文档添加外边框,教程在这里,WORD页面外边框怎么添加
  16. 信息学奥赛一本通 1335:【例2-4】连通块
  17. C++11的更新内容--auto--右值引用和移动构造--1114
  18. osgi实战学习之路:1. ant+bnd+felix搭建osgi之HelloWorld
  19. 五、中央处理器(六)多处理器的基本概念
  20. 2022-2028年中国活塞式压缩机行业市场研究分析及投资战略规划报告

热门文章

  1. SQL手工注入笔记1
  2. endnotex9安装后使用方法_EndNoteX9个人安装说明.PDF
  3. C语言趣味题:猜数字游戏(含代码创建思路与过程)
  4. Android模拟PC键盘输入法,黑科技:用电脑键盘代替手机输入法
  5. win10安装.net framework 3.5 错误代码 错误代码 0x800F0906、0x800F081F、0x800F0907
  6. java 用户态_内核启动用户态的程序 - 但行好事 莫问前程 - JavaEye技术网站
  7. Git 和Bitbucket
  8. 成都千锋培训python就业班
  9. QQ商家(QQ在线咨询,QQ推广等)
  10. Mysql引擎·索引·事务·锁机制·优化推荐