Source code for ctree.analyses
"""
validation of ast trees
"""
from ctree.visitors import NodeVisitor
from ctree.nodes import CtreeNode, ast
from ctree.c.nodes import SymbolRef
from ctree.util import flatten
[docs]class DeclFinder(NodeVisitor):
"""
Returns the first use of a particular symbol.
"""
def __init__(self):
self.decl = None
[docs] def find(self, node):
"""look for a declaration of a symbol ref"""
assert isinstance(node, SymbolRef), \
"DeclFinder only works on SymbolRefs for now."
self.decl = None
assert self.decl is not None, \
"Couldn't find declaration for symbol %s." % node
return self.decl
[docs]class AstValidationError(Exception):
"""
Exception for non C nodes in an AST
"""
pass
[docs]class VerifyOnlyCtreeNodes(NodeVisitor):
"""
Checks that every node in the tree is an instance of
ctree.nodes.common.CtreeNode. Raises an exception if a bad node
is found.
"""
[docs] def visit(self, node):
if not isinstance(node, CtreeNode):
raise AstValidationError("Expected a pure C ast, but found a non-CtreeNode: %s." % node)
self.generic_visit(node)