예제 #1
0
파일: extractor.py 프로젝트: erogleva/haros
 def _roscpp_analysis(self, node):
     self.log.debug("Parsing C++ files for node %s", node.id)
     parser = CppAstParser(workspace = self.workspace)
     for sf in node.source_files:
         self.log.debug("Parsing C++ file %s", sf.path)
         if parser.parse(sf.path) is None:
             self.log.warning("no compile commands for " + sf.path)
     node.source_tree = parser.global_scope
 # ----- queries after parsing, since global scope is reused ---------------
     self._query_comm_primitives(node, parser.global_scope)
     self._query_nh_param_primitives(node, parser.global_scope)
     self._query_param_primitives(node, parser.global_scope)
예제 #2
0
파일: cpp_example.py 프로젝트: davla/bonsai
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#THE SOFTWARE.

import sys
from bonsai.analysis import *
from bonsai.cpp.clang_parser import CppAstParser

# ----- Setup ------------------------------------------------------------------
if len(sys.argv) < 2:
    print "Please provide a file to be analysed."
    sys.exit(1)
CppAstParser.set_library_path()
parser = CppAstParser(workspace="examples/cpp")
for i in xrange(1, len(sys.argv)):
    if parser.parse(sys.argv[i]) is None:
        print "No compile commands for file", sys.argv[i]
        sys.exit(1)
# ----- Printing Program -------------------------------------------------------
print parser.global_scope.pretty_str()
print "\n----------------------------------\n"
# ----- Performing Queries -----------------------------------------------------
print "# QUERY FOR VARIABLE 'a'"
for cppobj in (CodeQuery(
        parser.global_scope).all_references.where_name("a").get()):
    print "[{}:{}]".format(cppobj.line, cppobj.column), cppobj.pretty_str()
    print "[type]", cppobj.result
    print "[canon. type]", cppobj.canonical_type
    print "[reference]", cppobj.reference or "unknown"
    value = resolve_reference(cppobj)
    if not value is None and value != cppobj:
예제 #3
0
    def launch(self):
        self.parse_arg()
        if self.args.node:
            #FIND WORKSPACE:
            #Fixme: the env variable ROS_PACKAGE_PATH is not the best way to extract the workspace path
            ros_pkg_path = os.environ.get("ROS_PACKAGE_PATH")
            ws = ros_pkg_path[:ros_pkg_path.find("/src:")]
            #FIND PACKAGE PATH
            pkg = Package(self.args.package_name)
            rospack = rospkg.RosPack()
            pkg.path = rospack.get_path(self.args.package_name)

            #BONSAI PARSER
            parser = CppAstParser(workspace=ws)
            parser.set_library_path("/usr/lib/llvm-3.8/lib")
            parser.set_standard_includes(
                "/usr/lib/llvm-3.8/lib/clang/3.8.0/include")
            db_dir = os.path.join(ws, "build")
            if os.path.isfile(os.path.join(db_dir, "compile_commands.json")):
                parser.set_database(db_dir)
            #HAROS NODE EXTRACTOR
            analysis = NodeExtractor(pkg,
                                     env=dict(os.environ),
                                     ws=ws,
                                     node_cache=False,
                                     parse_nodes=True)
            node = Node(self.args.name, pkg, rosname=RosName(self.args.name))
            srcdir = pkg.path[len(ws):]
            srcdir = os.path.join(ws, srcdir.split(os.sep, 1)[0])
            bindir = os.path.join(ws, "build")
            #HAROS CMAKE PARSER
            parser = RosCMakeParser(srcdir, bindir, pkgs=[pkg])
            parser.parse(os.path.join(pkg.path, "CMakeLists.txt"))
            for target in parser.executables.itervalues():
                if target.output_name == self.args.name:
                    for file_in in target.files:
                        full_path = file_in
                        relative_path = full_path.replace(
                            pkg.path + "/", "").rpartition("/")[0]
                        file_name = full_path.rsplit('/', 1)[-1]
                        source_file = SourceFile(file_name, relative_path, pkg)
                        node.source_files.append(source_file)
            parser = CppAstParser(workspace=ws)
            node.source_tree = parser.global_scope
            model_str = ""
            for sf in node.source_files:
                if parser.parse(sf.path) is None:
                    print "File not found"
                else:
                    # ROS MODEL EXTRACT PRIMITIVES
                    rosmodel = ros_model(self.args.package_name,
                                         self.args.name, self.args.name)
                    self.extract_primitives(node, parser.global_scope,
                                            analysis, rosmodel)
                    # SAVE ROS MODEL
                    model_str = rosmodel.save_model()
            if self.args.output:
                print model_str
            else:
                text_file = open(self.args.name + ".ros", "w")
                text_file.write(model_str)
                text_file.close()
예제 #4
0
파일: test.py 프로젝트: tzo13123/bonsai
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#THE SOFTWARE.

import sys
from bonsai.analysis import *
from bonsai.cpp.clang_parser import CppAstParser

# ----- Setup ------------------------------------------------------------------
files = [
    "examples/cpp/multi_def/file1.cpp", "examples/cpp/multi_def/file2.cpp"
]

CppAstParser.set_library_path()
parser = CppAstParser()
for filename in files:
    if parser.parse(filename) is None:
        print "No compile commands for file", filename
        sys.exit(1)
# ----- Printing Program -------------------------------------------------------
print parser.global_scope.pretty_str()
print "\n----------------------------------\n"
# ----- Performing Queries -----------------------------------------------------
print "# QUERY FOR CALL 'add_ints'"
for cppobj in (CodeQuery(
        parser.global_scope).all_calls.where_name("add_ints").get()):
    print "[{}:{}]".format(cppobj.line, cppobj.column), cppobj.pretty_str()
    print "[type]", cppobj.result
    print "[reference]", cppobj.reference or "unknown"
    print ""