pycparser вложенный узел посетитель

Я пытаюсь проанализировать код C с pycparser с посетителем для каждого оператора IF. Из моего наблюдения он посещает только верхние узлы без вложенных IF. Это намеренно или что-то не так в моем коде?

1 ответ

Решение

Смотрите комментарий для класса: https://github.com/eliben/pycparser/blob/master/pycparser/c_ast.py

Дочерние узлы, для которых было определено посещение, не будут посещаться - если вам это нужно, вызовите generic_visit() для узла.

Ты можешь использовать:

NodeVisitor.generic_visit (self, node)

Я попробовал это, и это сработало для меня:

if_conditions.py

from __future__ import print_function
import sys

# This is not required if you've installed pycparser into
# your site-packages/ with setup.py
sys.path.extend(['.', '..'])

from pycparser import c_parser, c_ast, parse_file

class IfVisitor(c_ast.NodeVisitor):
    def __init__(self):
        pass

    def visit_If(self, node):
        node.show()
        self.generic_visit(node);



def start(filename):
    ast = parse_file(filename, use_cpp=True)
    v = IfVisitor()
    v.visit(ast)


if __name__ == "__main__":
    if len(sys.argv) > 2:
        filename = sys.argv[1]
    else:
        filename = 'examples/c_files/test.c'

    start(filename)

test.c

main ( int arc, char **argv ) {

    int i = 1;

    if (i > 1) {
        if (i > 2) {
            printf("Yay!");
        }
    }

    // code
    return 0; // Indicates that everything vent well.     
}

Generic _visit() подойдет. Или просто повторно посетите дочерний узел.

https://github.com/eliben/pycparser/blob/master/examples/func_calls.py

# A visitor with some state information (the funcname it's looking for)
class FuncCallVisitor(c_ast.NodeVisitor):
    def __init__(self, funcname):
        self.funcname = funcname

    def visit_FuncCall(self, node):
        if node.name.name == self.funcname:
            print('%s called at %s' % (self.funcname, node.name.coord))
        # Visit args in case they contain more func calls.
        if node.args:
            self.visit(node.args)

в этом случае (оператор IF),

if node.iftrue:
    self.visit(node.iftrue)

if node.iffalse:
    self.visit(node.iffalse)
Другие вопросы по тегам