WebKit中的html词法解析(dlmu2001).doc_第1页
WebKit中的html词法解析(dlmu2001).doc_第2页
WebKit中的html词法解析(dlmu2001).doc_第3页
WebKit中的html词法解析(dlmu2001).doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

WebKit中的html词法解析(dlmu2001)摘要:webkit源代码分析,webcore,html解析,htmlparse,htmltoken,htmltokenizer,dlmu2001,浏览器,chrome语言的解析一般分为词法分析(lexical analysis)和语法分析(Syntax analysis)两个阶段,WebKit中的html解析也不例外,本文主要讨论词法分析。词法分析的任务是对输入字节流进行逐字扫描,根据构词规则识别单词和符号,分词。在WebKit中,有两个类,同词法分析密切相关,它是HTMLToken和HTMLTokenizer类,可以简单将HTMLToken类理解为标记,HTMLTokenizer类理解为词法解析器。HTML词法解析的任务,就是将输入的字节流解析成一个个的标记(HTMLToken),然后由语法解析器进行下一步的分析。在XML/HTML的文档解析中,token这个词经常用到,我将其理解为一个有完整语义的单元(也就是分出来的“词”),一个元素通常对应于3个token,一个是元素的起始标签,一个是元素的结束标签,一个是元素的内容,这点同DOM树是不一样的,在DOM树上,起始标签和结束标签对应于一个元素节点,而元素内容对应另一个节点。除了起始标签(StartTag)、结束标签(EndTag)和元素内容(Character),HTML标签还有DOCTYPE(文档类型),Comment(注释),Uninitialized(默认类型)和EndOfFile(文档结束)等类型,参见HTMLToken.h中的Type枚举。上图是HTMLToken类的成员变量,从中我们可以看到一个标记的组成:类型,在字节流中的偏移,数据(m_data,不同的类型具有不同的意义),文档类型,是否自封闭(对于开始和结束标签),属性列表,当前属性。HTMLTokenizer就是要从字节流解析出一个个这样的结构体来,他的实现是基于状态机来做的,状态机模型在/TR/html5/tokenization.html#tokenization中已经明确定义,nextToken方法实现了该状态机。对有限状态机不熟悉的童子建议先学习下absurd大大的文章系统程序员成长计划-文本处理(一)状态机(/absurd/archive/2009/06/07/4249569.aspx)。下面以一个简单的html文档来复盘状态机的几条路线。w3c不考虑类似和之间的回车换行(webkit里面有做特殊处理,也就是所谓的“authoring convenience”,m_skipLeadingNewLineForListing),从前面的描述中,我们可以确认,该文档有9个HTMLToken,分别是文档类型声明,注释,html的起始标签,body的起始标签,a的起始标签,a的元素内容,a的介绍标签,body的结束标签,html的结束标签。起始状态为DataState。1)DOCTYPEDataState:!DOCTYPE,碰到,进入TagOpenStateTagOpenState:!DOCTYPE, 碰到!,进入MarkupDeclarationOpenState状态MarkupDeclarationOpenState:!DOCTYPE,碰到D,匹配DOCTYPE和-字数都不够,保持现状MarkupDeclarationOpenState:!DOCTYPE,匹配doctype,进入DOCTYPEState状态(HTMLToken的type为DOCTYPE)DOCTYPEState: !DOCTYPE html PUBL,碰到空格,进入BeforeDOCTYPENameState状态BeforeDOCTYPENameState: !DOCTYPE html PUBL,碰到h,进入DOCTYPENameStateDOCTYPENameState: !DOCTYPE html PUBL,碰到t,保持原状态,提取html作为文档类型DOCTYPENameState: !DOCTYPE html PUBL,碰到空格,进入AfterDOCTYPENameState状态。(HTMLToken的m_data为html)AfterDOCTYPENameState:!DOCTYPE html PUBLIC,碰到P,还未能匹配Public或者system,保持状态AfterDOCTYPENameState:!DOCTYPE html PUBLIC,匹配public,进入AfterDOCTYPEPublicKeywordStateAfterDOCTYPEPublicKeywordState:!DOCTYPE html PUBLIC -/,碰到空格,进入BeforeDOCTYPEPublicIdentifierStateBeforeDOCTYPEPublicIdentifierState:!DOCTYPE html PUBLIC -/,碰到”,进入DOCTYPEPublicIdentifierDoubleQuotedStateDOCTYPEPublicIdentifierDoubleQuotedState:!DOCTYPE html PUBLIC -/,碰到-,保持状态,提取m_publicIdentifierDOCTYPEPublicIdentifierDoubleQuotedState:,碰到”,进入AfterDOCTYPEPublicIdentifierState状态。(HTMLToken的m_publicIdentifier确定)AfterDOCTYPEPublicIdentifierState: ,碰到,进入DataState状态,完成文档类型的解析2)COMMENTDataState:,碰到,进入TagOpenStateTagOpenState:, 碰到!,进入MarkupDeclarationOpenState状态MarkupDeclarationOpenState:,碰到-,匹配DOCTYPE和-字数都不够,保持现状MarkupDeclarationOpenState:,匹配-,进入CommentStartState状态(HTMLToken的type为COMMENT)CommentStartState: ,碰到c,进入CommentStateCommentState:,碰到-,进入CommentEndDashState状态(HTMLToken的m_data为comment)CommentEndDashState: ,碰到-,进入CommentEndState状态CommentEndState:,碰到,进入DataState状态,完成解析。3)起始标签aDataState:,碰到,进入TagOpenState状态TagOpenState:,碰到a,进入TagNameState状态(HTMLToken的type为StartTag)TagNameState:,碰到空格,进入BeforeAttributeNameState状态(HTMLToken的m_data为a)BeforeAttributeNameState:,碰到h,进入AttributeNameState状态AttributeNameState:,碰到=,进入BeforeAttributeValueState状态(HTMLToken属性列表中加入一个属性,属性名为href)BeforeAttributeValueState: ,碰到“,进入AttributeValueDoubleQuotedState状态AttributeValueDoubleQuotedState:,碰到w,保持状态,提取属性值AttributeValueDoubleQuotedState:,碰到“,进入AfterAttributeValueQuotedState(HTMLToken当前属性的值为).AfterAttributeValueQuotedState: ,碰到,进入DataState,完成解析。在完成startTag的解析的时候,会在解析器中存储与之匹配的end标签(m_appropriateEndTagName),等到解析end标签的时候,会同它进行匹配(语法解析的时候)。html,body起始标签类似a起始标签,但没有属性解析4)a元素DataState:w3c,碰到w,维持原状态,提取元素内容(HTMLToken的type为character)。DataState:w3c,碰到,完成解析,不consume 。(HTMLToken的m_data为w3c)。5)a结束标签DataState:w3c,碰到,进入TagOpenState。TagOpenState:w3c,碰到/,进入到EndTagOpenState。(HTMLToken的type为endTag)。EndTagOpenState:w3c,碰到a,进入到TagNameState。TagNameState:w3c,碰到,进入到DataState,完成解析。通过以上的复盘,一个标记的token过程清晰呈现在眼前,基本上就是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论