提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|使用教程|编辑:郑恭琳|2017-12-28 14:48:47.000|阅读 847 次
概述:语法解析这个系列文章总共有9个部分,在第2部分中,我们将学习语法的解剖学,词法分析器结束,解析器开始,等等。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
紧跟第1部分,我们在谈论的“大蓝景”还未结束,所以让我们继续……
形式语法是一组规则,它在语法上描述一种语言。
这个定义有两个重要的部分:一个语法描述一种语言,但是这个描述只涉及语言的语法而不涉及语义。这就是说,它定义了它的结构,但不是它的意义。必要时,必须以其他方式检查输入意义的正确性。
例如,假设我们要为在第1部分中定义分析的段落中显示的语言定义语法。
HELLO: "Hello" NAME: [a-zA-Z]+ greeting: HELLO NAME
该语法接受诸如“Hello Michael”和“Hello Programming”之类的输入。它们在语法上都是正确的,但是我们知道“Programming”不是一个名字。因此,它在语义上是错误的。语法不指定语义规则,并且它们不被解析器验证。您需要以其他方式确保提供的名称的有效性;例如,将其与有效名称的数据库进行比较。
为了定义语法元素,我们来看一个最常用格式的例子来描述语法:Backus-Naur Form(BNF)。 这种格式有许多变种,包括Extended Backus-Naur Form。Extended类型的优点是包含一个简单的表示重复的方法。另一个值得注意的变体是Augmented Backus-Naur Form,主要用于描述双向通信协议。
Backus-Naur语法中的典型规则如下所示:
< symbol > ::= __expression__
< symbol >是一个非终端符,这意味着它可以被右边的一组元素__expression__取代。 元素__expression__可以包含其他非终端符号或终端符号。终端符号就是那些在语法中任何地方都不以< symbol >出现的符号。终端符号的典型例子是一串字符,如“你好”。
规则也可以称为生产规则。从技术上讲,它定义了非终端者与右边的非终端者和终端者之间的转换。
解析中使用的语法主要有两种:正规文法和上下文无关文法。通常对于一种语法对应同一种语言:一种正则语法定义一种正则语言等等。然而,还有一种更近期的称为解析表达语法(Parsing Expression Grammar,PEG)的语法,它与上下文无关的语法同样强大,因此定义了上下文无关的语言。两者的区别在于规则的表示和解释。
正如我们已经提到的那样,这两种语言处于复杂的层次结构中——正则语言比上下文无关的语言更简单。
区分这两种语法的一个比较简单的方法是,一个正则语法的正则表达式——也就是规则的右边——可能只是其中的一个:
这是很难检查的,因为一个特定的工具可以允许在一个定义中使用更多的终端符号。然后,工具本身会自动将这个表达式转换成一系列等同的表达式,这些表达式都属于上述三种情况之一。
所以,你可以写一个与正规语言不兼容的表达式,但是表达式会以适当的形式被转换。换句话说,这个工具可以为语法写作提供语法糖(syntactic sugar)。
在稍后的一段中,我们将详细讨论不同类型的语法及其格式。
词法分析器转换一系列tokens中的一系列字符。
词法分析器(Lexers)也被称为扫描仪或标记器。Lexers在解析中起到了一定的作用,因为它们将初始输入转换为适当的解析器更易于管理的形式,而解析器则是在后期工作。通常来说,词法分析器比解析器更容易编写,虽然在特殊情况下,两者都非常复杂。例如,在C的情况下(参见维基百科的)。
词法分析器的一个非常重要的工作任务是处理空白。然而大多数情况下,您希望词法分析器放弃空白。这是因为,如若不然的话,解析器将不得不检查每个单个标记之间是否存在空白,这很快就会变得很烦人。
但是在某些情况下,你不能这样做,因为空白与语言相关,就像Python用来识别代码块一样。即使在这种时候,通常情况下,词法分析器会处理将相关空白与不相关空白区分开来的问题——这意味着您希望词法分析器了解哪些空白与解析相关。例如,在解析Python时,您希望词法分析器检查空白是否在关键字if和下面的表达式(不相关)之间定义了缩进(相关)或空格。
鉴于词法分析器几乎完全与解析器一起使用,因此两者之间的分界线有时会模糊不清。这是因为解析必须产生对于程序的特定需求有用的结果。所以,解析某个东西的方法不仅仅是一个正确的方法,而且您只关心满足您需求的一种方式。
例如,假设您正在创建一个程序,该程序必须解析服务器的日志以将其保存在数据库中。为了这个目标,词法分析器将识别一系列的数字和点,并将它们转换成IPv4 token。
IPv4: [0-9]+ "." [0-9]+ "." [0-9]+ "." [0-9]+
然后,解析器将分析tokens的顺序,以确定它是否是消息、警告等。
如果您正在开发必须使用IP地址来识别访客国家的软件,会发生什么呢?也许你会希望词法分析器识别地址的八位位置以备后用,并使IPv4成为解析器元素。
DOT : "." OCTET : [0-9]+ ipv4 : OCTET DOT OCTET DOT OCTET DOT OCTET
这是由于不同的目标,如何以不同的方式解析相同的信息的一个例子。
请继续关注第3部分,我们将在其中讨论语法、语义和解析器。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢