|
@@ -1,7 +1,7 @@
|
|
|
from __future__ import print_function
|
|
from __future__ import print_function
|
|
|
|
|
|
|
|
import os
|
|
import os
|
|
|
-import copy;
|
|
|
|
|
|
|
+import copy
|
|
|
from pycparser import c_ast
|
|
from pycparser import c_ast
|
|
|
|
|
|
|
|
INT_TYPES = ['int', 'short', 'float']
|
|
INT_TYPES = ['int', 'short', 'float']
|
|
@@ -46,7 +46,8 @@ class DeclarationInfo:
|
|
|
return self.dimensions > 0
|
|
return self.dimensions > 0
|
|
|
|
|
|
|
|
class CommandInfo:
|
|
class CommandInfo:
|
|
|
- def __init__ (self, condType, numLogicOps, numRelOps, opList):
|
|
|
|
|
|
|
+ def __init__ (self, cmdCount, condType, numLogicOps, numRelOps, opList):
|
|
|
|
|
+ self.cmdCount = cmdCount
|
|
|
self.condType = condType
|
|
self.condType = condType
|
|
|
self.numLogicOps = numLogicOps
|
|
self.numLogicOps = numLogicOps
|
|
|
self.numRelOps = numRelOps
|
|
self.numRelOps = numRelOps
|
|
@@ -56,8 +57,8 @@ class CommandInfo:
|
|
|
return "Type:%s LogicOpCount:%d RelOpCount:%d OpList:%s"%( self.condType, self.numLogicOps, self.numRelOps, self.opList)
|
|
return "Type:%s LogicOpCount:%d RelOpCount:%d OpList:%s"%( self.condType, self.numLogicOps, self.numRelOps, self.opList)
|
|
|
|
|
|
|
|
class ForCommandInfo (CommandInfo):
|
|
class ForCommandInfo (CommandInfo):
|
|
|
- def __init__ (self, useAssignment, useNext, condType, numLogicOps, numRelOps, opList):
|
|
|
|
|
- CommandInfo.__init__(self, condType, numLogicOps, numRelOps, opList)
|
|
|
|
|
|
|
+ def __init__ (self, useAssignment, useNext, cmdCount, condType, numLogicOps, numRelOps, opList):
|
|
|
|
|
+ CommandInfo.__init__(self, cmdCount, condType, numLogicOps, numRelOps, opList)
|
|
|
self.useAssignment = useAssignment
|
|
self.useAssignment = useAssignment
|
|
|
self.useNext = useNext
|
|
self.useNext = useNext
|
|
|
|
|
|
|
@@ -80,6 +81,7 @@ class ASTAnalyser:
|
|
|
self.logicOpCount = 0
|
|
self.logicOpCount = 0
|
|
|
self.relOpCount = 0
|
|
self.relOpCount = 0
|
|
|
self.opList = list()
|
|
self.opList = list()
|
|
|
|
|
+ self.cmdCountStack = [0]
|
|
|
#helpers />
|
|
#helpers />
|
|
|
self.declarations = dict()
|
|
self.declarations = dict()
|
|
|
self.declarationsPointers = dict()
|
|
self.declarationsPointers = dict()
|
|
@@ -207,12 +209,13 @@ class ASTAnalyser:
|
|
|
opList = copy.deepcopy(self.opList)
|
|
opList = copy.deepcopy(self.opList)
|
|
|
cmdList = node.stmt
|
|
cmdList = node.stmt
|
|
|
cmdName = cmdList.__class__.__name__
|
|
cmdName = cmdList.__class__.__name__
|
|
|
|
|
+ self.cmdCountStack.append(0)
|
|
|
if cmdName == 'Compound':
|
|
if cmdName == 'Compound':
|
|
|
for cmd in cmdList:
|
|
for cmd in cmdList:
|
|
|
self.proccessCommand(cmd)
|
|
self.proccessCommand(cmd)
|
|
|
else:
|
|
else:
|
|
|
self.proccessCommand(cmdList)
|
|
self.proccessCommand(cmdList)
|
|
|
- self.conditionCommandData.append(CommandInfo(condType,logicCount, relCount, opList))
|
|
|
|
|
|
|
+ self.conditionCommandData.append(CommandInfo(self.cmdCountStack.pop(), condType,logicCount, relCount, opList))
|
|
|
|
|
|
|
|
def proccessFor (self, node):
|
|
def proccessFor (self, node):
|
|
|
name = node.__class__.__name__
|
|
name = node.__class__.__name__
|
|
@@ -237,6 +240,7 @@ class ASTAnalyser:
|
|
|
if node.next.__class__.__name__ != 'FuncCall':
|
|
if node.next.__class__.__name__ != 'FuncCall':
|
|
|
self.countOperators(node.next)
|
|
self.countOperators(node.next)
|
|
|
|
|
|
|
|
|
|
+ self.cmdCountStack.append(0)
|
|
|
cmdList = node.stmt
|
|
cmdList = node.stmt
|
|
|
cmdName = cmdList.__class__.__name__
|
|
cmdName = cmdList.__class__.__name__
|
|
|
if cmdName == 'Compound':
|
|
if cmdName == 'Compound':
|
|
@@ -244,7 +248,7 @@ class ASTAnalyser:
|
|
|
self.proccessCommand(cmd)
|
|
self.proccessCommand(cmd)
|
|
|
elif name != 'NoneType':
|
|
elif name != 'NoneType':
|
|
|
self.proccessCommand(cmdList)
|
|
self.proccessCommand(cmdList)
|
|
|
- self.forCommandData.append(ForCommandInfo(hasInit, hasNext, condType, logicCount, relCount, opList))
|
|
|
|
|
|
|
+ self.forCommandData.append(ForCommandInfo(hasInit, hasNext, self.cmdCountStack.pop(), condType, logicCount, relCount, opList))
|
|
|
|
|
|
|
|
def proccessIf (self, node):
|
|
def proccessIf (self, node):
|
|
|
name = node.__class__.__name__
|
|
name = node.__class__.__name__
|
|
@@ -258,7 +262,7 @@ class ASTAnalyser:
|
|
|
logicCount = self.logicOpCount
|
|
logicCount = self.logicOpCount
|
|
|
relCount = self.relOpCount
|
|
relCount = self.relOpCount
|
|
|
opList = copy.deepcopy(self.opList)
|
|
opList = copy.deepcopy(self.opList)
|
|
|
-
|
|
|
|
|
|
|
+ self.cmdCountStack.append(0)
|
|
|
iftrue = node.iftrue
|
|
iftrue = node.iftrue
|
|
|
ifCompound = iftrue.__class__.__name__
|
|
ifCompound = iftrue.__class__.__name__
|
|
|
if ifCompound == 'Compound':
|
|
if ifCompound == 'Compound':
|
|
@@ -276,7 +280,7 @@ class ASTAnalyser:
|
|
|
self.proccessCommand(cmd)
|
|
self.proccessCommand(cmd)
|
|
|
elif name != 'NoneType':
|
|
elif name != 'NoneType':
|
|
|
self.proccessCommand(iffalse)
|
|
self.proccessCommand(iffalse)
|
|
|
- self.conditionCommandData.append(CommandInfo(condType, logicCount, relCount, opList))
|
|
|
|
|
|
|
+ self.conditionCommandData.append(CommandInfo(self.cmdCountStack.pop(), condType, logicCount, relCount, opList))
|
|
|
|
|
|
|
|
def proccessCase (self, node):
|
|
def proccessCase (self, node):
|
|
|
try:
|
|
try:
|
|
@@ -303,8 +307,9 @@ class ASTAnalyser:
|
|
|
self.countOperators(expr.expr)
|
|
self.countOperators(expr.expr)
|
|
|
elif name == 'BinaryOp':
|
|
elif name == 'BinaryOp':
|
|
|
op = expr.op
|
|
op = expr.op
|
|
|
- if op in VALID_OPS:
|
|
|
|
|
- self.incOpCount(op)
|
|
|
|
|
|
|
+ if not op in VALID_OPS:
|
|
|
|
|
+ return
|
|
|
|
|
+ self.incOpCount(op)
|
|
|
if op in VALID_LOGIC_OPS:
|
|
if op in VALID_LOGIC_OPS:
|
|
|
self.logicOpCount += 1
|
|
self.logicOpCount += 1
|
|
|
elif op in VALID_REL_OPS:
|
|
elif op in VALID_REL_OPS:
|
|
@@ -336,28 +341,31 @@ class ASTAnalyser:
|
|
|
if name == 'BinaryOp':
|
|
if name == 'BinaryOp':
|
|
|
op = expr.op
|
|
op = expr.op
|
|
|
if op in VALID_LOGIC_OPS:
|
|
if op in VALID_LOGIC_OPS:
|
|
|
- return 'LogicOp'
|
|
|
|
|
|
|
+ return 'logic_expression'
|
|
|
elif op in VALID_REL_OPS:
|
|
elif op in VALID_REL_OPS:
|
|
|
- return 'RelationalOp'
|
|
|
|
|
|
|
+ return 'relational_expression'
|
|
|
else:
|
|
else:
|
|
|
- return 'OtherOp'
|
|
|
|
|
|
|
+ return 'other_expression'
|
|
|
elif name == 'UnaryOp':
|
|
elif name == 'UnaryOp':
|
|
|
op = expr.op
|
|
op = expr.op
|
|
|
if op in VALID_LOGIC_OPS:
|
|
if op in VALID_LOGIC_OPS:
|
|
|
- return 'LogicOp'
|
|
|
|
|
|
|
+ return 'logic_expression'
|
|
|
else:
|
|
else:
|
|
|
- return 'OtherOp'
|
|
|
|
|
|
|
+ return 'other_expression'
|
|
|
elif name == 'Cast':
|
|
elif name == 'Cast':
|
|
|
return self.checkCondType(expr.expr)
|
|
return self.checkCondType(expr.expr)
|
|
|
else:
|
|
else:
|
|
|
- return 'BooleanValue'
|
|
|
|
|
|
|
+ return 'boolean_value'
|
|
|
|
|
|
|
|
def proccessCommand (self, node):
|
|
def proccessCommand (self, node):
|
|
|
name = node.__class__.__name__
|
|
name = node.__class__.__name__
|
|
|
|
|
+ self.cmdCountStack[-1] += 1
|
|
|
if name == 'Decl':
|
|
if name == 'Decl':
|
|
|
self.proccessDecl(node)
|
|
self.proccessDecl(node)
|
|
|
|
|
+ self.cmdCountStack[-1] -= 1
|
|
|
elif name == 'FuncDef':
|
|
elif name == 'FuncDef':
|
|
|
self.proccessFuncDef(node)
|
|
self.proccessFuncDef(node)
|
|
|
|
|
+ self.cmdCountStack[-1] -= 1
|
|
|
elif name == 'FuncCall':
|
|
elif name == 'FuncCall':
|
|
|
self.proccessFuncCall(node)
|
|
self.proccessFuncCall(node)
|
|
|
elif name == 'Assignment':
|
|
elif name == 'Assignment':
|
|
@@ -368,6 +376,7 @@ class ASTAnalyser:
|
|
|
self.proccessSwitch(node)
|
|
self.proccessSwitch(node)
|
|
|
elif name == 'Case' or name == 'Default':
|
|
elif name == 'Case' or name == 'Default':
|
|
|
self.proccessCase(node)
|
|
self.proccessCase(node)
|
|
|
|
|
+ self.cmdCountStack[-1] -= 1
|
|
|
elif name == 'If':
|
|
elif name == 'If':
|
|
|
self.proccessIf(node)
|
|
self.proccessIf(node)
|
|
|
elif name == 'DoWhile' or name == 'While':
|
|
elif name == 'DoWhile' or name == 'While':
|
|
@@ -375,5 +384,5 @@ class ASTAnalyser:
|
|
|
elif name == 'For':
|
|
elif name == 'For':
|
|
|
self.proccessFor(node)
|
|
self.proccessFor(node)
|
|
|
else:
|
|
else:
|
|
|
- pass
|
|
|
|
|
|
|
+ self.cmdCountStack[-1] -= 1
|
|
|
#print("Unknown Command: %s" % name )
|
|
#print("Unknown Command: %s" % name )
|