Lex和Yacc从入门到精通(2)--正则表达式篇

正则表达式在Unix/Liunx系统中起着非常重要的作用,在很大一部分的程序中都使用了正则表达式,可以这么说:“在Unix/Linux系统中,如果不懂正则表达式就不算会使用该系统”。本文中使用的Lex和Yacc都是基于正则表达式的应用,因此有必要用一篇文档的形式详细说明在Lex和Yacc中使用的正则表达式为何物!
其实正则表达式非常简单,用过DOS的人都知道通配符吧,说得简单一点,正则表达式就是稍微复杂一点的通配符。这里的正则表达式非常简单,规则非常少,只需要花上几分钟就可以记住。正则表达式的元字符列表如下:
元字符
匹配内容
.
除了换行符之外的任意字符
/n
换行符
*
0次或者多次匹配
+
1次或者多次匹配
?
0次或者1次匹配
^
行首
$
行尾
a|b
a或者b
(ab)+
ab的一次或者多次匹配
“a+b”
a+b(字面意思)
[]
一类字符
有了上面的元字符之后,就可以用上面的元字符表达出非常复杂的匹配内容出来,就像DOS名令中的通配符可以匹配多个指定规则的文件名一样。现在让我们看看上面的元字符的一些应用例子,列表如下:
表达式
匹配内容
abc
abc
abc*
abc abcc abccc abcccc ……
abc+
abcc abccc abcccc ……
a(bc)+
abcbc abcbcbc abcbcbcbc ……
a(bc)?
abc abcbc
[abc]
a b c其中之一
[a-z]
a b c d e f g… … z其中之一
[a/-z]
a – z 三个字符其中之一
[-az]
– a z 三个字符其中之一
[A-Za-z0-9]+
大小写字符和10个数字的一个或多个
[ /t/n]
空格,跳格,换行三者之一(空白符)
[^ab]
除了ab之外的任意字符
[a^b]
a ^ b 三者之一
[a|b]
a | b 三者之一
a|b
a b 两者之一
^abc$
只有abc的一行
 
注意*和+的区别,通配符只是匹配之前最近的元素,可以用小括号将多个元素括起来,整个括号括起来的整体可以看作是一个元素。那么通配符就可以匹配整个括号的内容了。
方括号表示的是一类字符,[abc]就是定义了只有abc三个字符的一类字符。这一点和abc不同,如果跟上通配符(*+?)的话,那么方括号就可以表示前面的任意的字符之一的一个字符的多个匹配,但是abc的话就只能是c的多个匹配了。说的更明白点就是DOS里面的通配符*表示的是任意字符的零个或者多个,而这里的方括号就是把DOS里面的任意字符类缩小为只有方括号表示的类了。另外还要注意连字符-在方括号中的意思,在方括号的中间表示“范围”的意思,而在首部则仅仅表示自己而已。
转义用/,这和C语言类似,另外还需要注意三个特殊的元字符(^ | $)的意义。‘^’放在方括号的首部表示“除了”的意思,在其他地方没有特别意义。‘|’不在方括号中表示“或者”,‘$’通常表示行尾。
 
通过上面的注释可以看出:使用正则表达式可以表示非常复杂的匹配内容,
 
作者: 胡彦 本框架是一个lex/yacc完整的示例,用于学习lex/yacc程序基本的搭建方法,在linux/cygwin下敲入make就可以编译和执行。 本例子虽小却演示了lex/yacc程序最常见和重要的特征: * lex/yacc文件格式、程序结构。 * 如何在lex/yacc中使用C++和STL库,用extern "C"声明那些lex/yacc生成的、要链接的C函数,如yylex(), yywrap(), yyerror()。 * 重定义YYSTYPE/yylval为复杂类型。 * 用%token方式声明yacc记号。 * 用%type方式声明非终结符的类型。 * lex正则表达式定义、识别方式。 * lex里用yylval向yacc返回属性值。 * 在yacc嵌入的C代码动作里,对记号属性($1, $2等)、和非终结符属性($$)的正确引用方法。 * 对yyin/yyout重赋值,以改变yacc默认的输入/输出目标。 * 如何开始解析(yyparse函数),结束或继续解析(yywrap函数)。 本例子功能是,对当前目录下的file.txt文件,解析出其中的标识符、数字、其它符号,显示在屏幕上。linux调试环境是Ubuntu 10.04。 总之,大部分框架已经搭好了,你只要稍加扩展就可以成为一个计算器之类的程序,用于《编译原理》的课程设计。 文件列表: lex.l: lex程序文件。 yacc.y: yacc程序文件。 main.hpp: 共同使用的头文件。 Makefile: makefile文件。 file.txt: 给程序解析的文本文件。 使用方法: 1-把lex_yacc_example.rar解压到linux/cygwin下。 2-命令行进入lex_yacc_example目录。 3-敲入make,这时会自动执行以下操作: (1) 自动调用flex编译.l文件,生成lex.yy.c文件。 (2) 自动调用bison编译.y文件,生成yacc.tab.c和yacc.tab.h文件。 (3) 自动调用g++编译、链接出可执行文件main。 (4) 自动执行main,得到如下结果:。 bison -d yacc.y g++ -c lex.yy.c g++ -c yacc.tab.c g++ lex.yy.o yacc.tab.o -o main id: abc id: defghi int: 123 int: 45678 op: ! op: @ op: # op: $ AllId: abc defghi 参考资料:《LexYacc从入门到精通(6)-解析C-C++包含文件》, http://blog.csdn.net/pandaxcl/article/details/1321552 其它文章和代码请留意我的blog: http://blog.csdn.net/huyansoft 2013-4-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值