深度優(yōu)先構(gòu)建文本結(jié)構(gòu)樹 - 馮俊輝

這是馮俊輝在做本科畢業(yè)設(shè)計的時候,一個驚為天人的發(fā)現(xiàn)次酌!

只要短短幾十行 python,就能構(gòu)建一個完美的文本結(jié)構(gòu)樹剂公!

待處理文本

TranslationUnitDecl 0x7fd01b821ed0 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x7fd01b822460 <<invalid sloc>> <invalid sloc> implicit referenced __int128_t '__int128'
| `-BuiltinType 0x7fd01b822140 '__int128'
|-TypedefDecl 0x7fd01b8224d0 <<invalid sloc>> <invalid sloc> implicit referenced __uint128_t 'unsigned __int128'
| `-BuiltinType 0x7fd01b822160 'unsigned __int128'
|-TypedefDecl 0x7fd01b822818 <<invalid sloc>> <invalid sloc> implicit __NSConstantString 'struct __NSConstantString_tag'
| `-RecordType 0x7fd01b8225c0 'struct __NSConstantString_tag'
|   `-CXXRecord 0x7fd01b822528 '__NSConstantString_tag'
|-TypedefDecl 0x7fd01b8228b0 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'
| `-PointerType 0x7fd01b822870 'char *'
|   `-BuiltinType 0x7fd01b821f60 'char'
|-TypedefDecl 0x7fd01b854800 <<invalid sloc>> <invalid sloc> implicit referenced __builtin_va_list 'struct __va_list_tag [1]'
| `-ConstantArrayType 0x7fd01b822b90 'struct __va_list_tag [1]' 1
|   `-RecordType 0x7fd01b8229a0 'struct __va_list_tag'
|     `-CXXRecord 0x7fd01b822908 '__va_list_tag'
|-TypedefDecl 0x7fd01b854868 </Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__config:321:1, col:20> col:20 referenced char16_t 'char16_t'
| `-BuiltinType 0x7fd01b8221a0 'char16_t'
|-TypedefDecl 0x7fd01b8548d0 <line:322:1, col:20> col:20 referenced char32_t 'char32_t'
| `-BuiltinType 0x7fd01b8221c0 'char32_t'

源代碼

# coding=utf-8
from pprint import pprint


# get layer
def get_ast_layer(line):
    return int((len(line) + 1) / 2)


# parse text of line
def parse_ast_line(line):
    return {str: line}


# establish tree
def parse_ast_tree(index, current_layer, next_layer, next_line):
    # 大于當(dāng)前多層(與 index 代表的第0層相比)
    if next_layer - current_layer > 1:
        parse_ast_tree(index[len(index) - 1]['child'], current_layer + 1, next_layer, next_line)

    # 大于當(dāng)前1層,index 的最后一個孩子(因為是順序遍歷)添加 child
    self = parse_ast_line(next_line)
    child = []
    if next_layer - current_layer == 1:
        index[len(index) - 1]['child'].append({'aself': self, 'child': child})

    # 等于當(dāng)前層
    if next_layer == current_layer:  # current_layer 的父節(jié)點 index 添加一個
        index.append({'aself': self, 'child': child})


# load ast tree
def parse_ast_file(file_path):
    # init
    index = []

    # deal with line
    with open(file_path, 'r') as file:
        # deal with line
        self = parse_ast_line(file.readline())  # 首行
        child = []
        index.append({
            'aself': self,  # 首行
            'child': child  # []
        })
        for line in file:
            line_list = line.split('-', 1)
            layer = get_ast_layer(line_list[0])  # 層數(shù) 1
            parse_ast_tree(index, current_layer=0, next_layer=layer, next_line=line_list[1])
    return index


path = './test.ast'
tree = parse_ast_file(path)
pprint(tree)

輸出

[{'aself': {<type 'str'>: 'TranslationUnitDecl 0x7fd01b821ed0 <<invalid sloc>> <invalid sloc>\n'},
  'child': [{'aself': {<type 'str'>: "TypedefDecl 0x7fd01b822460 <<invalid sloc>> <invalid sloc> implicit referenced __int128_t '__int128'\n"},
             'child': [{'aself': {<type 'str'>: "BuiltinType 0x7fd01b822140 '__int128'\n"},
                        'child': []}]},
            {'aself': {<type 'str'>: "TypedefDecl 0x7fd01b8224d0 <<invalid sloc>> <invalid sloc> implicit referenced __uint128_t 'unsigned __int128'\n"},
             'child': [{'aself': {<type 'str'>: "BuiltinType 0x7fd01b822160 'unsigned __int128'\n"},
                        'child': []}]},
            {'aself': {<type 'str'>: "TypedefDecl 0x7fd01b822818 <<invalid sloc>> <invalid sloc> implicit __NSConstantString 'struct __NSConstantString_tag'\n"},
             'child': [{'aself': {<type 'str'>: "RecordType 0x7fd01b8225c0 'struct __NSConstantString_tag'\n"},
                        'child': [{'aself': {<type 'str'>: "CXXRecord 0x7fd01b822528 '__NSConstantString_tag'\n"},
                                   'child': []}]}]},
            {'aself': {<type 'str'>: "TypedefDecl 0x7fd01b8228b0 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'\n"},
             'child': [{'aself': {<type 'str'>: "PointerType 0x7fd01b822870 'char *'\n"},
                        'child': [{'aself': {<type 'str'>: "BuiltinType 0x7fd01b821f60 'char'\n"},
                                   'child': []}]}]},
            {'aself': {<type 'str'>: "TypedefDecl 0x7fd01b854800 <<invalid sloc>> <invalid sloc> implicit referenced __builtin_va_list 'struct __va_list_tag [1]'\n"},
             'child': [{'aself': {<type 'str'>: "ConstantArrayType 0x7fd01b822b90 'struct __va_list_tag [1]' 1\n"},
                        'child': [{'aself': {<type 'str'>: "RecordType 0x7fd01b8229a0 'struct __va_list_tag'\n"},
                                   'child': [{'aself': {<type 'str'>: "CXXRecord 0x7fd01b822908 '__va_list_tag'\n"},
                                              'child': []}]}]}]},
            {'aself': {<type 'str'>: "TypedefDecl 0x7fd01b854868 </Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__config:321:1, col:20> col:20 referenced char16_t 'char16_t'\n"},
             'child': [{'aself': {<type 'str'>: "BuiltinType 0x7fd01b8221a0 'char16_t'\n"},
                        'child': []}]},
            {'aself': {<type 'str'>: "TypedefDecl 0x7fd01b8548d0 <line:322:1, col:20> col:20 referenced char32_t 'char32_t'\n"},
             'child': [{'aself': {<type 'str'>: "BuiltinType 0x7fd01b8221c0 'char32_t'"},
                        'child': []}]}]}]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末因块,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拒名,老刑警劉巖增显,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脐帝,死亡現(xiàn)場離奇詭異,居然都是意外死亡炸站,警方通過查閱死者的電腦和手機旱易,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門阀坏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笆檀,“玉大人,你說我怎么就攤上這事浸船∏薜福” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵封字,是天一觀的道長阔籽。 經(jīng)常有香客問我,道長牲蜀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任证薇,我火速辦了婚禮匆篓,結(jié)果婚禮上鸦概,老公的妹妹穿的比我還像新娘。我一直安慰自己窗市,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扎拣,像睡著了一般二蓝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刊愚,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天鸥诽,我揣著相機與錄音,去河邊找鬼拳昌。 笑死钠龙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沈矿。 我是一名探鬼主播咬腋,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼陵像,長吁一口氣:“原來是場噩夢啊……” “哼湃缎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蠢壹,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎九巡,沒想到半個月后图贸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡冕广,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年疏日,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撒汉。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡沟优,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出睬辐,到底是詐尸還是另有隱情挠阁,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布溯饵,位于F島的核電站侵俗,受9級特大地震影響隘谣,放射性物質(zhì)發(fā)生泄漏寻歧。R本人自食惡果不足惜码泛,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一逾苫、第九天 我趴在偏房一處隱蔽的房頂上張望瑟押。 院中可真熱鬧多望,春花似錦家厌、人聲如沸饭于。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膜毁,卻和暖如春瘟滨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背败玉。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工兴枯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悠夯,地道東北人沦补。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像店诗,于是被迫代替她去往敵國和親赠叼。 傳聞我的和親對象是個殘疾皇子嘴办,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361