Skip to content

thyecust/TextTree

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 

Repository files navigation

TextTree

This is a python implementation of clang::TextTreeStructure.

That class is used to dump a ClangAST:

...
Running without flags.
TranslationUnitDecl 0x5596a4bf0bb8 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x5596a4bf13e0 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x5596a4bf1180 '__int128'
|-TypedefDecl 0x5596a4bf1450 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x5596a4bf11a0 'unsigned __int128'
|-TypedefDecl 0x5596a4bf1758 <<invalid sloc>> <invalid sloc> implicit __NSConstantString 'struct __NSConstantString_tag'
| `-RecordType 0x5596a4bf1530 'struct __NSConstantString_tag'
|   `-Record 0x5596a4bf14a8 '__NSConstantString_tag'
|-TypedefDecl 0x5596a4bf17f0 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'
| `-PointerType 0x5596a4bf17b0 'char *'
|   `-BuiltinType 0x5596a4bf0c60 'char'
|-TypedefDecl 0x5596a4bf1ae8 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list 'struct __va_list_tag[1]'
| `-ConstantArrayType 0x5596a4bf1a90 'struct __va_list_tag[1]' 1 
|   `-RecordType 0x5596a4bf18d0 'struct __va_list_tag'
|     `-Record 0x5596a4bf1848 '__va_list_tag'
`-FunctionDecl 0x5596a4c4ca50 </home/tianhaoyu/hello.c:1:1, line:3:1> line:1:5 main 'int ()'
  `-CompoundStmt 0x5596a4c4cb70 <col:12, line:3:1>
    `-ReturnStmt 0x5596a4c4cb60 <line:2:2, col:9>
      `-IntegerLiteral 0x5596a4c4cb40 <col:9> 'int' 1

See main.py:

def OS(*arg, **kw):
    print(*arg, sep="", end="")
    return True

class Tree:
    Toplevel = True
    FisrtChild = True
    Pending = []
    Prefix = ""

    def AddChild(self, Fn):
        self.AddChildL("", Fn)
    
    def AddChildL(self, Label, Fn):
        if self.Toplevel:
            self.Toplevel = False
            Fn()
            while len(self.Pending) != 0:
                self.Pending[-1](True)
                self.Pending = self.Pending[:-1]
            self.Prefix = ""
            OS("\n")
            self.Toplevel = True
            return
        
        D = lambda IsLastChild: self.DumpWithPrefix(Label, Fn, IsLastChild)
        if self.FisrtChild:
            self.Pending.append(D)
        else:
            self.Pending[-1](False)
            self.Pending[-1] = D
        self.FisrtChild = False

    def DumpWithPrefix(self, Label, Fn, IsLastChild):
        OS("\n", self.Prefix, "`" if IsLastChild else "|", "-")
        if Label != "":
            OS(Label, ":")
        self.Prefix += "  " if IsLastChild else "| "

        self.FisrtChild = True
        Depth = len(self.Pending)
        Fn()
        if Depth < len(self.Pending):
            self.Pending[-1](True)
            self.Pending = self.Pending[:-1]
        self.Prefix = self.Prefix[:-2]

if __name__ == "__main__":
    tree = Tree()
    tree.AddChild(lambda: (
        OS("first"),
        tree.AddChildL(2, lambda: (
            OS("second"),
            tree.AddChildL(3, lambda: (
                OS("forth"),
                tree.AddChild(lambda: (
                    OS("fifth")
                )),
            )),
            tree.AddChildL(3, lambda: (
                OS("sixth")
            ))
        )),
        tree.AddChildL(2, lambda: (
            OS("third")
        )),
    ))

Note:

  • self.Pending[i](IsLastChild) is an action to dump an entity at level i.

Run it:

first
|-2:second
| |-3:forth
| | `-fifth
| `-3:sixth
`-2:third

About

a python implementation of clang::TextTreeStructure.

Resources

Stars

Watchers

Forks

Contributors

Languages