Lex与Yacc学习(五)之正则表达式篇

正则表达式语法

lex模式是由编辑程序和实用程序使用的正则表达式的扩展版本。正则表达式由常规字符(代表它们本身)和元字符(在一种模式中具有特殊含义)组成。

元字符

.

. 匹配除了换行符 \n 之外的任意单个字符

[]

[] 匹配括号中字符的任意一个。用“-”(短划线)指示字符的范围,例如[0-9]指10个数字中的任意一个。如果开括号之后的第一个字符是短划线或者闭括号,那么它就不能被解释为元字符。如果第一个字符是抑扬字符“ ^ ”,那么它的含义就变为匹配括号内字符以外的任意字符。除了以“ \ ”开始的C转义序列被识别以外,其他的元字符在方括号中没有特殊含义。

*

* 匹配前面正则表达式的零次或者多次出现。

+

+ 匹配前面正则表达式的一次或者多次出现。

?

? 匹配前面正则表达式的零次或者一次出现。例如: -?[0-9]+  指具有可选的前导或者一元减号的数字

{}

{} 意味着根据括号内部的不同而不同。单个数字{n}意味着前面的模式重复n次。例如: [A-Z]{3} 表示任意3个大写字母。

如果大括号包含的由逗号分开的两个数字{n,m},那么它们是前面模式重复的最小数和最大数。例如:A{1,3}表示字母A出现1次到3次。

如果第二个数字丢失就意味着无穷大,所以{1,}意味着 +    ;  {0,}意味着 *  。

如果大括号包含一个名字,它指示用那个名字来替换。

\

\ 转义符号,如果后面的字符是小写字母,那么它就是C转义序列。 例如制表位:\t

一些实现允许采用如“\123” 和 “\x3f” 这种形式的八进制和十六进制字符。

否则,“\” 引用后面的字符,所以 \* 匹配一个 * 号。

()

() 将一系列正则表达式归组。 *   +   {}   中的每一个都直接作用于它左侧的表达式,而且 |  通常同时影响左侧和右侧的内容。圆括号可以改变这种情况,

例如:(ab|cd)?ef  匹配 abef  或者 cdef 或者只是 ef

|

| 匹配前面的或者随后的表达式。

“...”

“...” 逐字匹配引号内的每个字符。不同于“\”的元字符会失去它的含义。

例如:“/*” 匹配两个字符 /*

/

/ 只有当有后面的表达式跟随时才匹配前面的表达式。

例如: 0/1 匹配字符串01中的0 但是不匹配字符串0或者02中的任何字符。

每个模式只允许有一个/ ,并且模式不能同时包含 / 和 $

^

^ 作为正则表达式的第一个字符,它匹配行的开始,它还在方括号中用于否定。

$

$ 作为正则表达式的最后一个字符,它匹配行的结束

<>

<> 位于模式开头的尖括号内的一个或者一列名字,使那个模式只应用于指定的起始状态。

《EOF》

《EOF》 只用于flex中,这个特殊模式匹配文件的结尾。

时间: 2024-10-29 08:35:15

Lex与Yacc学习(五)之正则表达式篇的相关文章

Lex与Yacc学习(一)之环境配置篇

Abstract 在开发程序的过程中经常会遇到文本解析的问题,例如:解析 C 语言源程序,编写 脚本引擎等等,解决这种文本解析的方法有很多,一种方法就是自己手动用 C 或者 C++直接编写解析程序,这对于简单格式的文本信息来说,不会是什么问题,但是 对于稍微复杂一点的文本信息的解析来说,手工编写解析器将会是一件漫长痛苦 而容易出错的事情.本系列文档就是专门用来由浅入深的介绍两个有名的 Unix 工 具 Lex 和 Yacc,并会一步一步的详细解释如何用这两个工具来实现我们想要的任何 功能的解析程

Lex与Yacc学习(九)之Yacc语法

Yacc语法 本文讨论yacc语法的格式并描述可用的各种特征和选项 yacc语法结构 yacc语法包括三部分:定义段.规则段和用户子例程段 ...定义段... %% ...规则段... %% ...用户子例程段... 各部分由以两个百分号开头的行分开,尽管某一个部分可以为空,但是前两部分是必须的,第三部分和前面的百分号可以省略. 符号 yacc 语法由符号组成,即语法的"词".符号是一串不以数字开头的字母.数字.句点和下划线.符号error专用于错误恢复,另外,yacc对任何符号都不会

Lex与Yacc学习(三)之符号表

符号表 列举单词表的方式虽然简单但是不全面,如果在词法分析程序运行时可以构建一个单词表,那么就可以在添加新的单词时不用修改词法分析程序. 下面示例便利用符号表实现,即在词法分析程序运行时从输入文件中读取声明的单词时允许动态的声明单词.声明以词性的名字开始,后面跟着要声明的单词. 添加符号表可以完全的改变词法分析程序,不必在词法分析程为每个要匹配的单词放置独立的模式,只要有一个匹配任意单词的模式,再查阅符号表就能决定所找到的词性. lex程序ch1-04.l %{ /* *带符号表的词法分析程序

Lex与Yacc学习(四)之Lex规范

Lex规范的结构 lex程序由三部分组成:定义段.规则段和用户子例程序段 ...定义段... %% ...规则段... %% ...用户子例程序段... 这些部分由以两个百分号组成的行分隔开.尽管某一部分可以为空,但前两部分是必须的,第三部分和前面的%%行可以忽略. 定义段 定义段包括文字块.定义.内部表声明.起始条件和转换. 以空白开头的行被逐字拷贝到C文件中,通常,这用于包含包围在/*和*/中的注释,一般前面有空白. 规则段 规则段包含模式行和C代码,以空白开始的行或者包围在%{和%}中的内

Lex与Yacc学习(八)之变量和有类型的标记(扩展计算器)

变量和有类型的标记 下一步扩展计算器来处理具有单个字母名字的变量,因为只有26个字母 (目前只关心小写字母),所以我们能在26个条目的数组(称它为vbltable)中存储变量. 为了使得计算器更加有用,也可以扩展它来处理多个表达式(每行一个)和使用浮点值. 具有变量和实值的计算器词法ch3-03.l %{ #include "ch3-03.tab.h" #include <math.h> extern double vbltable[26]; %} %% ([0-9]+|(

Lex与Yacc学习(七)之环境配置另一种方式

必备工具 flex-2.5.4a-1.exe   和  bison-2.4.1-setup.exe   以及 cygwin2.738 的安装文件,下载地址 http://download.csdn.net/detail/fly_yr/8385245 flex与bison安装 运行flex-2.5.4a-1.exe  和  bison-2.4.1-setup.exe 文件安装至D:\Software Files\GnuWin32下,然后按配置环境变量: 将路径 D:\Software Files\

初步学习lex和yacc

因为是非计算机本科,所以没有学编译原理,进来想补补课,于是买了本<自制编程语言>,里面介绍了lex和yacc工具,于是装起来试了下. 原来用工具来解析字符串还是挺方便的,以前知道正则以后,就觉得这东西很好,现在有了lex和yacc,把正则能做的事情又放大了,能够做更丰富的事情. 例如,写一个简单的把字符串里的数字相加,其他忽略的程序(说是简单是指功能,其实调通很不简单,哈哈,特别是把%type写成了%token的笔误后,纠结了很久) 下面贴上代码 test.l %{ #include <

Shell学习之结合正则表达式与通配符的使用(五)

Shell学习之结合正则表达式与通配符的使用 目录 通配符 正则表达式与通配符 通配符 通配符的使用 正则表达式 正则表达式 正则表达式的使用 通配符 正则表达式与通配符 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式. 通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find.cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来就行匹配. 通配符 符号 作用 * 匹配任何字符串/文本,包括空字符串:*代表任意字

ZMAN的学习笔记之Python篇:装饰器

年前工作事务比较繁琐,我只能用零碎的时间继续学习Python,决定开一个系列的博文,作为自己深入学习Python的记录吧.名字也取好了,就叫<ZMAN的学习笔记之Python篇>~开篇是关于装饰器的,春节假期码的字哈哈~就让我们开始吧! 本文的例子都是自己想的,如果不是很合适,请大家提出宝贵意见哈~谢谢啦! 一.为什么要用“装饰器” 比如我们写了如下一段代码: # 打印0~99 def func(): for i in range(100): print(i) 我们想要监测执行这个函数花费了多