解释器模式实现了一种专门的语言(正则表达式)

基于语法的构造
-正则表达式(正则表达式)
-解释器模式实现了一种专门的语言
1.语法用于判断合法性,及将字符/字节序列解析为特定数据结构
2.正则表达 式用于处理字符串,进行拆分、信息提取和转换
3.解析器生成器根据语法 生成解析器,解析器用于解析字符串

要描述一串符号,无论是字节、字符还是从固定集合中抽取的其他类型的符号,我们使用一种称为语法的紧凑表示
语法定义了一组字符串。-例如,url语法将指定HTTP协议中合法url的字符串集
终结符/终止符
它们被称为终端,因为它们是表示字符串结构的解析树的叶子。他们没有孩子,不能再扩大了。-我们通常在引号中写终端,如’http’或’:’
语法中的非终结符和结果
非终结符类似于一个代表一组字符串的变量,而product则是该变量在其他变量(非终结符)、操作符和常量(终结符)方面的定义。-非终结符是表示字符串的树的内部节点
nonterminal ::= expression of terminals, nonterminals, and operators
非终结符::=终结符、非终结符和运算符的表达式
生产表达式中最重要的三个操作符是
– Concatenation(连接), represented not by a symbol, but just a space空格:
x ::= y z
an x is a y followed by a z
– Repetition(重复), represented by :
x ::= y

an x is zero or more y
– Union(合并), also called alternation, represented by |:
x ::= y | z
an x is a y or a z
以URL为例
▪编写表示url的语法
url ::= ‘http://mit.edu/
url ::= ‘http://’ [a-z]+ ‘.’ [a-z]+ ‘/’
此语法表示所有url的集合,这些url只包含两个部分的主机名,其中主机名的每个部分由1个或多个字母组成
在这种只有一行的形式中,只有一个非终端,其生产仅使用操作符和终端,语法称为正则表达式。
It will be easier to understand if we name the parts using new nonterminals:
url ::= ‘http://’ hostname ‘/’
hostname ::= word ‘.’ word
word ::= [a-z]+
主机名可以有两个以上的组件,并且可以有一个可选的端口号
http://didit.csail.mit.edu:4949/
url ::= ‘http://’ hostname (’:’ port)? ‘/’
hostname ::= word ‘.’ hostname | word ‘.’ word
port ::= [0-9]+
word ::= [a-z]+
正则表达式去掉了终端周围的引号,以及终端和操作符之间的空格,因此它只包含终端字符、用于分组的圆括号和操作符字符
正则表达式可读性不如原始语法
任何文字字符,包括字母和数字、
Replace all runs of spaces with a single space:
public String replaceAll(String regex, String replacement) String singleSpacedString = string.replaceAll(" +", " ");
Match a URL:

Pattern regex = Pattern.compile("http://([a-z]+\\.)+[a-z]+(:[0-9]+)?/"); 
Matcher m = regex.matcher(string); 
if (m.matches()) { // then string is a url }

Extract part of an HTML tag:

Pattern regex = Pattern.compile("<a href=\"([^\"]*)\">");
 Matcher m = regex.matcher(string);
  if (m.matches()) { String url = m.group(1); 
  // Matcher.group(n) returns the nth parenthesized part of // the regex }

解析器解析器获取一个字符序列,并尝试将该序列与语法匹配。解析器通常生成一个解析树,该解析树显示如何将语法结果扩展成与字符序列匹配的句子。解析树的根是语法的起始非终结符。解析树的每个节点都扩展为语法的一个产品。表示语言表达式的递归抽象数据类型称为抽象语法树(AST)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值