From cf17e9b3026e277020ec2eae4078fc10b1cc1ca5 Mon Sep 17 00:00:00 2001 From: grammarware Date: Mon, 27 Apr 2009 20:49:47 +0000 Subject: [PATCH] more brushing up Python scripts git-svn-id: https://slps.svn.sourceforge.net/svnroot/slps@611 ab42f6e0-554d-0410-b580-99e487e6eeb2 --- shared/python/bgf_check.py | 50 +----- shared/python/bgf_overview.py | 33 ++++ shared/python/slpsXPath.py | 93 ++++++++++ .../python}/xbgf_detailed_overview.py | 32 +--- shared/python/xbgf_overview.py | 110 ++++++++++++ shared/tools/bgfover | 2 +- shared/tools/xbgfover | 4 +- topics/presentation/metrics/bgf_overview.py | 59 ------ topics/presentation/metrics/xbgf_overview.py | 168 ------------------ 9 files changed, 253 insertions(+), 298 deletions(-) create mode 100755 shared/python/bgf_overview.py create mode 100644 shared/python/slpsXPath.py rename {topics/presentation/metrics => shared/python}/xbgf_detailed_overview.py (71%) create mode 100755 shared/python/xbgf_overview.py delete mode 100755 topics/presentation/metrics/bgf_overview.py delete mode 100755 topics/presentation/metrics/xbgf_overview.py diff --git a/shared/python/bgf_check.py b/shared/python/bgf_check.py index 358608cf..162da661 100755 --- a/shared/python/bgf_check.py +++ b/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 '' ; xpath '//nonterminal[not(text()=/*/*/nonterminal/text())]' 2> /dev/null; echo '' )| xpath 'count(//nonterminal[not(text()=preceding-sibling::*/text())])' " -listbottom = "//nonterminal[not(text()=/*/*/nonterminal/text())]" -unique = " | (echo '' ; xpath '//nonterminal' 2> /dev/null; echo '' )| 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('') - resu = [] - for x in resa: - if x not in resu: - resu.append(x) - resu.sort() - return ''.join(resu).replace('',', ')[:-2] - tmp.close() - res = res.replace('','').replace('',', ') - 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 ' 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) - diff --git a/shared/python/bgf_overview.py b/shared/python/bgf_overview.py new file mode 100755 index 00000000..57cd491f --- /dev/null +++ b/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 ' + 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) diff --git a/shared/python/slpsXPath.py b/shared/python/slpsXPath.py new file mode 100644 index 00000000..1a54a2c9 --- /dev/null +++ b/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 '' ; xpath '//nonterminal[not(text()=/*/*/nonterminal/text())]' 2> /dev/null; echo '' )| xpath 'count(//nonterminal[not(text()=preceding-sibling::*/text())])' " +listbottom = "//nonterminal[not(text()=/*/*/nonterminal/text())]" +unique = " | (echo '' ; xpath '//nonterminal' 2> /dev/null; echo '' )| 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('') + resu = [] + for x in resa: + if x not in resu: + resu.append(x) + resu.sort() + return ''.join(resu).replace('',', ')[:-2] + tmp.close() + res = res.replace('','').replace('',', ') + 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('