一、语法驱动的构造
-
基于I/O的输入流 应用需要从外部读取文本数据, 在应用中做进一步处理。 具体来说,读取的一个字节或字符序列可能是:
-
输入文件有特定格式,程序需读取文件并从中抽取正确的内容。
-
从网络上传输过来的消息,遵循特定的协议。
-
用户在命令行输入的指令,遵顼特定的格式。
-
内存中存储的字符串,也有格式需要。
-
-
语法
-
使用grammar判断字符串是否合法,并解析成程序里使用的数据结构
-
正则表达式
-
通常是递归的数据结构
-
1.1 语法的组成成分
-
终止节点:语法中的文字字符串
-
用语法定义一个“字符串”
-
terminals 终止节点、叶节点
-
nonterminal 非终止节点(遵循特定规则,利用操作符、终止节点和其他非终止节点,构造新的字符串)
-
-
语法中的产生式节点和非终止节点
-
语法是由一系列产生式节点组成,每一个产生式节点定义了一个非终止节点
-
非终止节点就像代表一组字符串的变量,而产生式节点是根据其他变量(非终结符),运算符和常量(终结符)来定义该变量。 遵循特定规则,利用操作符,终止中断和其他非终止中断,构造新的字符串
-
非终结符是树的内部节点,代表一个字符串。
-
-
语法中的产生式节点具有以下形式:
-
nonterminal :: =产生式节点、非终止节点和运算符的表达式
-
语法的非终结符之一被指定为词根
-
语法识别的字符串集是与根非终结符匹配的字符串
-
该非终结符通常称为root或start
-
1.2 语法中的操作符
-
三个基本语法的操作符
-
连接,不是通过一个符号,而是一个空间: x ::= y z //x等价于y后跟一个z
-
重复,以*表示: x ::= y* // x等价于0个或更多个y
-
联合,也称为交替,用|表示 : x ::= y | z //x等价于一个y或者一个z
-
-
三个基本操作符的组合:
-
可选(0或1次出现),由?表示: x ::= y? //x等价于一个y或者一个空串
-
出现1次或多次:以+表示: x ::= y+ //x等价于一个或者更多个y, 等价于 x ::= y y*
-
字符类[…],表示长度的字符类,包含方括号中列出的任何字符的1个字符串: x ::= [abc] //等价于 x ::= 'a' | 'b' | 'c'
-
否定的字符类…,表示长度,包含未在括号中列出的任何字符的1个字符串: x ::= abc //等价于 x ::= 'd' | 'e' | 'f' | ... (all other characters in Unicode)
-
-
例子: x ::= (y z | a b)* //an x is zero or more y z or a b pairs m ::= a (b|c) d //an m is a, followed by either b or c, followed by d
1.3 语法分析树
-
语法分析树: 将语法与字符串匹配可以生成一棵分析树,该树显示字符串的各个部分与语法的各个部分如何对应。
-
解析树的叶子用终端标记,表示已解析的字符串部分。
-
没有孩子,无法继续扩大。
-
如果将叶子串联在一起,则返回原始字符串。
-
-
解析URL示例: url ::= protocol '\: //' hostname (':'port)? '/' protocol ::= ('f' | 'ht') 'tp' 's'? hostname ::= word '.' hostname | word '.' word port ::= [0-9]+ word ::= [a-z]+
1.4 正则语法
-
正则语法: 简化之后可以表达为一个产生式而不包含任何非终止节点。
-
正则语法示例:
图2-1 正则语法
1.5 正则表达式
-
正则表达式: 可以用一种更紧凑的形式来编写简化的终端和运算符表达式。
-
正则表达式消除了终端周围的引号以及终端和操作符之间的空格,因此它仅由终端字符,分组括号和操作符组成。 去除引号和空格,从而表达更简洁(更难懂),正则表达式也简称为regex。
-
正则表达式比原始语法的可读性差得多,因为它缺少记录每个子表达式含义的非终结符名称。
-
但是正则表达式可以快速实现,并且许多编程语言中都有支持正则表达式的库。
-
-
正则表达式中的特殊字符
图2-2 正则表达式中的特殊字符
-
上下文无关文法 与课程形式语言与自动机关联
1.6 JAVA中的正则表达式
-
适用场合:我们用正则表达式匹配字符串(例如 String.split , String.matches , java.util.regex.Pattern)
-
用一个空格代替所有的多个空格
-
匹配一个URL:
-
提取HTML标签的一部分
-
图2-3 JAVA中使用正则表达式示例