原文在:https://blog.csdn.net/hczhiyue/article/details/20483209

文章中给的一个定义很明白,对于初学者来说很有帮助:

什么是 FLEX?它是一个自动化工具,可以按照定义好的规则自动生成一个 C 函数 yylex(),也成为扫描器(Scanner)。这个 C 函数把文本串作为输入,按照定义好的规则分析文本串中的字符,找到符合规则的一些字符序列后,就执行在规则中定义好的动作(Action)。

Flex 文件就是一个文本文件,内容包括定义好的一系列词法规则。文件的命名习惯上以小写字母 l(L) 来作为文件后缀。如果为了清晰,也可以用. flx 或者. flex 作为文件的后缀名。

有几个很重要的地方,之前自己在做的时候没有注意过,特别是关于语言的格式(缩进等):

  1. 如果在 Flex 文件中没有提供 main() 函数的定义,那么这个 C 文件中不会有 main() 函数。此时单独编译这个 C 文件的时候,一定要加上 - lfl 的连接库参数;若提供了 main() 函数,就不必要提供这个连接库参数了。连接库 libfl 提供了一个缺省的 main 函数。缺省的 main() 函数中只是简单地调用 yyflex() 函数,而自己提供的 main() 函数则可以根据需要加入许多其他的处理代码。
  2. 规则由模式 (pattern) 和动作 (action) 两个部分组成。模式就是一个正则表达式,FLEX 加入了一些自己的扩展。而动作一般就是一些 C 语句。模式指出了一个单词是如何构成的,当分析出一个符合该规则的单词时,就执行相应的动作。
    模式一定要位于一行的开头处,不能有缩进。动作的开头一定要与模式在同一行当动作是用一对花括号 {} 括起来时,可以将左花括号放在与规则相同的行,而其余部分则可以从下一行开始。
  3. 所有用户代码都被原样拷贝到文件 lex.yy.c 中。
  4. 在定义段或者规则段中,任何一行有缩进的文本或者包含在一对 %{和 %} 之间(在书写时 %{和 %} 都必须在一行的开始处,不能缩进。)的文本,都被原样拷贝到最后生成的 C 代码文件中(当然 %{和 %} 会被移走)。
  5. 在规则段中,第一条规则之前的任何未缩进的文本或者在 %{和 %} 之间的文本,可以用来为扫描器声明一些本地变量和代码(由上一条可知,他们是会进入C代码文件中的)。一旦进入扫描器的代码,这些代码就会被执行。规则段内其他的缩进的文本或者 %{和 %} 之间的文本还是被原样拷贝输出,但是他们的含义是尚未有明确定义,很可能引起编译时(compile-time)错误
  6. 在定义段中,没有缩进的注释也会被原样拷贝到最后生成的 C 代码文件中,例如以 /* 开始的一行注释,直到遇到 */,这中间的文本会被原样拷贝输出。

除此之外,当初我在学习时写了一个示例程序,用来帮助理解flex文件格式:

 %{
#include <stdio.h>
int nchar, nword, nline; /*声明部分,确定要包括的库文件,以及要声明的变量,这部分将来会直接翻译到c文件中*/
%}/*辅助定义部分,辅助定义部分可包含:正规式的辅助定义(内部使用、不与输入进行匹配)、入口定义、LEX选项等.*/
%option yylineno /*yylineno可以提供当前的行数信息,是Lex内置的变量之一*/
TYPEID [A-Z]+[_A-Za-z0-9]*
OBJECTID [a-z]+[_a-zA-Z0-9]* STR_CONST \".*\"
INT_CONST [0-9]+ WHITE [ \t]+
LINE \n %s MutiCom/*多重入口的声明,存放在辅助定义中,以关键字%start或%x开始,其后可以跟若干个被声明的入口,如:%start entry1 entry2 ...(特点:与0入口不互斥)*/
%%
/*翻译规则部分
*注释不能顶格写*/
[ \t] /* 匹配到一个空格或Tab键,不反映 */
\n {nline++; } /* 匹配到一个换行符,行数加1 */
[^ \t\n]+ {
/* 匹配到一个不包括空格、Tab键和换行符的字,
字数加1,字符数加yyleng(字符长度) */
nchar+=yyleng;
nword++;
} %%
/*用户自定义程序部分*/
int main()
{
printf("Press CTRL+d to quit.\nInput any text:\n");
yylex(); /* 调用词法分析器,直到输入结束 */
printf("nchar=%d, nword=%d, nline=%d\n", nchar, nword, nline);
return 0;
} /* 函数yywrap是LEX提供的一个库函数
* 若生成可执行程序时没有链接LEX库,则必须手工定义
* 反之,生成可执行程序时必须如此:
* cc -o a.out lex.yy.c -ll # for LEX
* cc -o a.out lex.yy.c -lfl # for FLEX
* 其中-ll表示连接函数库libl.a(in UNIX)
*/
// int yywrap(){ return 1; }

[转载]Flex的文件规则的更多相关文章

  1. CSV文件规则

    CSV文件规则 1 开头是不留空,以行为单位.2 可含或不含列名,含列名则居文件第一行.3 一行数据不跨行,无空行.4 以半角逗号(即,)作分隔符,列为空也要表达其存在.5 列内容如存在半角逗号(即, ...

  2. [转载]flex中的正则表达式

    原文:https://blog.csdn.net/hczhiyue/article/details/20483209 (1)单字符匹配* ‘x’ 匹配字符 x.* ‘.’ 匹配任意一个字符(字节),除 ...

  3. [git] ignore文件规则失效

    背景 在某次项目,发现已经将.iml规则写进.ignore文件,但是对.iml的修改依然会出现在changelist中. 解决方案 先引用git官网上的描述 gitignore - Specifies ...

  4. 应注意的Flex&Bison潜规则

    1.Flex的二义性模式 语法分析器匹配输入时匹配尽可能多的字符串 如果两个模式都可以匹配的话,匹配在程序中更早出的模式. 针对这一点的理解,在语法分析文件当中,token的识别,应从特殊到一般的过程 ...

  5. [转载] linux中文件描述符fd和文件指针flip的理解

    转载自http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...

  6. xsd文件规则和语法

    1.简介 XSD即XML结构定义, XML Schemas Definition.其本身就是用xml描述的, 且遵循xml语法规则.一份XML schema文件描述了XML文档的结构. 基本规则:   ...

  7. .gitignore文件规则不起效的解决办法

    在一个项目里面,多少会有一些文件是不需要上传到git上面的,比如node的依赖模块node_modules,这个文件夹超过10000个文件,大小也超过80M.所以,一个.gitignore文件省不了, ...

  8. 转载: Flex 布局教程

    demo:页面二等分 .flex-box { display: -webkit-flex; /* Safari */ display: flex; flex-direction: row; justi ...

  9. 【转载】Git忽略规则和.gitignore规则不生效的解决办法

    原文:https://www.cnblogs.com/zhangxiaoliu/p/6008038.html Git忽略规则: 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 ...

随机推荐

  1. Qt 串口通信 高速发送出错的解决方法总结

    使用网上的qextserialport-1.2类,自行开发多线程串口通信.开发的过程中,出现两个问题:   问题1:我用信号槽跨线程调用串口类MyCom 发送和接收数据,中间运行的时候,会内存错误,Q ...

  2. kotlin class

    每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托.委托到同一个类的另一个构造函数用 this 关键字即可 class Person { constructor(pare ...

  3. pytorch-mnist神经网络训练

    在net.py里面构造网络,网络的结构为输入为28*28,第一层隐藏层的输出为300, 第二层输出的输出为100, 最后一层的输出层为10, net.py import torch from torc ...

  4. 指定pip清华源

    临时指定: pip install cefpython3 -i https://pypi.tuna.tsinghua.edu.cn/simple 一直使用:pip的配置文件为%HOME%/pip/pi ...

  5. Jmeter联机负载时报错: connection refused to host localhost,nested exception is:java.net ConnectException:Connection refused:connect

    Jmeter联机负载时报错: connection refused to host localhost,nested exception  is:java.net ConnectException:C ...

  6. [转]Java Jacob操作Excel

    Jacob项目:https://sourceforge.net/projects/jacob-project/ 转自:https://blog.csdn.net/ZY_extreme/article/ ...

  7. curl配置host

    //要配置的虚拟域名$host = array( 'Host: demo-local.com' );$ch = curl_init();//要配置的ip 例如本机localhostcurl_setop ...

  8. SqlServer:SqlServer(服务器磁盘监控,创建管理员账号分配权,添加链接服务器,查询CPU,查询内存)

    1.服务器磁盘监控 (1)总链接服务上开启所有链接服务器的RPC: ----------------------总链接服务器上面,开启每个服务器的RPC --exec sp_serveroption ...

  9. 【JAVA系列】使用JavaScript实现网站访问次数统计代码

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[JAVA系列]使用JavaScript实现网站 ...

  10. unity+android权限--打开应用不弹权限,动态请求权限

    因为笔者之前的游戏需要分享图片,会请求外部储存,第一次打开游戏就会出现弹窗: 很多人对这个很敏感,怕你访问到他们的照片隐私,看到这个权限就拒绝,甚至卸载,实际上我们只是想截屏游戏内容分享给其他玩家,但 ...