baixiaoji / blog

writting & thinking
3 stars 0 forks source link

4-解析-解析器 #10

Open baixiaoji opened 5 years ago

baixiaoji commented 5 years ago

4-解析-解析器

解析器根据解析语法的顺序不同可分为两类。

自上而下解析器:从语法高层结构开始出发,尝试从中找到匹配的结构。用点人话说就是解析器先匹配高级的语法部分,然后慢慢降级匹配。

还是我们上述的例子(2+3-1),解析器将 2 + 3 标记为表达式,2 + 3 - 1标记为表达式,而不是先标记为项。

自下而上解析器:又名移位归约解析器,从语法的底层规则触发,将输入内容逐步转化为语法规则,直至满足高层语法规则。

同样的例子,解析器将输入的内容,找到对应的匹配规则,将匹配的内容替换成对应的底层规则(term、operation),again again 直到输入内容的结尾(This will go on until the end of the input)。

4-bottom-top

虽说解析的过程还是比较死板的,无非就是规则的匹配,但是如果自己手写一个解析不仅要求自己对应解析过程要有这深刻理解,同时还要将第一版写好的解析器优化好整个处理流程,这样还是有些难度的,那么有一种可以仅仅需要我们输入对应语言的语法(词汇和语法规则)的工具就能生成对应解析器,这一定是一种神器吧~(注:留意手写和生成的前置条件)。

据说 webkit 渲染引擎就使用两种非常著名的解析器生成器( Flex 和 Bison )。

Flex: 并不是前端的 CSS噢。该生成器创建的就是词法分析器(lexer),对应输入就是一个包含正则表达式定义的 token 文件。

Bison:创建的自下而上的解析器(parse),其需要的输入则是使用 NBF 格式的语法规则。

因为需要使用 BNF格式去书写语法,则证明适用于 context free grammer的语言。而 webkit 中 CSS 解析器就是由 Bison 生成;而 firefox 中CSS解析器是由人工手写,其主要的逻辑是将CSS 文件转化为 StyleSheet 对象,而对象中包含对应的 CSS 规则。

那能不能 Bison 创建一个 HTML 解析器呢?没有可能,因为 HTML 语法规则并不是 context free grammer 类型,所以无法使用 BNF 格式书写语法,严格的说常规解析 CSS 和 JavaScript的解析器并不能解析 HTML文档。

HTML 格式可以由DTD (Document Type Definition) 定义,让我想起来 XML 和 HTML 很像语言层面都是标记语言,XML 也是有 DTD 和 XML Schema 定义的,而且 XML 中有一个 HTML 的变体: XHTML。那么 HTML 解析器能不能解析 HTML呢?

还是不行,为什么呢?想必 XML 而言,HTML 语法规则更加包容,容许开发者省略某些隐式添加的标记,有时还能省略一些起起始或是结束标签等等。这一方面让 HTML 流行的原因之一,同时导致了 HTML 语法较难定义,所以无法使用常规解析器去解析。

那 HTML 解析器到底是什么样子哩~