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