解析器根据解析语法的顺序不一样可分为两类。前端
自上而下解析器:从语法高层结构开始出发,尝试从中找到匹配的结构。用点人话说就是解析器先匹配高级的语法部分,而后慢慢降级匹配。web
仍是咱们上述的例子(2+3-1),解析器将 2 + 3 标记为表达式,2 + 3 - 1标记为表达式,而不是先标记为项。正则表达式
自下而上解析器:又名移位归约解析器,从语法的底层规则触发,将输入内容逐步转化为语法规则,直至知足高层语法规则。工具
一样的例子,解析器将输入的内容,找到对应的匹配规则,将匹配的内容替换成对应的底层规则(term、operation),again again 直到输入内容的结尾(This will go on until the end of the input)。post
虽然说解析的过程仍是比较死板的,无非就是规则的匹配,可是若是本身手写一个解析不只要求本身对应解析过程要有这深入理解,同时还要将初版写好的解析器优化好整个处理流程,这样仍是有些难度的,那么有一种能够仅仅须要咱们输入对应语言的语法(词汇和语法规则)的工具就能生成对应解析器,这必定是一种神器吧~(注:留意手写和生成的前置条件)。优化
听说 webkit 渲染引擎就使用两种很是著名的解析器生成器( Flex 和 Bison )。firefox
Flex: 并非前端的 CSS噢。该生成器建立的就是词法分析器(lexer),对应输入就是一个包含正则表达式定义的 token 文件。3d
Bison:建立的自下而上的解析器(parse),其须要的输入则是使用 NBF 格式的语法规则。cdn
由于须要使用 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 解析器究竟是什么样子哩~