Skip to content

Commit

Permalink
more brushing up Python scripts
Browse files Browse the repository at this point in the history
git-svn-id: https://slps.svn.sourceforge.net/svnroot/slps@611 ab42f6e0-554d-0410-b580-99e487e6eeb2
  • Loading branch information
grammarware committed Apr 27, 2009
1 parent 4ce8738 commit cf17e9b
Show file tree
Hide file tree
Showing 9 changed files with 253 additions and 298 deletions.
50 changes: 7 additions & 43 deletions shared/python/bgf_check.py
@@ -1,53 +1,17 @@
#!/usr/bin/python
import os
import sys

productions = "count(/*/*[local-name()='production'])"
nonterminals = "count(/*[local-name()='grammar']/*/nonterminal[not(text()=../preceding-sibling::*/nonterminal/text())])"
top = "count(/*/*/nonterminal[not(text()=/*/*/*//nonterminal/text()) and not(text()=../preceding-sibling::*/nonterminal/text())])"
listtop = "/*/*/nonterminal[not(text()=/*/*/*//nonterminal/text()) and not(text()=../preceding-sibling::*/nonterminal/text())]"
bottom = " | (echo '<set>' ; xpath '//nonterminal[not(text()=/*/*/nonterminal/text())]' 2> /dev/null; echo '</set>' )| xpath 'count(//nonterminal[not(text()=preceding-sibling::*/text())])' "
listbottom = "//nonterminal[not(text()=/*/*/nonterminal/text())]"
unique = " | (echo '<set>' ; xpath '//nonterminal' 2> /dev/null; echo '</set>' )| xpath 'count(//nonterminal[not(text()=preceding-sibling::*/text())])' "

def runxpath(filename,xpathexpr):
os.system('xpath '+filename+' "'+xpathexpr+'" 1>TMP-res 2>/dev/null')
tmp = open('TMP-res','r')
res = tmp.readline().strip()
tmp.close()
return res

def runxpathlist(filename,xpathexpr):
os.system('xpath '+filename+' "'+xpathexpr+'" 1>TMP-res 2>/dev/null')
tmp = open('TMP-res','r')
resa = tmp.readline().strip().split('<nonterminal>')
resu = []
for x in resa:
if x not in resu:
resu.append(x)
resu.sort()
return ''.join(resu).replace('</nonterminal>',', ')[:-2]
tmp.close()
res = res.replace('<nonterminal>','').replace('</nonterminal>',', ')
return res[:-2]

def runxpath2(filename,xpathexpr):
os.system('cat '+filename+xpathexpr+' 1>TMP-res 2>/dev/null')
tmp = open('TMP-res','r')
res = tmp.readline().strip()
tmp.close()
return res
import slpsXPath

if __name__ == "__main__":
if len(sys.argv) != 2:
print 'This tool generates an overview of a bunch of BGF sources and targets.'
print 'This tool generates an overview of a BGF file.'
print 'Usage:'
print ' checkbgf <bgf>'
sys.exit(1)
print 'Productions: ',runxpath(sys.argv[1],productions)
print 'Nonterminals defined:',runxpath(sys.argv[1],nonterminals)
print '%20s:' % 'unique',runxpath2(sys.argv[1],unique)
print '%20s:' % 'bottom',runxpath2(sys.argv[1],bottom),'(',runxpathlist(sys.argv[1],listbottom),')'
print '%20s:' % 'top',runxpath(sys.argv[1],top),'(',runxpathlist(sys.argv[1],listtop),')'
print 'Productions: ',slpsXPath.runxpath(sys.argv[1],slpsXPath.productions)
print 'Nonterminals defined:',slpsXPath.runxpath(sys.argv[1],slpsXPath.nonterminals)
print '%20s:' % 'unique',slpsXPath.runxpath2(sys.argv[1],slpsXPath.unique)
print '%20s:' % 'bottom',slpsXPath.runxpath2(sys.argv[1],slpsXPath.bottom),'(',slpsXPath.runxpathlist(sys.argv[1],slpsXPath.listbottom),')'
print '%20s:' % 'top',slpsXPath.runxpath(sys.argv[1],slpsXPath.top),'(',slpsXPath.runxpathlist(sys.argv[1],slpsXPath.listtop),')'
sys.exit(0)

33 changes: 33 additions & 0 deletions shared/python/bgf_overview.py
@@ -0,0 +1,33 @@
#!/usr/bin/python
import os
import sys
import slpsXPath
import slpsns
import elementtree.ElementTree as ET

names = []

if __name__ == "__main__":
if len(sys.argv) != 4:
print 'This tool generates an overview of a bunch of BGF sources and targets.'
print 'Usage:'
print ' bgfover <lcf> <bgfs-path> <xpath>'
sys.exit(1)
lcf = ET.parse(sys.argv[1])
for x in lcf.findall(sys.argv[3]):
name = x.findtext('name')
names.append(name)
path = sys.argv[2]
if path[-1]!='/':
path += '/'
print '''\\begin{tabular}{l|c|c|c|c}
&\\numberOfProductions
&\\numberOfNonterminals
&\\numberOfTops
&\\numberOfBottoms
\\\\\\hline\\hline
'''
for x in names:
print '\\emph{'+x+'}&'+slpsXPath.runxpath(path+x+'.bgf',slpsXPath.productions)+'&'+slpsXPath.runxpath(path+x+'.bgf',slpsXPath.nonterminals)+'&'+slpsXPath.runxpath(path+x+'.bgf',slpsXPath.top)+'&'+slpsXPath.runxpath2(path+x+'.bgf',slpsXPath.bottom)+'\\\\\\hline'
print '\\end{tabular}'
sys.exit(0)
93 changes: 93 additions & 0 deletions shared/python/slpsXPath.py
@@ -0,0 +1,93 @@
#!/usr/bin/python
import os
import slpsns

productions = "count(/*/*[local-name()='production'])"
nonterminals = "count(/*[local-name()='grammar']/*/nonterminal[not(text()=../preceding-sibling::*/nonterminal/text())])"
top = "count(/*/*/nonterminal[not(text()=/*/*/*//nonterminal/text()) and not(text()=../preceding-sibling::*/nonterminal/text())])"
listtop = "/*/*/nonterminal[not(text()=/*/*/*//nonterminal/text()) and not(text()=../preceding-sibling::*/nonterminal/text())]"
oldbottom = "count(/*/*[not(*//nonterminal)]/nonterminal[not(text()=../preceding-sibling::*/nonterminal/text())])"
bottom = " | (echo '<set>' ; xpath '//nonterminal[not(text()=/*/*/nonterminal/text())]' 2> /dev/null; echo '</set>' )| xpath 'count(//nonterminal[not(text()=preceding-sibling::*/text())])' "
listbottom = "//nonterminal[not(text()=/*/*/nonterminal/text())]"
unique = " | (echo '<set>' ; xpath '//nonterminal' 2> /dev/null; echo '</set>' )| xpath 'count(//nonterminal[not(text()=preceding-sibling::*/text())])' "

safexbgf = ('abridge','detour','anonymize','deanonymize','unlabel','designate',
'deyaccify','yaccify','eliminate','introduce','inline','extract',
'unfold','fold','horizontal','vertical','distribute','factor',
'massage','chain','unchain','skip','reroot','import')
#safexbgf = ('eliminate','introduce','chain', 'designate', 'deyaccify','distribute',
# 'extract', 'factor', 'fold', 'horizontal','inline', 'massage',
# 'rename', 'reroot', 'unfold','vertical', 'yaccify', 'unchain', 'skip')
incdecxbgf = ('remove','add','disappear','appear','narrow','widen',
'downgrade','upgrade','rassoc','lassoc','unite')
#incdecxbgf = ('add', 'narrow', 'remove','unite', 'widen', 'rassoc', 'lassoc')
messyxbgf = ('permute', 'dump','project','inject','concretize','abstractize')

rkeys = ('LOC','NOI','NOX','NI~','NI+','NI!','SGO','COR','NI^','SID','SRE')

def runxpath(filename,xpathexpr):
os.system('xpath '+filename+' "'+xpathexpr+'" 1>TMP-res 2>/dev/null')
tmp = open('TMP-res','r')
res = tmp.readline().strip()
tmp.close()
return res

def runxpathlist(filename,xpathexpr):
os.system('xpath '+filename+' "'+xpathexpr+'" 1>TMP-res 2>/dev/null')
tmp = open('TMP-res','r')
resa = tmp.readline().strip().split('<nonterminal>')
resu = []
for x in resa:
if x not in resu:
resu.append(x)
resu.sort()
return ''.join(resu).replace('</nonterminal>',', ')[:-2]
tmp.close()
res = res.replace('<nonterminal>','').replace('</nonterminal>',', ')
return res[:-2]

def runxpath2(filename,xpathexpr):
os.system('cat '+filename+xpathexpr+' 1>TMP-res 2>/dev/null')
tmp = open('TMP-res','r')
res = tmp.readline().strip()
tmp.close()
return res

def noni(xbgf,arrayxbgf):
global xbgfns
cx = 0
for c in arrayxbgf:
cx += len(xbgf.findall('//'+slpsns.xbgf_(c)))
return cx

def noPartiallyUnsafe(xbgf):
return len(xbgf.findall('//'+slpsns.xbgf_('strip/terminal')))+\
len(xbgf.findall('//'+slpsns.xbgf_('strip/allTerminals')))+\
len(xbgf.findall('//'+slpsns.xbgf_('rename/terminal')))

def noPartiallySafe(xbgf):
return len(xbgf.findall('//'+slpsns.xbgf_('strip/selector')))+\
len(xbgf.findall('//'+slpsns.xbgf_('strip/allSelectors')))+\
len(xbgf.findall('//'+slpsns.xbgf_('strip/label')))+\
len(xbgf.findall('//'+slpsns.xbgf_('strip/allLabels')))+\
len(xbgf.findall('//'+slpsns.xbgf_('rename/nonterminal')))+\
len(xbgf.findall('//'+slpsns.xbgf_('rename/selector')))+\
len(xbgf.findall('//'+slpsns.xbgf_('rename/label')))

def loc(filename):
f = open(filename,'r')
c = len(f.readlines())
f.close()
return c-1

def nosi(filename,keyword):
f = open(filename,'r')
c = ''.join(f.readlines()).count(keyword)
f.close()
return c

def noi(filename):
f = open(filename,'r')
c = ''.join(f.readlines()).count('<!--')
f.close()
return c
@@ -1,32 +1,14 @@
#!/usr/bin/python
import os
import sys
import slpsns
import slpsXPath
import elementtree.ElementTree as ET

names = []
targets = {}
results = {}

bgfns = 'http://planet-sl.org/bgf'
xbgfns= 'http://planet-sl.org/xbgf'
xsdns = 'http://www.w3.org/2001/XMLSchema'

ET._namespace_map[bgfns] = 'bgf'
ET._namespace_map[xbgfns]='xbgf'
ET._namespace_map[xsdns] = 'xsd'

def loc(filename):
f = open(filename,'r')
c = len(f.readlines())
f.close()
return c-1

def noi(filename):
f = open(filename,'r')
c = ''.join(f.readlines()).count('<!--')
f.close()
return c

def report(keys,key,note):
s = note.replace('xbgf:','')
cx = 0
Expand All @@ -47,9 +29,9 @@ def report(keys,key,note):
sys.exit(1)
xsd = ET.parse(sys.argv[1])
gn = 0
for x in xsd.findall('/xsd:group/xsd:choice'.replace('xsd:','{'+xsdns+'}')):
for x in xsd.findall('/'+slpsns.xsd_('group')+'/'+slpsns.xsd_('choice')):
names.append([])
for y in x.findall('xsd:element'.replace('xsd:','{'+xsdns+'}')):
for y in x.findall(slpsns.xsd_('element')):
if y.attrib.has_key('ref'):
names[gn].append(y.attrib['ref'])
gn += 1
Expand All @@ -76,13 +58,13 @@ def report(keys,key,note):
results['NOI'][x] = 0
results['NOX'][x] = 0
for y in targets[x]:
results['LOC'][x] += loc(path+y+'.xbgf')
results['NOI'][x] += noi(path+y+'.xbgf')
results['LOC'][x] += slpsXPath.loc(path+y+'.xbgf')
results['NOI'][x] += slpsXPath.noi(path+y+'.xbgf')
xbgf = ET.parse(path+y+'.xbgf')
results['NOX'][x] += len(xbgf.findall('/*'))
for z in names:
for q in z:
results[q][x] += len(xbgf.findall(q.replace('xbgf:','{'+xbgfns+'}')))
results[q][x] += len(xbgf.findall(q.replace('xbgf:',slpsns.xbgf_(''))))
for x in names:
for y in x:
used = False
Expand Down
110 changes: 110 additions & 0 deletions shared/python/xbgf_overview.py
@@ -0,0 +1,110 @@
#!/usr/bin/python
import os
import sys
import slpsns
import slpsXPath
import elementtree.ElementTree as ET

names = []
targets = {}
results = {}

def report(keys,key,note):
print note,
cx = 0
for x in keys:
cx += results[key][x]
if results[key][x]:
print '{',results[key][x],'}'
else:
print '{---}',
print '{'+`cx`+'}'

if __name__ == "__main__":
if len(sys.argv) != 4:
print 'This tool generates an overview of a bunch of XBGF scripts.'
print 'Usage:'
print ' xbgfover <xbgf.xsd> <lcf> <xbgfs-path>'
sys.exit(1)
lcfname = sys.argv[2].split('/')[-1].split('.')[0]
xsd = ET.parse(sys.argv[1])
for x in xsd.findall('/*'):
if x.attrib.has_key('name'):
names.append(x.attrib['name'])
lcf = ET.parse(sys.argv[2])
for x in lcf.findall('/target'):
name = x.findtext('name')
targets[name] = []
for y in x.findall('branch/*/perform'):
targets[name].append(y.text)
path = sys.argv[3]
if path[-1] != '/':
path += '/'
for x in slpsXPath.rkeys:
results[x] = {}
for x in names:
results[x] = {}
for y in targets.keys():
results[x][y] = 0
for x in targets.keys():
for y in slpsXPath.rkeys:
results[y][x] = 0
for y in targets[x]:
xbgf = ET.parse(path+y+'.xbgf')
results['LOC'][x] += slpsXPath.loc(path+y+'.xbgf')
results['NOI'][x] += slpsXPath.nosi(path+y+'.xbgf','ISSUE')
results['NI~'][x] += slpsXPath.nosi(path+y+'.xbgf','ISSUE REFACTOR')
results['NI+'][x] += slpsXPath.nosi(path+y+'.xbgf','EXTEND')
results['NI!'][x] += slpsXPath.nosi(path+y+'.xbgf','CORRECT')
results['NI^'][x] += slpsXPath.nosi(path+y+'.xbgf','PERMISSIVENESS')
results['COR'][x] += slpsXPath.nosi(path+y+'.xbgf','EXTRACTERROR')
results['SGO'][x] += slpsXPath.noni(xbgf,slpsXPath.safexbgf)+\
slpsXPath.nosi(path+y+'.xbgf','BREFACTOR')+\
slpsXPath.noPartiallySafe(xbgf)
results['SID'][x] += slpsXPath.noni(xbgf,slpsXPath.incdecxbgf)+\
slpsXPath.nosi(path+y+'.xbgf','GENERALITY')
results['SRE'][x] += slpsXPath.noni(xbgf,slpsXPath.messyxbgf)+\
slpsXPath.nosi(path+y+'.xbgf','REVISE')+\
slpsXPath.noPartiallyUnsafe(xbgf)
results['NOX'][x] += len(xbgf.findall('/*'))
for z in names:
results[z][x] += len(xbgf.findall('/'+slpsns.xbgf_(z)))
for x in names[:]:
used = False
for y in targets.keys():
if results[x][y]:
used = True
if not used:
names.remove(x)
sorted = targets.keys()[:]
sorted.sort()
if sorted == ['doc12','doc123','jls1','jls12','jls123','jls2','jls3']:
sorted = ['jls1','jls2','jls3','jls12','jls123','doc12','doc123']
elif sorted == ['abstract','concrete','java','limit','topdown']:
sorted = ['topdown','concrete','java','abstract','limit']
print '\\begin{tabular}{l|'+('c|'*len(targets))+'|c}'
for x in sorted:
print '&\\textbf{'+x+'}',
print '&\\textbf{Total}\\\\\\hline'
report(sorted,'LOC','\\'+lcfname+'NumberOfLines')
print '\\hline'
report(sorted,'NOX','\\'+lcfname+'NumberOfTransformations')
report(sorted,'SGO','\\'+lcfname+'NumberOfRefactors')
report(sorted,'SID','\\'+lcfname+'NumberOfGeneralises')
report(sorted,'SRE','\\'+lcfname+'NumberOfRevisings')
print '\\hline'
print '\\'+lcfname+'NumberOfSteps',
cx = 0
for x in sorted:
cx += len(targets[x])
print '{',len(targets[x]),'}'
print '{'+`cx`+'}'
report(sorted,'NOI','\\'+lcfname+'NumberOfIssues')
report(sorted,'COR','\\'+lcfname+'IssuesPostX')
report(sorted,'NI!','\\'+lcfname+'IssuesCorrect')
report(sorted,'NI+','\\'+lcfname+'IssuesExtend')
report(sorted,'NI^','\\'+lcfname+'IssuesPermit')
# report(sorted,'NI~','\\'+lcfname+'IssuesRefactor')
print '\\hline'
print '\\end{tabular}'
sys.exit(0)
2 changes: 1 addition & 1 deletion shared/tools/bgfover
Expand Up @@ -7,5 +7,5 @@ cd ../..
SLPS=${PWD}
cd ${LOCAL1}

python ${SLPS}/topics/presentation/metrics/bgf_overview.py $1 $2 $3
python ${SLPS}/shared/python/bgf_overview.py $1 $2 $3
rm -f TMP-res
4 changes: 2 additions & 2 deletions shared/tools/xbgfover
Expand Up @@ -7,6 +7,6 @@ cd ../..
SLPS=${PWD}
cd ${LOCAL1}

python ${SLPS}/topics/presentation/metrics/xbgf_overview.py $1 $2 $3 >$4
python ${SLPS}/topics/presentation/metrics/xbgf_detailed_overview.py $1 $2 $3 >$5
python ${SLPS}/shared/python/xbgf_overview.py $1 $2 $3 >$4
python ${SLPS}/shared/python/xbgf_detailed_overview.py $1 $2 $3 >$5

0 comments on commit cf17e9b

Please sign in to comment.