浏览器原理(三)——渲染过程之解析

##前言

此篇为翻译内容,原篇地址:在这里

##解析——介绍

因为解析是渲染引擎中非常重要的一个过程,我们将进一步深入地了解它。 我们先来看一下关于解析的一点介绍。

解析文档意味着将其转换为有意义的结构 —— 代码可以理解和使用。解析的结果通常是表示文档结构的节点树,它被称为解析树或语法树。

例如——解析一个表达式“2+3-1”,就会返回下面这个树:

数学表达式树节点

语法

解析是基于文档遵循的语法规则 —— 其中使用的语言或格式进行的。你可以解析的每种格式都必须具有由词汇和语法规则组成的确定性语法。它被称为上下文无关语法。人类语言不是这样的语言,因此不能用传统的解析技术进行解析。

##解析——词法分析器组合

解析可以分为两个子过程 -——词法分析和语法分析。

词汇分析是将输入打破令牌(tokens)的过程。令牌(token)是语言词汇 -——有效构建块的集合。在人类语言中,它将包含出现在该语言字典中的所有单词。

语法分析是语言语法规则的应用。

解析器通常将工作分给两个组件——词法分析器(有时也叫标记生成器),负责将输入分成有效的令牌,而解析器则负责根据语言语法规则分析文档结构来构建解析树。词法分析器知道如何去除不相关的字符,如空格和换行符。

从源文档到解析树的过程:

从源文档到解析树的过程

解析过程是迭代的,解析器通常会询问词法分析器新令牌,并尝试将令牌与语法规则之一相匹配。

如果规则匹配,则与令牌相对应的节点将被添加到解析树中,并且解析器将要求另一个令牌。

如果没有规则匹配,解析器将在内部存储令牌,并继续请求令牌,直到找到与所有内部存储的令牌匹配的规则。

如果没有找到规则,则解析器将引发异常。 这意味着文档是无效的并包含语法错误。

##编译

很多时候,解析树不是最终产品。解析通常用于翻译 -——将输入文档转换为另一种格式。这个例子就是编译。编译器就是将源代码编译成机器码。这个过程的第一步就是将源代码解析成解析树,然后再把解析树转换成机器代码文档。

下面是编译流程:

编译流程

##解析示例

在前面,我们为一个数学表达式创建了一个解析树,下面,让我们尝试定义一个简单的数学语言来了解一下解析过程。

词汇:我们的语言可以包括整数,加号和减号。

语法

  1. 语言语法构建块是表达式,术语和操作。
  2. 我们的语言可以包含任意数量的表达式。
  3. 表达式定义为“术语”,后跟“操作”,后跟另一术语。
  4. 操作是加号或减号。
  5. 术语是整数标记或表达式。

让我们来分析一下输入的“2+3-1”。

与规则匹配的第一个子字符串是“2”,根据规则5,它是一个“术语”,与规则第二个匹配的是“2+3”——符合规则3,一个“术语”后跟“操作”,后跟另一个“术语”。下一个匹配是在输入结束之后。“2+3-1”是一个表达式,因为我们已经知道了“2+3”是一个“术语”,而“术语”后跟一个“操作”,再跟一个“术语”是符合规则的。而“2++”将不会匹配任何一条规则,因此是无效的输入。

##词汇和语法的正式定义

词汇通常由正则表达式表达。

例如,我们的语言可以被定义为:

INTEGER :0|[1-9][0-9]*
PLUS : +
MINUS: -

语法通常以称为BNF的格式定义。我们的语言将被定义为:

expression := term operation term
operation := PLUS | MINUS
term := INTEGER | expression

我们说一种语言可以由常规解析器解析,如果其语法是上下文无关语法。上下文无关语法的直观定义是可以在BNF中完全表达的语法。正式定义请参见:这里

##解析器的类型

有两种基本的解析器——自顶向下的解析器和自下而上的解析器。直观的解释是,自顶向下的解析器会看到语法的高级结构,并尝试匹配其中的一个。底层解析器从输入开始,并逐渐将其转换为语法规则,从低级别规则开始,直到满足高级规则。

让我们看看两种类型的解析器将如何解析我们的例子:

自上而下的解析器将从较高级别的规则开始——它会“2+3”定义成一个表达式。把“2+3-1”定义为另一个表达式(识别表达式的过程演变与其他规则匹配,但起点是最高级规则)。

自下而上的解析器将扫描输入,直到匹配规则,然后将匹配的输入与规则替换。这个过程将会继续,直到输入结束。被匹配的表达式将会被放到解析栈里。

stackinput
2+3-1
term+3-1
trem operation3-1
expression-1
expression operation1
expression

这种类型的自下而上的解析器被称为移位减少解析器,因为输入向右移动(想象一个指针首先指向输入开始并向右移动),并逐渐减少语法规则。

##自动生成解析器
这里有可以为您生成解析器的工具,它们被称为解析器生成器(generator)。你可以把你的语言的语法——词汇和语法规则,输送给它们,它们会自动生成一个解析器。创建一个解析器需要对解析有深刻理解,并且也不容易用手创建一个优化的解析器。所以解析器生成器非常有用。

Webkit使用两个很有名的解析器生成器——用于创建词法解析器的Flex和用于创建解析器的Bison。Flex输入是包含令牌的正则表达式定义的文件,Bison的输入是BNF格式的语言语法规则。

关于解析器的介绍就到这里了,下一篇文章将会像大家介绍解析HTML的过程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
综合小区管理系统管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、车位管理、车位分配管理、出入管理、字典管理、房屋管理、物业费缴纳管理、公告管理、物业人员投诉管理、我的私信管理、物业人员管理、用户管理、管理员管理。用户的功能包括管理部门以及部门岗位信息,管理招聘信息,培训信息,薪资信息等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 综合小区管理系统管理系统可以提高综合小区管理系统信息管理问题的解决效率,优化综合小区管理系统信息处理流程,保证综合小区管理系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理综合小区管理系统信息,包括出入管理,报修管理,报修管理,物业费缴纳等,可以管理操作员。 出入管理界面,管理员在出入管理界面中可以对界面中显示,可以对招聘信息的招聘状态进行查看,可以添加新的招聘信息等。报修管理界面,管理员在报修管理界面中查看奖罚种类信息,奖罚描述信息,新增奖惩信息等。车位管理界面,管理员在车位管理界面中新增。公告管理界面,管理员在公告管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值