<p>基于状态机的词法分析器可以可靠地完成这一任务。你知道吗</p>
<p>它可以识别我们感兴趣的文件结构:嵌套的花括号、命名的节(一个标识符和一个左大括号在下面的一行;这个只关心顶级节)和子句(在顶级节中由<code>-identifier</code>开始,可能后跟数据行,并由另一个子句或节的结尾终止)。你知道吗</p>
<p>然后它继续读取文件并打印找到的数据行(如果它们恰好位于我们感兴趣的节和子句中)。它还会在找到它们时设置一个标志,以便在该子句结束后立即退出。你知道吗</p>
<pre><code>f = open("t.txt")
import re
identifier=None
brace_level=0
section=None
clause=None
req_clause_found=False
def in_req_clause(): return section=='WFS' and clause=='trees'
for l in (l.strip() for l in f):
if req_clause_found and not in_req_clause(): break
m=re.match(r'[A-Z]+',l) #adjust if section names can be different
if m and section is None:
identifier=m.group(0)
continue
m=re.match(r'\{(\s|$)',l)
if m:
brace_level+=1
if identifier is not None and brace_level==1:
section=identifier
identifier=None
continue
else: identifier=None
m=re.match(r'\}(\s|$)',l)
if m:
brace_level-=1
if brace_level==0: section=None
clause=None
continue
m=re.match(r'-([A-Za-z]+)',l) #adjust if clause names can be different
if m and brace_level==1:
clause=m.group(1)
continue
m=re.match(r'"(.*)"$',l)
if m and in_req_clause():
print m.group(1)
req_clause_found=True
continue
</code></pre>
<p>在样本上,这个输出
你知道吗</p>
<pre><code>/X/Y/Z/C
/X/Y/Z/D
/X/Y/Z/E
</code></pre>