コンパイル原理-文法分析-文法分析-意味分析生成中間コード-python版


# -*- coding:UTF-8 -*-
#!/usr/bin/python
import string
import sys
import Analyze_2
Identifier=['if','else','for','while','do','int','write','read','']
Delimiter="( ) } { ;"
Operator_1="+-*/"
Operator_2="<>="
def init(FileName):
	i=0
	row=1
	j=0
	Got_char=[]
	Str=''
	file_1=open(FileName,'r')
	file_2=open("analyze_2.txt",'wr')
	fin=file_1.read()
	file_1.close()
	for x in fin:
		Got_char.append(x)
	#judge String -----------------------***************************---------------------
	while i=8:
				file_2.write(Str+' ID '+str(row)+'
') else: file_2.write(Str+' '+Str+' '+str(row)+'
') Str='' j=0 #Judge Number ************************--------------------********************** elif Got_char[i].isdigit(): Str+=Got_char[i] i+=1 if Got_char[i-1]!='0'and Got_char[i].isdigit(): while Got_char[i].isdigit(): Str+=Got_char[i] i+=1 file_2.write(Str+' NUM '+str(row)+'
') Str='' #Judge Delimiter ---------------------********************-------------- elif Delimiter.find(Got_char[i])>=0: Str+=Got_char[i] i+=1 file_2.write(Str+' '+Str+' '+str(row)+'
') Str='' #Judge Operator ********************-----------------------************* elif Operator_1.find(Got_char[i])>=0 and Got_char[i+1]!='*' : Str+=Got_char[i] i+=1 file_2.write(Str+' '+Str+' '+str(row)+'
') Str='' elif Operator_2.find(Got_char[i])>=0: Str+=Got_char[i] i+=1 if Got_char[i]=='=': Str+=Got_char[i] i+=1 file_2.write(Str+' '+Str+' '+str(row)+'
') Str='' elif Got_char[i]=='!': Str+=Got_char[i] i+=1 if Got_char[i]=='=': Str+=Got_char[i] i+=1 file_2.write(Str+' '+Str+' '+str(row)+'
') Str='' #Judge Comment **************-----------------------------************* elif Got_char[i]=='/': Str+=Got_char[i] i+=1 if Got_char[i]=='*': Str+=Got_char[i] i+=1 while(Got_char[i]!='*'or Got_char[i+1]!='/'): Str+=Got_char[i] print i,len(Got_char) i+=1 if i+1>=len(Got_char): break if Got_char[i]=='*'and Got_char[i+1]=='/': Str+=Got_char[i]+Got_char[i+1] i+=1 if i>len(Got_char): break file_2.write(Str+' Comment '+str(row)+'
') Str=''
i=0
row=1
Str=''
Got_char=[]
data={}
addr=0
file_new=open("analyze_3.txt",'wr')
labelp=0
# -*- coding:UTF-8 -*-
#!/usr/bin/python
import Analyze_1
from optparse import OptionParser 
def main():
	Parse=OptionParser(
		"-f   Input your TEST Code"+\
		"
-h For Help") Parse.add_option('-f',dest='FileName',type='string', help='Please Input your TEST Code whith it ') (options,args)=Parse.parse_args() if(options.FileName==None): print Parse.usage else: FileName=options.FileName Analyze_1.main(FileName) if __name__ == '__main__': main()

else :i+=1continuefile_2.close()def main(FileName):init(FileName)Analyze_2.main()if __name__ == '__main__':main(FileName)
 
  
# -*- coding:UTF-8 -*-
#!/usr/bin/python
import string
import Analyze_1
import globalValues
#i%3 row / i%2 keyword / i%1 type
FOLLOW_declaration_list=['if','while','for','read','write','{','}',';','ID','NUM']
FIRST_statement_list=['if','while','for','read','write','{',';','ID','NUM']
FIRST_bool_expr_1=[">", "=", "<=", "==", "!="]#fllow(C)
FIRST_expr=['ID','NUM','(']

#@name-def nt
def name_find(new_name):
	flag=0
	for (name,addr) in globalValues.data.items():
		if name == new_name:
			flag=1
			print '[-]Error of id ,plead renew \''+new_name+' \'in Line'+str(globalValues.row)
			break
	if flag == 0 :
		globalValues.data[new_name] = globalValues.addr
		globalValues.addr+=1


def name_lookup(new_name):
	flag=0
	for (name,addr) in globalValues.data.items():
		if name == new_name:
			flag=1
			break
	if flag == 0 :
		return 0
	else:
		return 1


def GET_next_word():
	globalValues.i+=3
	if globalValues.i>=len(globalValues.Got_char) and globalValues.Got_char[globalValues.i]!='}':
		globalValues.file_new.write('      STOP 
') exit() def program(): if(cmp(globalValues.Got_char[globalValues.i],'{')): print "[-]Error : lack of '{' in Line "+str(globalValues.Got_char[globalValues.i-1]) else: GET_next_word() declaration_list() statement_list() print "[+]Finished at the word "+globalValues.Got_char[globalValues.i]+"in Line "+globalValues.Got_char[globalValues.i-1] if cmp(globalValues.Got_char[globalValues.i],'}'): print "[-]Error : lack of '}' in Line "+str(globalValues.Got_char[globalValues.i-1]) else: GET_next_word() globalValues.file_new.write(' STOP
') #first='{' def declaration_list(): if cmp(globalValues.Got_char[(globalValues.i+1)],'int')==0 : declaration_stat() declaration_list() elif globalValues.Got_char[globalValues.i+1] in FOLLOW_declaration_list: return # | ε def statement_list(): if globalValues.Got_char[globalValues.i+1] in FIRST_statement_list: statement() statement_list() elif globalValues.Got_char[globalValues.i]=='}': return #| ε def declaration_stat(): if cmp(globalValues.Got_char[(globalValues.i+1)],'int')==0: GET_next_word() if cmp(globalValues.Got_char[(globalValues.i+1)],'ID')==0: name_find(globalValues.Got_char[(globalValues.i)]) GET_next_word() else: print "[-]Error : 'ID' Defiend error in Line "+str(globalValues.Got_char[globalValues.i-1]) while globalValues.Got_char[globalValues.i+1]!=';': GET_next_word() if cmp(globalValues.Got_char[(globalValues.i+1)],';')==0: GET_next_word() else: print "[-]Error : lack of ';' in Line "+str(globalValues.Got_char[globalValues.i-1])#last char_row return #→int ID; *****************************************************************************add vartablep! def statement(): if cmp(globalValues.Got_char[globalValues.i+1],'if')==0: GET_next_word() if_stat() elif cmp(globalValues.Got_char[globalValues.i+1],'while')==0: GET_next_word() while_stat() elif cmp(globalValues.Got_char[globalValues.i+1],'for')==0 : GET_next_word() for_stat() elif cmp(globalValues.Got_char[globalValues.i+1],'read')==0: GET_next_word() read_stat() elif cmp(globalValues.Got_char[globalValues.i+1],'write')==0: GET_next_word() write_stat() elif cmp(globalValues.Got_char[globalValues.i+1],'{')==0: GET_next_word() compound_stat() elif globalValues.Got_char[globalValues.i+1] in FIRST_expr or globalValues.Got_char[globalValues.i+1]==';': expression_stat() def if_stat(): if globalValues.Got_char[globalValues.i+1]=='(': GET_next_word() else: print "[-]Error : Lack of '(' in Line "+ globalValues.Got_char[i-1] expression() if globalValues.Got_char[globalValues.i+1]==')': GET_next_word() else: print "[-]Error : Lack of ')' in Line "+ globalValues.Got_char[i-1] label1 = globalValues.labelp + 1 globalValues.labelp+=1 globalValues.file_new.write('BRF LABEL%s
'%label1) statement() label2 = globalValues.labelp + 1 globalValues.labelp+=1 globalValues.file_new.write('BR LABEL%s
'%label2) globalValues.file_new.write('LABEL%s:
'%label1) if cmp(globalValues.Got_char[globalValues.i+1],'else')==0 : GET_next_word() statement() globalValues.file_new.write('LABEL%s:
'%label2) # → if () | if () else < statement > def while_stat(): label1=globalValues.labelp + 1 globalValues.labelp+=1 globalValues.file_new.write('LABEL%s:
'%label1) if globalValues.Got_char[globalValues.i+1]=='(': GET_next_word() else: print "[-]Error : Lack of '(' in Line "+ globalValues.Got_char[i-1] expression() if globalValues.Got_char[globalValues.i+1]==')': GET_next_word() else: print "[-]Error : Lack of ')' in Line "+ globalValues.Got_char[i-1] label2 = globalValues.labelp + 1 globalValues.labelp+=1 globalValues.file_new.write('BRF LABEL%d
'%label2) statement() globalValues.file_new.write('BR LABEL%s
'%label1) globalValues.file_new.write('LABEL%s:
'%label2) # → while () < statement > def for_stat(): if globalValues.Got_char[globalValues.i+1]=='(': GET_next_word() else: print "[-]Error : Lack of '(' in Line "+ globalValues.Got_char[globalValues.i-1] expression() globalValues.file_new.write(' POP
') if globalValues.Got_char[globalValues.i+1] ==';': GET_next_word() else: print "[-]Error : Lack of ';' in Line "+ globalValues.Got_char[globalValues.i-1] label1 = globalValues.labelp + 1 globalValues.labelp+=1 globalValues.file_new.write('LABEL%s:
'%label1) expression() label2=globalValues.labelp + 1 globalValues.labelp+=1 globalValues.file_new.write(' BRF LABEL%s
'%label2) label3 = globalValues.labelp + 1 globalValues.labelp+=1 globalValues.file_new.write(' BR LABEL%s
'%label3) if globalValues.Got_char[globalValues.i+1]==';': GET_next_word() else: print "[-]Error : Lack of ';' in Line "+ globalValues.Got_char[globalValues.i-1] label4 = globalValues.labelp + 1 globalValues.labelp+=1 globalValues.file_new.write('LABEL%s:
'%label4) expression() globalValues.file_new.write(' POP
') globalValues.file_new.write(' BR LABEL%s
'%label1) if globalValues.Got_char[globalValues.i+1] ==')': GET_next_word() else: print "[-]Error : Lack of ')' in Line "+ globalValues.Got_char[globalValues.i-1] globalValues.file_new.write('LABEL%s:
'%label3) statement() globalValues.file_new.write(' BR LABEL%s
'%label4) globalValues.file_new.write('LABEL%s:
'%label2) # → for (;;) def read_stat(): if globalValues.Got_char[globalValues.i+1]=='ID': GET_next_word() else: print "[-]Error : Lack of 'ID' in Line "+globalValues.Got_char[globalValues.i-1] globalValues.file_new.write(' IN
') globalValues.file_new.write(' STO %s
'%globalValues.data[globalValues.Got_char[globalValues.i-3]]) globalValues.file_new.write(' POP
') if globalValues.Got_char[globalValues.i+1]==';': GET_next_word() else: print "[-]Error : Lack of ';' in Line "+globalValues.Got_char[globalValues.i-1] # →read ID; def write_stat(): expression() if globalValues.Got_char[globalValues.i+1]!=';': print "[-]Error : Lack of ';' in Line "+ globalValues.Got_char[globalValues.i-1] globalValues.file_new.write(' OUT
') # →write ; def compound_stat(): statement_list() if(globalValues.Got_char[globalValues.i+1]=='}'): GET_next_word() else: print "[-]Error : Lack of '}' in Line of "+ globalValues.Got_char[globalValues.i-1] # →{} def expression_stat(): if globalValues.Got_char[globalValues.i+1]==';': GET_next_word() else: expression() globalValues.file_new.write(' POP
') if globalValues.Got_char[globalValues.i+1]==';': GET_next_word() else: print "[-]Error : Lack of ';' in Line "+globalValues.Got_char[globalValues.i-1] # →< expression >;|; def expression(): if globalValues.Got_char[globalValues.i+1]=='ID': GET_next_word() if globalValues.Got_char[globalValues.i+1]=='=': if name_lookup(globalValues.Got_char[globalValues.i-3]) == 0: return tmp = globalValues.data[globalValues.Got_char[globalValues.i-3]] GET_next_word() bool_expr() globalValues.file_new.write(' STO %s
'%tmp) else: globalValues.i-=3 bool_expr() else: bool_expr() #< expression > → ID=| def bool_expr(): if globalValues.Got_char[globalValues.i+1] in FIRST_expr: additive_expr() additive_expr_E() #E def additive_expr_E(): if globalValues.Got_char[globalValues.i+1] in FIRST_bool_expr_1: GET_next_word() additive_expr() if globalValues.Got_char[globalValues.i-6] == '>': globalValues.file_new.write(' GT
') if globalValues.Got_char[globalValues.i-6] == '>=': globalValues.file_new.write(' GE
') if globalValues.Got_char[globalValues.i-6] == '|=|<=|==|!=)< additive_expr > #fllow= def term(): if globalValues.Got_char[globalValues.i+1] in FIRST_expr: factor() factor_D() #< term > →< factor >D , def additive_expr(): if globalValues.Got_char[globalValues.i+1] in FIRST_expr: term() term_C() else: print "[-]Error : There is an error of \'expression\' in Line "+globalValues.Got_char[globalValues.i-1] #< additive_expr> →< term >C def term_C(): if globalValues.Got_char[globalValues.i+1] =='+' or globalValues.Got_char[globalValues.i+1]=='-': if globalValues.Got_char[globalValues.i] == '+': globalValues.file_new.write(' ADD
') else: globalValues.file_new.write(' SUB
') GET_next_word() term() term_C() elif globalValues.Got_char[globalValues.i+1]==';'or globalValues.Got_char[globalValues.i+1]==')' or globalValues.Got_char[globalValues.i+1] in FIRST_bool_expr_1: return #C →+C|-C|ε #Follow(C)={;, ), (>|=|<=|==|!=)} def factor(): if globalValues.Got_char[globalValues.i+1] =='(': GET_next_word() expression() if globalValues.Got_char[globalValues.i+1] ==')': GET_next_word() else: print "[-]Error : Lack of ')' in Line "+globalValues.Got_char[globalValues.i-1] elif globalValues.Got_char[globalValues.i+1] =='ID'or globalValues.Got_char[globalValues.i+1] =='NUM': if globalValues.Got_char[globalValues.i+1] == 'ID': globalValues.file_new.write(' LOAD %s
'%globalValues.data[globalValues.Got_char[globalValues.i]]) else : globalValues.file_new.write(' LOADI %s
'%globalValues.Got_char[globalValues.i]) GET_next_word() #< factor > →(< expression >)|ID|NUM def factor_D(): if globalValues.Got_char[globalValues.i+1]=='*'or globalValues.Got_char[globalValues.i+1]=='/': if globalValues.Got_char[globalValues.i] == '*': globalValues.file_new.write(' MULT
') else: globalValues.file_new.write(' DIV
') GET_next_word() factor() factor_D() elif globalValues.Got_char[globalValues.i+1]==';'or globalValues.Got_char[globalValues.i+1] ==')' or globalValues.Got_char[globalValues.i+1] in FIRST_bool_expr_1: return # D →*D|/D|ε def main(): file=open("analyze_2.txt",'r') fin=file.read() for x in fin: if x!=' ' and x!='
': globalValues.Str+=x else: globalValues.Got_char.append(globalValues.Str) globalValues.Str='' globalValues.Got_char.append('') globalValues.Got_char.append('') globalValues.Got_char.append('') #prevent out of index program() if __name__ == '__main__': main()