# -*- 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)+'\n')
else:
file_2.write(Str+' '+Str+' '+str(row)+'\n')
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)+'\n')
Str=''
#Judge Delimiter ---------------------********************--------------
elif Delimiter.find(Got_char[i])>=0:
Str+=Got_char[i]
i+=1
file_2.write(Str+' '+Str+' '+str(row)+'\n')
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)+'\n')
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)+'\n')
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)+'\n')
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)+'\n')
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"+\
"\n-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 \n')
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 \n')
#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\n'%label1)
statement()
label2 = globalValues.labelp + 1
globalValues.labelp+=1
globalValues.file_new.write('BR LABEL%s\n'%label2)
globalValues.file_new.write('LABEL%s:\n'%label1)
if cmp(globalValues.Got_char[globalValues.i+1],'else')==0 :
GET_next_word()
statement()
globalValues.file_new.write('LABEL%s:\n'%label2)
# → if () | if () else < statement >
def while_stat():
label1=globalValues.labelp + 1
globalValues.labelp+=1
globalValues.file_new.write('LABEL%s:\n'%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\n'%label2)
statement()
globalValues.file_new.write('BR LABEL%s\n'%label1)
globalValues.file_new.write('LABEL%s:\n'%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\n')
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:\n'%label1)
expression()
label2=globalValues.labelp + 1
globalValues.labelp+=1
globalValues.file_new.write(' BRF LABEL%s\n'%label2)
label3 = globalValues.labelp + 1
globalValues.labelp+=1
globalValues.file_new.write(' BR LABEL%s\n'%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:\n'%label4)
expression()
globalValues.file_new.write(' POP\n')
globalValues.file_new.write(' BR LABEL%s\n'%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:\n'%label3)
statement()
globalValues.file_new.write(' BR LABEL%s\n'%label4)
globalValues.file_new.write('LABEL%s:\n'%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 \n')
globalValues.file_new.write(' STO %s\n'%globalValues.data[globalValues.Got_char[globalValues.i-3]])
globalValues.file_new.write(' POP\n')
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\n')
# →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\n')
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\n'%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\n')
if globalValues.Got_char[globalValues.i-6] == '>=':
globalValues.file_new.write(' GE\n')
if globalValues.Got_char[globalValues.i-6] == '<':
globalValues.file_new.write(' LES\n')
if globalValues.Got_char[globalValues.i-6] == '<=':
globalValues.file_new.write(' LE\n')
if globalValues.Got_char[globalValues.i-6] == '==':
globalValues.file_new.write(' EQ\n')
if globalValues.Got_char[globalValues.i-6] == '!=':
globalValues.file_new.write(' NOTEQ\n')
elif globalValues.Got_char[globalValues.i+1] ==';'or globalValues.Got_char[globalValues.i+1]==')':
return
#E→ε|(>|<|>=|<=|==|!=)< 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\n')
else:
globalValues.file_new.write(' SUB\n')
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\n'%globalValues.data[globalValues.Got_char[globalValues.i]])
else :
globalValues.file_new.write(' LOADI %s\n'%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\n')
else:
globalValues.file_new.write(' DIV\n')
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!='\n':
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()