其他分享
首页 > 其他分享> > Lex&Yacc之我的兄弟叫Flex&Bison 第一章 实现我的第一个Flex!

Lex&Yacc之我的兄弟叫Flex&Bison 第一章 实现我的第一个Flex!

作者:互联网

前面的话:在此之前,如果我接到一个解析文本的工作,我会逐行读取并存储我想要的数据再去处理数据。最近,工作中需要去解析verilog代码,大概浏览了github,给我这个没有学过编译原理的人指出了一条明路:yacc&lex,或者,flex&bison。

我的目标:以后如果碰到需要解析的工作,一个下午搞定。

本系列文章:我写这个系列的博客主要是记录收获的知识和踩过的坑,初学者的缘故,并不对其他人具有指导意义。当然,也可能你也和我有相同的问题或者感想,我们可以好好讨论一下。


经典的lex和yacc由贝尔实验室在20世纪70年代开发,flex和bsion是他们的现代版本。

第一章:实现我的第一个Flex!

1、词法分析和语法分析

解析工作通常可以分成两个部分:词法分析(lexical analysis 或者 scanning)和语法分析(syntax analysis 或者 parsing)。简单的说,词法分析是将输入分割成为一个个有意义的词块,成为记号(token),而语法分析是确定这些记号如何彼此关联的。下例所示:

A = B + C ;

词法分析器会将上面的例子拆分成 A、等号、B、加号、C、分号。语法分析器会确定B + C是一个表达式,并且表达式结果赋予给了A。

2、正则表达式

字符 含义
A-Z,0-9,a-z 构成了部分模式的字符和数字
. 匹配任意字符,除了\n
- 用来指定范围。例如:A-Z指从A到Z之间的所有字符
[] 一个字符集合。匹配括号内的任意字符。如果第一个字符是^那么它表示否定模式。例如:[abC]匹配a,b,C中的任何一个
* 匹配0个或者多个上述的模式
+ 匹配1个或者多个上述模式
? 匹配0个或者1个上述模式
$ 作为模式的最后一个字符匹配一行的结尾
{} 指出一个模式可能出现的次数。例如:A{1,3}表示A可能出现1次或者3次
\ 用来转义元字符。同样用来覆盖字符在此表中定义的特殊意义,只取字符的本意
^ 否定
| 表达式间的逻辑或
"<一些符号>" 字符的字面含义。元字符具有
/ 向前匹配。如果在匹配的模板中的"/"后跟有后续表达式,只匹配模板中"/"前面的部分。如:如果输入A01,那么在模板A0/1中的A0是匹配的
() 将一系列常规表达式分组

 

标签:Flex,语法分析,字符,模式,Yacc,Bison,匹配,词法,表达式
来源: https://www.cnblogs.com/zhangzhangtabszj/p/14744520.html