语法解析这个系列文章总共有9个部分,在第2部分中,我们将学习语法的解剖学,词法分析器结束,解析器开始,等等。
大蓝景
紧跟第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)。
在稍后的一段中,我们将详细讨论不同类型的语法及其格式。
词法分析器(Lexer)
词法分析器转换一系列tokens中的一系列字符。
词法分析器(Lexers)也被称为扫描仪或标记器。Lexers在解析中起到了一定的作用,因为它们将初始输入转换为适当的解析器更易于管理的形式,而解析器则是在后期工作。通常来说,词法分析器比解析器更容易编写,虽然在特殊情况下,两者都非常复杂。例如,在C的情况下(参见维基百科的the lexer hack)。
词法分析器的一个非常重要的工作任务是处理空白。然而大多数情况下,您希望词法分析器放弃空白。这是因为,如若不然的话,解析器将不得不检查每个单个标记之间是否存在空白,这很快就会变得很烦人。
但是在某些情况下,你不能这样做,因为空白与语言相关,就像Python用来识别代码块一样。即使在这种时候,通常情况下,词法分析器会处理将相关空白与不相关空白区分开来的问题——这意味着您希望词法分析器了解哪些空白与解析相关。例如,在解析Python时,您希望词法分析器检查空白是否在关键字if和下面的表达式(不相关)之间定义了缩进(相关)或空格。
Lexer结束,Parser开始的地方
鉴于词法分析器几乎完全与解析器一起使用,因此两者之间的分界线有时会模糊不清。这是因为解析必须产生对于程序的特定需求有用的结果。所以,解析某个东西的方法不仅仅是一个正确的方法,而且您只关心满足您需求的一种方式。
例如,假设您正在创建一个程序,该程序必须解析服务器的日志以将其保存在数据库中。为了这个目标,词法分析器将识别一系列的数字和点,并将它们转换成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部分,我们将在其中讨论语法、语义和解析器。
推荐阅读:
展望2018年:基于AI人工智能的移动应用程序开发将如何发展
开发一个聊天机器人(Chatbot)应用程序需要花费多少钱/h5>
PS: 更多人工智能、大数据相关视频、培训、公开课,请关注【学院】!
关于人工智能技术的最新资讯和相关开发工具推荐,请<咨询在线客服>!

标签:算法人工智能解析器语法解析NLP自然语言处理AI
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!