Flex是一个生成词法分析器的工具,它可以利用正则表达式来生成匹配相应字符串的C语言代码,其语法格式基本同Lex相同。
单词的描述称为模式(Lexical Pattern),模式一般用正规表达式进行精确描述。FLEX通过读取一个有规定格式的文本文件,输出一个C语言源程序。
FLEX的输入文件称为LEX源文件,它内含正规表达式和对相应模式处理的C语言代码。LEX源文件的扩展名习惯上用.l表示。FLEX通过对源文件的扫描自动生成相应的词法分析函数int yylex(),并将之输出到名规定为lex.yy.c的文件中。实用时,可将其改名为lexyy.c。该文件即为LEX的输出文件或输出的词法分析器。也可将int yylex()加入自已的工程文件中使用。
LEX对源文件的格式要求非常严格,比如若将要求顶行书写的语句变成非顶行书写就会产生致命错误。而LEX本身的查错能力很弱,书写时一定注意。
LEX的源文件由三个部份组成,每个部分之间用顶行的“%%”分割,其格式如下:
定义部份
%%
规则部份
%%
用户附加C语言部份
模式宏定义实际是对识别规则中出现的正规式的辅助的影。如语言的字母可定义为:
Letter [a-zA-Z]
数字可以定义为:
digit[0-9]
除宏定义外,定义部分的其余代码必须用符号%{ 和 %} 括起来。另外,flex使用的C语言库文件和外部变量以及部分声明的函数,也应分别置于%{ 和 %} 之内。
写一个简单基本.l文件如下;flextest.l;
%{
#include "stdio.h"
#include "stdlib.h"
void print();
int _tmain(int argc,_TCHAR*argv[]);
int num_digit=0,num_letter=0,num_enter=0;
%}
DIGIT [0-9]
LETTER [A-Za-z]
%%
{DIGIT} {num_digit++;}
{LETTER} {num_letter++;}
%%
int _tmain(int argc, _TCHAR* argv[])
{
yyin=fopen("ccx_test1.c","r");
yylex();
printf("num=%d,letter=%d,enter=%d",
num_digit,num_letter,num_enter);
return 0;
}
int yywrap()
{
return 1;
}
然后生成C语言代码;如果.l文件语法有错则通不过;最后生成lex.yy.c;可将此文件用到自己工程中;
由此.l文件生成的c语言文件非常大,有46k之多;
就是自己编写自己需要的词法规则,然后生成词法分析器C代码,用到自己工程中;可干多种事情;参阅此,
https://blog.csdn.net/bcbobo21cn/article/details/106193648