mini analyse sur les conditions w.c.s.
This commit is contained in:
commit
ae4908e9ca
|
@ -0,0 +1,66 @@
|
|||
import sys
|
||||
import ast
|
||||
from collections import Counter
|
||||
conditions = map(str.strip, open('conditions.txt').readlines())
|
||||
|
||||
|
||||
|
||||
class NodeVisitor(ast.NodeVisitor):
|
||||
def __init__(self, names=None):
|
||||
self.names = [] if names is None else names
|
||||
super(NodeVisitor, self).__init__()
|
||||
|
||||
def visit_Name(self, node):
|
||||
self.names.append(node.id)
|
||||
|
||||
|
||||
def longest_prefix(s1, s2):
|
||||
for i, (a, b) in enumerate(zip(s1, s2)):
|
||||
if a != b:
|
||||
return i
|
||||
return 0
|
||||
|
||||
|
||||
class Analyzer(object):
|
||||
ok = 0
|
||||
nok = []
|
||||
count_nodes = Counter()
|
||||
names = []
|
||||
|
||||
|
||||
def analyze_condition(self, condition):
|
||||
try:
|
||||
parsed = ast.parse(condition, mode='eval')
|
||||
except SyntaxError as e:
|
||||
exc_info = sys.exc_info()
|
||||
self.nok.append((condition, e.args[1][2], e))
|
||||
return
|
||||
else:
|
||||
self.ok += 1
|
||||
for node in ast.walk(parsed):
|
||||
self.count_nodes[type(node)] += 1
|
||||
visitor = NodeVisitor(self.names)
|
||||
visitor.visit(parsed)
|
||||
|
||||
|
||||
def analyze(self):
|
||||
for condition in conditions:
|
||||
self.analyze_condition(condition)
|
||||
print 'Bad conditions'
|
||||
for condition, offset, e in self.nok:
|
||||
print '-', condition, e
|
||||
print ' ', ' ' * (offset-1) + '^'
|
||||
print 'Node by types:'
|
||||
for node, count in sorted(self.count_nodes.iteritems(), key=lambda (x, y): -y):
|
||||
if node is ast.Load:
|
||||
continue
|
||||
print '%30s: %5d' % (node, count)
|
||||
print 'Names:', len(set(self.names))
|
||||
for name in sorted(set(self.names)):
|
||||
print '-', name
|
||||
|
||||
|
||||
|
||||
analyzer = Analyzer()
|
||||
analyzer.analyze()
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue