HierarchicalLine
3
ok、良さそう
名前、prevだと意味が違うので、parentとつけ直した
backtrackの遡り回数も計算ミス
code:py
class HierarchicalLine:
def parse(lines):
root_hline = HierarchicalLine('<root>', -1)
hlines = []
for line in lines:
current_indent_depth = get_indent_depth(line)
line_without_indent = remove_indent(line)
hline = HierarchicalLine(line_without_indent, current_indent_depth)
hlines.append(hline)
stack = Stack()
stack.push(root_hline)
for i,current_hline in enumerate(hlines):
current_depth = current_hline.indent_depth
parent_hline, _ = stack.peek()
parent_depth = parent_hline.indent_depth
# 自分の所属は機械的に親に任せる
# どの親であるべきかは判断しない(Stackに正しい親が入っているとみなす)
if current_depth <= parent_depth:
# n段下がるケースはn回親を遡ればよい
# わかりづらいが、currentがprevと同じ深さのときは1段下がっている # ★ここも計算ミス
backtrack_count = parent_depth - current_depth + 1
for _ in range(backtrack_count):
parent_hline = stack.pop()
parent_hline, _ = stack.peek() # ★ここが足らなかった。popで古い親殺しただけでは親がいない
parent_hline.append(current_hline)
# 自分が親になるべきかどうかを判断する
# そのためには次行を先読みする必要がある
is_reached_to_end = i==len(hlines)-1
if is_reached_to_end:
continue
next_depth = next_hline.indent_depth
if next_depth == current_depth+1:
# 次が1段下がる
# - 次は自分の子なので自分が親になる
stack.push(current_hline)
elif next_depth > current_depth+1:
# 次がn段下がるケースは文法違反
# - 不便なので矯正しちゃう(孫以下は自分の子にする)
# - もちろん自分は親になる
next_hline.indent_depth = current_depth+1
stack.push(current_hline)
return root_hline
-.icon
2
まだうまくいかん
code:scb
a
b
a
b
a
これはroot.childrenは3個のはずだが、1個になってしまう……
どこがおかしい?
何がおかしい?検討もつかん。
アルゴリズム複雑すぎて頭の中に入れて「あたりをさぐる」ができんsta.icon*2
が、prevがprevになってないのは見えた
code:py
class HierarchicalLine:
def parse(lines):
root_hline = HierarchicalLine('<root>', -1)
hlines = []
for line in lines:
current_indent_depth = get_indent_depth(line)
line_without_indent = remove_indent(line)
hline = HierarchicalLine(line_without_indent, current_indent_depth)
hlines.append(hline)
stack = Stack()
stack.push(root_hline)
for i,current_hline in enumerate(hlines):
prev_hline, _ = stack.peek()
prev_depth = prev_hline.indent_depth
current_depth = current_hline.indent_depth
# 自分の所属は機械的に親に任せる
# どの親であるべきかは判断しない(Stackに正しい親が入っているとみなす)
if current_depth <= prev_depth:
# n段下がるケースはn回親を遡ればよい
# 0段(上げ下げなし=親を変えない)のケースもカバーできる
backtrack_count = prev_depth - current_depth
for _ in range(backtrack_count):
prev_hline = stack.pop()
prev_hline.append(current_hline)
# 自分が親になるべきかどうかを判断する
# そのためには次行を先読みする必要がある
is_reached_to_end = i==len(hlines)-1
if is_reached_to_end:
continue
next_depth = next_hline.indent_depth
if next_depth == current_depth+1:
# 次が1段下がる
# - 次は自分の子なので自分が親になる
stack.push(current_hline)
elif next_depth > current_depth+1:
# 次がn段下がるケースは文法違反
# - 不便なので矯正しちゃう(孫以下は自分の子にする)
# - もちろん自分は親になる
next_hline.indent_depth = current_depth+1
stack.push(current_hline)
return root_hline
-.icon
1
上手くいかん
code:py
class HierarchicalLine:
def parse(lines):
root_hline = HierarchicalLine('<root>', -1)
hlines = []
for line in lines:
current_indent_depth = get_indent_depth(line)
line_without_indent = remove_indent(line)
hline = HierarchicalLine(line_without_indent, current_indent_depth)
hlines.append(hline)
stack = Stack()
stack.push(root_hline)
for current_hline in hlines:
prev_hline, _ = stack.peek()
prev_depth = prev_hline.indent_depth
current_depth = current_hline.indent_depth
if current_depth == prev_depth+1:
# 一段下がるので親を更新
# ★ここ、pushするのはcurrentじゃない……
stack.push(current_hline)
elif current_depth > prev_depth+1:
# n段下がるケースは文法違反、だがエラーは不便なので矯正しちゃう
current_hline.indent_depth = prev_depth+1
stack.push(current_hline)
elif current_depth <= prev_depth:
# n段下がるケースはn回親を遡ればよい
# 0段(上げ下げなし=親を変えない)のケースもカバーできる
backtrack_count = prev_depth - current_depth
for _ in range(backtrack_count):
prev_hline = stack.pop()
prev_hline.append(current_hline)
return root_hline