正则表达式解释器实现原理

Go 设计模式中解释器模式 解释器模式的核心思想是将语言的文法表示为一个抽象语法树(Abstract Syntax Tree, AST),并通过递归地解释执行树上的节点来实现对语言的解释。解释器模式(Interpreter Pattern)是一种行为型设计模式,用于定义一种语言的文法表示,并解释执行该语言中的句子。当需要实现一种语言的解释器,对语言中的句子进行解释和执行时,可以使用解释器模式。解释器模式允许将语言的文法表示为一个抽象语法树,并通过解释器类递归地解释执行树上的节点。解释器模式的实现相对简单,适用于规模较小的语言解释器。 阅读详情

以JavaScript正则为例

Author:tuiye@126.com

  正则表达式可以用来:

(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。

(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。

(3)用来替换,比普通的替换更强大。

对于一个正则表达式一般有2种方式,以JS为例

其一为使用正则表达式文字常量:

var re = /^[Jj]ava[Ss]cript/i;

其二为使用RegExp构造函数:

var re = new RegExp(“^[Jj]ava[Ss]cript”,”i”);

 

而一个正则表达式解释器主要有3部分组成,分别是解析(parse)、编译(compile)与执行(execute)。

 

1 解析

正则的表达式的词法与语法比较简单,基本语法如下:

A)普通字符和元字符

普通字符是那些表示自身的字符,例如从a到z,A到Z,0到9等;

元字符具有特殊意义,如‘.’,表示除了‘/n’外的所有字符,其他具有此功能的有

 

表1 元字符

元字符

特殊意义

^

匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "/^"

$

匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "/$"

.

匹配除了换行符(/n)以外的任意一个字符。要匹配小数点本身,请使用 "/."

*

修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "/*"

+

修饰匹配次数为至少 1 次。要匹配 “+” 字符本身,请使用 “/+”

?

修饰匹配次数为 0 次或 1 次。要匹配 “?” 字符本身,请使用 “/?”

=

用于前向引用或向后引用

!

用于前向引用或向后引用

:

用于前向引用或向后引用

|

用于前向引用或向后引用

/

转义用

/

用于前向引用或向后引用

()

标记一个子表达式的开始和结束位置。要匹配小括号,请使用 “/(“ 和 “/)”

[]

用来自定义能够匹配 ‘多种字符’ 的表达式。要匹配中括号,请使用 “/[“ 和 “/]”

{}

修饰匹配次数的符号。要匹配大括号,请使用 “/{“ 和 “/}”

元数据如要表示自身,那么需要用’/’来辅助转义

 

B)字符类

单个的字符可以组成字符类,其语法为用’[’与’]’组成,例如[abcA-Z79]表示可以匹配a,b,c与A到Z,7,9的字符

其中’-’为连字符,表示字符的跨度。

‘^’在”[]”间也是特殊字符,表示取反

其他的特殊字符如下表:

表2 字符类中的预定义字符类

预定义字符类

特殊意义

^

在紧跟’[’表示取反,表示自身要转义

-

在字符间,表示连字符,如要表示自身,须紧接在’[’或’[^’之后

.

小数点可以匹配除了换行符(/n)以外的任意一个字符

/d

可以匹配任何一个 0~9 数字字符

/D

D大写,可以匹配任何一个非数字字符

/s

可以匹配空格、制表符、换页符等空白字符的其中任意一个

/S

S大写,可以匹配任何一个空白字符以外的字符

/w

可以匹配任何一个字母或者数字或者下划线

/W

W大写,可以匹配任何一个字母或者数字或者下划线以外的字符

JavaScript无POSIX格式

C)限定符(重复)

限定符有2种形式,分别为’*’,’+’,’?’与’ {’与’}’来表示

表3 限定符

限定符

特殊意义

*

表达式尽可能的多匹配,最少可以不匹配,相当于 {0, }

+

表达式尽可能的多匹配,至少匹配1次,相当于 {1, }

?

表达式尽可能匹配1次,也可以不匹配,相当于 {0, 1}

{m,n}

表达式尽可能重复n次,至少重复m次:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"

{m}

表达式固定重m次,比如:"/w{2}" 相当于 "/w/w"

{m,}

表达式尽可能的多匹配,至少重复m次:"/w/d{2,}"可以匹配 "a12","x456"...

 

在正则中有贪婪与非贪婪之分,默认的情况下,正则是贪婪的

如果要把正则设置为非贪婪有2种方式,一种为设置在原先的限定符加上’?’就行,另一种在设置

举例说明,/.+/ 将匹配"abdddd"中的所有字符,/.+?/ 只将匹配"abdddd"中的第一个a,也就是默认的尽可能多的匹配字符,而非贪婪重复则尽可能上的匹配。

 

D)选择、分组和引用

选择的语法就是设置’|’,如a|bc,那么要么a或bc都可以匹配,如果(a|b)c则为匹配ac或bc。

如果我们在上例中设置了”()”,那么这就是分组,每个分组都可以被引用,如(a|b)c*(e|f)/1/2,/1与/2就是引用的语法,/1表示引用了(a|b),/2表示引用(e|f),以此类推。

这里要说明的是(a|b)c*(e|f)/1/2与(a|b)c*(e|f)(a|b)(e|f)乍一看两者等同,但实际上,前一个不可以匹配acebf,而后一个可以。究其原因就是引用处的配平必须与被引用处一致,此例中与之匹配的可以是aceac。

 

E)定位符(锚)和前向引用

定位符如下表所示

表4 定位符

限定符

特殊意义

^

匹配输入字符串的开始位置。要匹配 "^" 字符本身

$

匹配输入字符串的结尾位置。要匹配 "$" 字符本身

?

表达式尽可能匹配1次,也可以不匹配,相当于 {0, 1}

/b

匹配单词边界,例如一个/w和/W的位置,或者一个/w与字符串的开始和结尾的位置

/B

和上面的想法,匹配一个非单词边界

如果正则表达式的匹配模式为 MULTILINE 模式,^ 可匹配一行文本的行首,$ 可匹配一行文本的行末。当 /b 被包含于字符集合中时,/b 代表退格符(ASCII码 = 8)。

除了这些预定义的定位符,还可以自定义定位符,这种类型的定位符叫做前向引用(look-ahead anchor)和后向引用(look-behind anchor,JavaScript不支持)。

前向引用使用(?=…)表示正的前向引用,(?!…)表示负的前向引用下面是一个前向引用的例子 /Java(?!Script)([A-Z]/w*)/ 其中(?!Script)匹配后面不跟Script的位置,而(?=Script)匹配后面是Script的位置。

 

以上讲解了JavaScript的语法规则,下面我们来论述一下解析的过程。

解析的过程是语法分析(Lexical Analysis)与词法分析(Grammar Analysis)。

 

2 编译

编译(Compile)阶段,主要的工作就是生成字节流(Emit Byte Code)。而生成Byte Code的算法(规则)JS中就是NFA。生成的Byte Code是归于执行(Execute)时做匹配利用。各个状态即为正则中的语义(OPCODE)的表示,各个OPCODE以一定的格式与关系住成了状态机,JS中是组成NFA的状态机。

下面介绍下在流行的两种算法NFA(Nondeterministic Finite Automaton)与DFA(Deterministic Finite automaton),Perl,Python,JS等都是NFA的,而awk与grep等用的是DFA,两种算法的具体实现如下:

1)有限状态机(Finite Automation)

状态机是一个有一组不同状态的集合的系统。有一个特殊状态――它描述了系统的初始状态。而其他的一个或多个状态为终止状态;当一个事件将我们带到这样的一些状态时,状态机将退出。状态是与转换相关联的,每个转换都标注有输入事件的名称。当事件发生时,我们将随着相关的转换从当前状态移动到新的状态。

一个有限状态机包含一组状态集(states)、一个起始状态(start state)、一组输入符号集(alphabet)、一个映射输入符号和当前状态到下一状态的转换函数(transition function)的计算模型。当输入符号串,模型随即进入起始状态。它要改变到新的状态,依赖于转换函数。

假定一个输入符号(symbol),可以得到2个或者2个以上的可能状态,那么这个finite automaton就是不确定的,反之就是确定的。

一个正则可以与一个FA等同,其转化的规律如下

对于单个字符的

两个状态的连接e1e2

对于e?

对于e1|e2

对于e*

对于e+

 

2)不确定有限状态机(NFA)

例如要匹配abab|abbb,其NFA的状态是

 

 

3)确定性有限状态机(DFA)

以上例子的DFA如下

其中s1-s10为各个的状态对应于NFA中的s1-s10

 

3 执行

       1)NFA

那么一个abbb字符串的匹配过程如下:

 

一个更加高效的方式是同步匹配两者:

 

这里我们看到,是利用正则表达式来扫描要匹配的字符串,又由于此时是不确定状态机,所以利用试探与backing的方式来做匹配的。NFA是由正则来做驱动匹配的。这就像一个过程语言,控制了解析器在匹配中的try/fail。

 

       2)DFA

而确定性状态机相反,由于对于相应的输入都有一定的状态的迁移,所以总的来说,DFA的匹配效率要高一些。DFA是由字符串作驱动来匹配的,在每个字符串中的每个字符只被扫描一次。这种方式就是尝试此状态时可能的每种输入同时进行匹配。

 

4 实践

见JS 1.6与PCRE7.2

 

1)JS1.6

       以 /.*ht*p{0,3}/ 为例来说明JS1.6与PCRE7.2的NFA组成

       JS1.6中,基本上以一个字符(广义上的字符,比如/n我们认为是回车字符)以一个节点建立RENode。比如例子中,我们建立了7个RENode,依次为’.’,’*’,’h’,’t’,’*’,’p’,” {0, 3}”。其中’h’,’t’,’p’分别为REOP_FLAT,而’*’,”{0,3}”为REOP_QUANT(RE_STAR)。

       建立的节点的同时,会调整节点间的关系,主要是ProcessOp()这个函数,调整的关系为两种:一种是OP_CONCAT(连接),另一种为OP_ALT(选择)。OP_CONCAT是指两个OP_FLAT的RENode节点,例如’h’与’t’是紧挨的,那么我们把他们处理成“连接”关系。“连接”关系一种顺序关系。至于OP_ALT,则额外建立一个OP_ALT节点把两则建立起选择的关系。例如a|b,那么,建立OP_ALT节点,把节点’a’与’b’与节点OP_ALT建立选择关系。

解析后RENode节点顺序如下图

*

0

4

.

ENDCHILD

FLAT

h

*

0

5

FLAT

t

END

CHILD

QUANT

0

3

0

5

FLAT1

P

END

即

JS1.6中编译的过程就为生成NFA的过程,主要是调整生成OP_ALT,OP_BACKREF,OP_STAR等跳转关系

编译后,生成NFA

(注:此例中上下行为父子关系)

REOP_STAR

REOP_FLAT1

REOP_STAR

REOP_QUANT

REOP_DOT ’.’

‘h’

REOP_FLAT ’t’

REOP_FLAT ‘p’

即

       执行(匹配)的过程,我们以匹配字符串”xhtttpps”

匹配中的OPCODE

匹配中的匹配位置与状态

成功与否

Start(保存,MatchBack用)

|x h t t t p p s

 

|

|x h t t t p p s

 

.*

<x h t t t p p s

True

.*

x h t t t p p s

True

…

…

…

.*

<x h t t t p p s|

False

h

<x h t t t p p s|

False

…

…

…

h

<x h |t t t p p s

False(则回朔)

h

<x |h t t t p p s

True

                     t                    

<x h |t t t p p s

True

…

…

…

t

<x h t t t |p p s

False(则回朔)

p

<x h t t t |p p s

True

p

<x h t t t p |p s

True

Done

<x h t t t p p> s

True

注:其中’|’代表匹配所在的位置,’<’代表匹配成功开始,’>’代表匹配成功结束。

所以上述正则可匹配上述字符串中的”xhtttpp”

 

2)PCRE7.2

以/ht*p{0,2}/为例

PCRE的解析与编译是合而为一的,也就是说,解析编译后生成的OPCODE即为最终的NFA。这里NFA与JS1.6中的NFA是形式是一样的,当然细节上有区别。因此其匹配的过程也是相似。

当然PCRE也提供理论部分的DFA作为其状态机。(待续)

以上的正则解析编译后的以如下格式存在。

OP

BRA

0

11

OP

CHAR

h

OP

STAR

t

OP

UPTO

0

2

p

OP

KET

0

11

OP

END

由于其NFA与JS有一致性,这里不再重复,倒是其Match时的一个消递归的方式比较不错,下面来做一个小的说明。

       基本思想是这样的,因为我们递归的时候每次都要保存一些变量与“栈”上,这样过多的嵌套就会引起很大的变量于“栈”上,而且由于某些操作系统对“栈”的大小是有限制的,这就在一定的时候会引起“栈”溢出,从而到时程序运行问题,常见的就是Crash。

       一般比较常用的消递归的方式主要有2种,其一是无限循环,其二就是自己从“堆”上保存自己的变量。这里用了第二种方式。

       以函数直接调用自身这种方式来说明。那么在此函数中定有一处或几处是调用到自身的,在调用自身处,在“堆”上分配出空间frame,用于保存当前的变量的值,并把当前frame压入自己的frame栈(数据结构中的栈,与上面提到的“栈”不同),并且在此设定一个label(标签,用于RETURN时候的goto到此用)。并且goto至函数的入口处,此时犹如一个函数的新调用,而且可以减少调用函数的开销。

       当函数执行完(比如匹配不成功,需要回退;或者subpattern执行完毕)时候,我们需要做“返回”。返回前,我们必须保存执行到此时的一个“结果”,如函数的返回值类似。然后就是取出要返回的label的位置,用goto到那里,把当前的frame销毁,继续执行上一步中未完成的部分。大体上就是这样。

 
正则解析工具(简单好用易用的正则解析器) MTracerFree_2.1简单好用易用的正则解析器,可以获取group,安装即用,简单方便 立即下载

相关推荐

regex:基本 Java 正则表达式解释器

正则表达式 基本 Java 正则表达式解释器

在线正则表达式解析器和可视化工具

在线正则表达式可视化工具 可以很方便的解析出您正则表达式的执行逻辑,帮助您快速理解!

AI的博客 7903

Eureka常见面试题总结

点击关注我的博客原文 Eureka是Netflix组件的一个子模块,也是核心模块之一。云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移(来源springcloud中文网的介绍:https://www.springcloud.cc/)。下图总结了Eureka服务端(以下简称服务端)与Eureka客户端(以下简称客户端)之间协同工作的流程: 流程说明:...

u012105931的博客 2万+

【免费下载】 正则表达式解析器(Regexp Parser)教程

正则表达式解析器(Regexp Parser)教程 项目介绍 正则表达式解析器(-regexp_parser)是一个高效的Ruby库,专为解析正则表达式设计。它提供了对正则表达式的结构化解析能力,使得开发者能够深入理解并操作正则表达式的内部构造。该项目对于需要处理或生成复杂正则表达式的应用非常有用,比如在开发文本处理工具、验证工具或者进行语法分析时。 项目快速启动 要迅速开始使用regexp_p...

gitblog_00555的博客 1591

逻辑漏洞:水平越权、垂直越权靶场练习

水平越权和垂直越权是组织中常见的管理问题,指的是员工在组织中所拥有的权力和责任超出其职位所应具备的范围。 水平越权是指员工在同一级别的职位上超越了其同事的权力和责任范围,通常表现为某个员工在团队中承担了过多的任务或权力,导致其他同事感到不公平或不满。 垂直越权则是指员工在组织中超越了其职位等级的权力和责任范围,通常表现为员工在没有得到上级批准的情况下做出决策或行动,可能会导致组织内部的混乱和冲突。

qq_68163788的博客 2469

用STM32手搓一个体温计

市面上大多额温计、测温计精度。

m0_61687959的博客 2375

正则表达式解析器的编写

首先对正则表达式、有限自动机、非确定性有限状态自动机、确定性有限状态自动机、汤普森构造法、汤普森提出的正则表达式搜索算法进行介绍,然后基于该算法,实现了一个正则表达式解析器

Civitasv 2727

使用QGIS提取天地图遥感影像中的建筑物轮廓,及AI方案

用QGIS的插件提取遥感影像中的建筑轮廓,并提供了几个AI提取建筑轮廓的方案。

cky_123的博客 2万+

(转)正则表达式解释器实现原理

转自:http://blog.youkuaiyun.com/qipnx/archive/2007/10/22/1836596.aspx 正则表达式可以用来: (1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。 (2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。 (3)用来替换,比普通的替换更强大。 对于一个正则表达式一般有2种方式,以JS...

Bobby的部落阁 389

【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像

【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像

|~~~热爱生活、努力学习的小伙汁~~~| 1089

ISO 21434汽车网络安全标准深度解读系列(十):标准实施总结与展望

ISO21434标准深度解读系列总结篇系统回顾了汽车网络安全标准的核心内容与实施要点。文章梳理了10篇系列文章的结构体系,提炼出标准的三大核心价值:系统性方法(全生命周期覆盖、多层次管理)、风险导向理念(威胁驱动、动态管理)和供应链协同机制。总结了实施经验中的关键要素,包括高层承诺、专业团队建设,并提出了分阶段实施路径建议。同时分析了当前面临的技术挑战(系统复杂性、新兴技术)和管理挑战(文化转变、资源投入)。最后展望了AI应用、零信任架构等技术发展趋势,以及标准未来的演进方向,为企业实施提供战略与执行层面的

VehSwHwDeveloper的博客 557

解释器模式

1) 在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器 2) 解释器模式(Interpreter Pattern):是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式) 3) 应用场景 •...

轻描时光 394

【EDA Tools】Spyglass 检查 Verilog 和 SystemVerilog 混合语言及 Lint 检查

Spyglass可以用于检查混合设计中的语言互操作性和一致性问题。对于设计中包含多种硬件描述语言的情况,Spyglass 能够识别并解析其中的模块及其互连,并对其进行验证。例如,在包含 Verilog 和 VHDL 的混合设计中,Spyglass 会自动识别并解析 Verilog 和 VHDL 文件及其相互连接。通过运行 Spyglass Lint 功能,可以检查混合设计中的语言一致性问题,例如不兼容的数据类型、互操作性问题以及其他可能导致设计故障或不一致的问题。

记录学习历程 5076

小侃设计模式(十九)-解释器模式

解释器模式(Interpreter Pattern)是一种使用想对较少的模式,主要使用在编译解释等场景,例如:编译器、规则引擎解释、正则表达式解析等,这些语言又被称为领域特定语言(Domain Specific Language,DSL)。在《大话设计模式》中,对解释器的定义为:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

qq_33479841的博客 910

机器人环境仿真软件:Gazebo_(6).传感器仿真

通过 Gazebo 和 ROS,我们可以方便地配置和使用多种传感器,进行机器人环境的仿真和调试。传感器仿真不仅帮助我们验证和测试机器人的感知能力,还可以在真实部署前发现和解决潜在的问题。本节详细介绍了如何在 Gazebo 中配置激光雷达、摄像头、IMU、声纳和 GPS 传感器,并展示了如何在 ROS 中接收和处理这些传感器数据。此外,还介绍了多传感器融合的基本方法和调试工具,希望这些内容能对你的机器人仿真工作有所帮助。

kkchenjj的博客 1388

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

设计模式之解释器模式详解

本文详细介绍了设计模式中的解释器模式,它是一种用于解析和执行特定语法规则语句的行为型设计模式。文章从模式概述、执行流程、技术原理到具体实现示例,系统性地讲解了解释器模式的核心概念和应用场景。通过一个布尔表达式解释器的Java代码示例,展示了如何定义抽象表达式、终结符表达式和非终结符表达式,以及如何在客户端构建语法树并解释执行。解释器模式适用于需要解析特定领域语言(DSL)的场景,如SQL解析、正则表达式处理等。文中还分享了实现解释器模式的经验技巧,建议先定义完整文法规则再设计对应表达式类。

从不水文,坚持创作,加油 1084

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

设计模式之解释器模式:如何实现一个自定义配置规则功能?

解释器模式使用频率不算高,通常用来描述如何构建一个简单“语言”的语法解释器。它只在一些非常特定的领域被用到,比如编译器、规则引擎、正则表达式、SQL 解析等。不过,了解它的实现原理同样很重要,能帮助你思考如何通过更简洁的规则来表示复杂的逻辑。 话不多说,让我们开始今天的学习吧。 模式原理分析 解释器模式的原始定义是:用于定义语言的语法规则表示,并提供解释器来处理句子中的语法。 语法也称文法,在语言学中指任意自然语言中句子、短语以及词等语法单位的语法结构与语法意义的规律。比如,在编程语言中,if-else 用

舞鹤白沙编码日志 583

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

设计模式:27 其实你不懂老板的心_解释器模式

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释该语言中的句子。   适用于:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实力表述为一个简单语言中的句子。这样就可以构建一个解释器:该解释器通过解释这些句子来解决该问题。 当有一个语言需要解释执行时,并且你可将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。  

qingyuanluofeng的专栏 591

简说设计模式——解释器模式

解释器这个名词想必大家都不会陌生,比如编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。诸如此类的例子也有很多,比如编译器、正则表达式等等。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

jcc4261的博客 775

设计模式-行为型-解释器模式

解释器模式(Interpreter):   从名称上来看看这个模式,个人的最初理解“解释器”和Google的中英翻译功能类似。如果有一天你去国外旅游去了,比如去美国吧,美国人是讲英语的,我们是讲汉语的,如果英语听不懂,讲不好,估计沟通就完蛋了,不能沟通,估计玩的就很难尽兴了,因为有很多景点的解说你可能不明白(没有中文翻译的情况下,一般情况会有的)。所以我们需要一个软件,可以把中英文互译,那彼此就可以更好的理解对方的意思,我感觉翻译软件也可以称得上是解释器,把你不懂的解释成你能理解的。我们写代码,需...

cnmeimei的博客 134

设计模式-解释器模式

设计模式-解释器模式 定义:给定一门语言,定义它的文法的一种表示,定义一个解释器,该解释器使用该表示来解释语言中的句子。 解释器模式是一种按照规定语法进行解析的方案,在现在项目中使用较少。 使用场景 (1) 当一个语言需要解释执行,并且你可将语言中的句子表示为一个抽象语法树时 (2) 一些重复出现的问题可以用一种简单的语法来表达 (3) 一个简单语法需要解释的场景 看完上面这些, 语言?语句?文法?解释器? 这几个词想必大家都不陌生,编译原理中讲的就是这些,但是概念几乎全忘了。 比如正则表达式,它就是对字符

lq 765

JAVA设计模式(十五)——解释器模式

1、解释器模式         解释器模式说起来好像陌生,其实我们早就用过,比如常见的正则表达式,就是我们去定义一个字符串规则,然后找到一个字符串去匹配。         Interpreter模式也叫解释器模式,是行为模式之一,它是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言,用来解释预先定义的文法。简单地说,Interpreter模式是一种简单的语法解释器构架。

ljtyzhr的专栏 583

大话设计模式--解释器模式

  解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。   如果一种特定类型的问题发生的频率够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。------正则表达式 转载于:https://www.cnblogs.com/nixuebing/p/42...

weixin_30291791的博客 72
上一篇: Auto Test User Guide
下一篇: 人生八宝
Findback
博客等级 码龄20年 35粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值