10
0
mirror of https://gitlab.com/scemama/irpf90.git synced 2024-06-02 03:15:20 +02:00
irpf90/src/parsed_text.py

251 lines
7.9 KiB
Python
Raw Normal View History

2009-09-05 00:18:45 +02:00
#!/usr/bin/python
from util import *
from irpf90_t import *
from variables import variables
from preprocessed_text import preprocessed_text
from subroutines import subroutines
import regexps
2009-09-05 15:37:23 +02:00
import error
2009-09-05 00:18:45 +02:00
def find_variables_in_line(line):
assert isinstance(line,Line)
result = []
buffer = regexps.re_string.sub('',line.text)
for v in variables.keys():
var = variables[v]
if var.regexp.search(buffer) is not None:
result.append(var.name)
return result
2009-09-05 15:37:23 +02:00
def find_subroutine_in_line(line):
assert isinstance(line,Call)
2009-09-05 16:05:00 +02:00
buffer = line.text.split('(')[0]
buffer = buffer.split()[1]
return buffer
2009-09-05 15:37:23 +02:00
2009-09-05 16:05:00 +02:00
def check_touch(line,vars,main_vars):
2009-09-05 15:37:23 +02:00
def fun(main_var):
if main_var not in variables:
error.fail(line,"Variable %s unknown"%(main_var,))
x = variables[main_var]
return [main_var]+x.others
2009-09-05 16:05:00 +02:00
all_others = make_single(flatten( map(fun,main_vars) ))
2009-09-05 15:37:23 +02:00
all_others.sort()
if len(all_others) == len(vars):
2009-09-05 16:05:00 +02:00
vars.sort()
2009-09-05 15:37:23 +02:00
for x,y in zip(vars,all_others):
if x != y:
message = "The following entities should be touched:\n"
message = "\n".join([message]+map(lambda x: "- %s"%(x,),all_others))
error.fail(line,message)
2009-09-05 00:18:45 +02:00
def get_parsed_text():
2009-09-05 16:05:00 +02:00
main_result = []
2009-09-07 16:35:34 +02:00
varlist = []
2009-09-05 00:18:45 +02:00
for filename, text in preprocessed_text:
2009-09-05 16:05:00 +02:00
result = []
2009-09-05 00:18:45 +02:00
for line in filter(
lambda x: type(x) not in [ Doc, Begin_doc, End_doc ],
text):
if type(line) in [ \
Empty_line,
Continue,
Return,
Begin_shell,
End_shell,
Openmp,
Use,
Enddo,
End_select,
Endif,
Implicit,
Program,
Subroutine,
Function,
End,
]:
2009-09-05 16:05:00 +02:00
result.append( ([],line) )
2009-09-07 16:35:34 +02:00
elif isinstance(line,End_provider):
varlist = []
result.append( ([],line) )
2009-09-05 00:18:45 +02:00
elif isinstance(line,Provide):
2009-09-07 16:35:34 +02:00
l = line.text.lower().split()[1:]
l = filter(lambda x: x not in varlist, l)
2009-09-05 16:05:00 +02:00
result.append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
2009-09-05 15:37:23 +02:00
elif isinstance(line,Call):
sub = find_subroutine_in_line(line)
2009-09-05 16:05:00 +02:00
if sub not in subroutines:
2009-09-05 15:37:23 +02:00
t = Simple_line
else:
2009-09-05 16:05:00 +02:00
if subroutines[sub].touches == []:
t = Simple_line
else:
t = Provide_all
result.append( ([],t(line.i,line.text,line.filename)) )
2009-09-05 15:37:23 +02:00
elif isinstance(line,Free):
vars = line.text.split()
if len(vars) < 2:
error.fail(line,"Syntax error")
vars = vars[1:]
result.append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
for var in vars:
2009-09-05 16:05:00 +02:00
result.append( ([],Simple_line(line.i," call free_%s"%var,
2009-09-05 15:37:23 +02:00
line.filename)) )
elif isinstance(line,Touch):
vars = line.text.split()
if len(vars) < 2:
error.fail(line,"Syntax error")
2009-09-05 16:05:00 +02:00
vars = map(lower,vars[1:])
2009-09-05 15:37:23 +02:00
def fun(x):
if x not in variables:
error.fail(line,"Variable %s unknown"%(x,))
main = variables[x].same_as
if main is None:
main = x
return main
main_vars = make_single( map(fun, vars) )
2009-09-05 16:05:00 +02:00
check_touch(line,vars,main_vars)
2009-09-05 15:37:23 +02:00
txt = " ".join(vars)
2009-09-05 16:05:00 +02:00
result += [ ([],Simple_line(line.i,"!",line.filename)),
2009-09-07 16:35:34 +02:00
([],Simple_line(line.i,"! >>> TOUCH %s"%(txt,),line.filename)) ]
2009-09-05 15:37:23 +02:00
def fun(x):
if x not in variables:
error.fail(line,"Variable %s unknown"%(x,))
return [ ([],Simple_line(line.i," call touch_%s"%(x,),line.filename)),
([],Simple_line(line.i," %s_is_built = .True."%(x,),line.filename)) ]
2009-09-05 16:05:00 +02:00
result += flatten(map( fun, main_vars ))
2009-09-05 15:37:23 +02:00
def fun(x):
if x not in variables:
error.fail(line,"Variable %s unknown"%(x,))
2009-09-05 16:05:00 +02:00
return ([],Simple_line(line.i," %s_is_built = .True."%(x,),line.filename))
result += map( fun, main_vars[:-1] )
2009-09-05 15:37:23 +02:00
result += [ ([],Provide_all(line.i,"! <<< END TOUCH",line.filename)) ]
2009-09-06 00:47:20 +02:00
elif type(line) in [ Begin_provider, Cont_provider ]:
2009-09-07 16:35:34 +02:00
if isinstance(line,Begin_provider):
varlist = []
2009-09-06 00:47:20 +02:00
buffer = map(strip,line.text.replace(']','').split(','))
assert len(buffer) > 1
v = buffer[1].lower()
2009-09-07 16:35:34 +02:00
varlist.append(v)
2009-09-06 00:47:20 +02:00
variable_list = find_variables_in_line(line)
variable_list.remove(v)
result.append( (variable_list,line) )
2009-09-05 00:18:45 +02:00
else:
l = find_variables_in_line(line)
2009-09-07 16:35:34 +02:00
l = filter(lambda x: x not in varlist, l)
2009-09-05 16:05:00 +02:00
result.append( (l,line) )
main_result.append( (filename, result) )
return main_result
2009-09-05 00:18:45 +02:00
parsed_text = get_parsed_text()
2009-09-07 16:35:34 +02:00
######################################################################
def move_variables():
main_result = []
for filename, text in parsed_text:
result = []
# 1st pass
2009-09-07 16:55:11 +02:00
varlist = []
ifvars = []
elsevars = []
old_varlist = []
old_ifvars = []
old_elsevars = []
2009-09-07 16:35:34 +02:00
revtext = list(text)
revtext.reverse()
for vars,line in revtext:
if type(line) in [ End_provider,End ]:
varlist = []
result.append( ([],line) )
elif type(line) in [ Endif, End_select ]:
2009-09-07 16:55:11 +02:00
old_ifvars.append(ifvars)
old_elsevars.append(elsevars)
2009-09-07 16:35:34 +02:00
old_varlist.append(varlist)
varlist = []
result.append( ([],line) )
2009-09-07 16:55:11 +02:00
elif type(line) == Else:
result.append( (varlist,line) )
elsevars = list(varlist)
if vars != []:
varlist = old_varlist.pop()
varlist += vars
old_varlist.append(varlist)
varlist = []
elif type(line) in [ Elseif, Case ]:
ifvars += varlist
2009-09-07 16:35:34 +02:00
result.append( (varlist,line) )
if vars != []:
varlist = old_varlist.pop()
varlist += vars
old_varlist.append(varlist)
varlist = []
elif type(line) in [ If, Select ]:
2009-09-07 16:55:11 +02:00
ifvars += varlist
2009-09-07 16:35:34 +02:00
result.append( (varlist,line) )
2009-09-07 16:55:11 +02:00
vars += filter(lambda x: x in elsevars, ifvars)
ifvars = old_ifvars.pop()
elsevars = old_elsevars.pop()
2009-09-07 16:35:34 +02:00
varlist = old_varlist.pop()
varlist += vars
elif type(line) in [ Begin_provider, Subroutine, Function ]:
varlist += vars
result.append( (varlist,line) )
assert old_varlist == []
2009-09-07 16:55:11 +02:00
assert old_ifvars == []
assert old_elsevars == []
2009-09-07 16:35:34 +02:00
varlist = []
else:
varlist += vars
result.append( ([],line) )
result.reverse()
# 2nd pass
text = result
result = []
old_varlist = []
varlist = []
2009-09-07 16:55:11 +02:00
if len(text) > 0:
lenmax = 80 - len(text[0][1].filename)
format = "%"+str(lenmax)+"s ! %s:%4s"
2009-09-07 16:35:34 +02:00
for vars,line in text:
2009-09-07 16:55:11 +02:00
line.text = format%(line.text.ljust(lenmax),line.filename,str(line.i))
2009-09-07 16:35:34 +02:00
if vars != []:
vars = make_single(vars)
if type(line) in [ Begin_provider, Subroutine, Function ]:
varlist = list(vars)
elif type(line) in [ If, Select ]:
old_varlist.append(varlist)
vars = filter(lambda x: x not in varlist,vars)
varlist = make_single(varlist + vars)
assert old_varlist is not varlist
elif type(line) in [ Elseif, Else, Case ]:
varlist = old_varlist.pop()
old_varlist.append(varlist)
vars = filter(lambda x: x not in varlist,vars)
varlist = make_single(varlist + vars)
assert old_varlist is not varlist
elif type(line) in [ Endif, End_select ]:
varlist = old_varlist.pop()
elif type(line) == Provide_all:
vars = varlist
elif type(line) in [ End_provider, End ]:
assert old_varlist == []
varlist = []
result.append( (vars,line) )
main_result.append( (filename, result) )
return main_result
parsed_text = move_variables()
######################################################################
def build_needs():
pass
2009-09-05 00:18:45 +02:00
if __name__ == '__main__':
2009-09-07 16:35:34 +02:00
for i in range(len(parsed_text)):
print '!-------- %s -----------'%(parsed_text[i][0])
for line in parsed_text[i][1]:
print line[1]
print line[0]