解析XML:从分离岛屿到构建完整解析器
1. 流中的岛屿语言
在处理文件时,我们常见的文件格式大多只包含单一语言,如DOT、CSV、Python和Java文件等。但还有一些文件格式,其中结构化区域(岛屿)被随机文本(海洋)包围,我们将这类格式称为岛屿语言,并用岛屿语法来描述。例如模板引擎语言(如StringTemplate)、LaTeX文档准备语言,而XML是典型的岛屿语言,其文件包含结构化标签和实体,周围是大量我们不关心的内容。
分类是否为岛屿语言往往取决于我们的视角。例如,构建C预处理器时,预处理器命令构成岛屿语言,C代码是海洋;而构建适用于IDE的C解析器时,解析器需忽略大量预处理器命令。
我们的目标是学会忽略海洋部分,对岛屿部分进行分词,以便解析器验证这些岛屿内的语法,这是构建真正XML解析器的关键。
1.1 从文本海洋中分离XML岛屿
要将XML标签与文本分离,我们可能首先想到构建一个输入字符流过滤器,去除标签间的所有内容。但这样会丢弃所有文本数据,并非我们想要的结果。例如,输入 <name>John</name> ,我们不希望丢弃 John 。
因此,我们构建一个简单的XML语法,将标签内的文本作为一个标记,标签外的文本作为另一个标记。这里我们关注词法分析器,使用单个语法规则匹配一系列标签、实体、CDATA部分和文本(海洋)。
grammar Tags;
file : (TAG|ENTITY|TEXT|CDATA)* ;
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



