Flex2.5用户手册(一)
名称:
flex – 快速词法分析器生成器(fast lexical analyzer generator)
摘要:
flex [-bcdfhilnpstvwBFILTV78+? -C[aefFmr] -ooutput -Pprefix -Sskeleton] [--help --version] [filename ...]
本手册将介绍flex,一个用于生成基于文本进行模式匹配的程序的工具。
本手册包括指南和参考两部分:
1.Flex概要
2.简单的例子
3.Flex的输入文件格式
4.模式
flex使用扩展的正规表达式
5.输入是如何被匹配的
规则决定了什么需要匹配
6.动作
用于指定当模式匹配后执行的操作
7.扫描器的生成
关于Flex生成的词法扫描器的细节;
如何控制输入源;
8.开始条件(Start Conditions)
将上下文(context)概念引入到生成的扫描器中
管理微型扫描器(mini-scanners)
9.多个输入缓冲区(Multiple Input Buffers)
如何使用多个输入源;
如何使字符串扫描代替文件扫描
10.文件结束规则(End-of-file Rules)
用于匹配输入结束的特殊规则
11.其它相关宏定义
可用于动作中的宏的汇总
12.用户可以使用的值
在动作中使用的值的汇总
13.和Yacc的接口
连接flex扫描器和yacc语法分析器
14.选项
flex的命令行选项和"%option"指令
15.性能考虑
如何让你的扫描器尽可能得快
16.生成 C++ 扫描器
生成C++扫描器类的功能(实验性的)
17.与Lex和POSIX的不兼容性
flex 与AT&T lex以及POSIX lex 标准的区别
18.诊断
由flex(或flex生成的扫描器)产生的错误并不明显
19.文件
flex使用的文件
20.flex的不足之处和它的Bugs
了解flex存在的问题
21.参阅
其它文档以及相关的工具
22.作者
联系方式
flex是一个用于生成扫描器的工具,扫描器可识别文本中的词法模式。flex从给定的文件中读取,或者从标准输入中读取(当没有给定文件时)有关要生成的扫描器的说明。这种说明的格式是一对正规表达式和C代码,称之为规则。flex的输出是名为lex.yy.c的C源程序,在lex.yy.c中定义了一个名为yylex()的函数。lex..yy.c可以被编译,并使用-lfl链接选项同flex库链接,以生成可执行文件。执行该文件,它会分析它的输入,察看是否满足正规表达式,只要它发现一个,就会执行相应的C代码。
首先介绍一些简单的例子来演示如何使用flex。下面的flex输入规范定义了一个扫描器,每当它遇到字符串“username”时,就要用户的登陆名替换掉该字符串。
%%
username printf( "%s", getlogin() );
默认情况下,任何被该扫描器匹配的文本都被拷贝到输出中,因此该扫描器的作用就是将它的输入内容拷贝到输出中,当遇到“username”时将其扩展。在本例中,输入中只有一个规则。“username”就是一个模式而“printf”就是该模式对应的动作。“%%”表示规则的开始。
在看另外一个例子:
int num_lines = 0, num_chars = 0;
%%
/n ++num_lines; ++num_chars;
. ++num_chars;
%%
main()
{
yylex();
printf( "# of lines = %d, # of chars = %d/n",
num_lines, num_chars );
}
这个扫描器统计输入中的字符数和行数(除了最后报告统计结构,它不产生其他输出)。第一行声明了两个全局变量,”num_lines”和”num_chars”,yylex()和在第二个” %%”后定义的main()均可访问这两个全局变量。该扫描器有两个规则,一个匹配一个换行符(”/n”)如果匹配则累加num_lines和num_chars,另一个规则匹配除换行符之外的任何字符(由正规表达式”.”表示)。
一个稍微复杂点的例子:
/* scanner for a toy Pascal-like language */
%{
/* need this for the call to atof() below */
#include <math.h>
%}
DIGIT [0-9]
ID [a-z][a-z0-9]*
%%
{DIGIT}+ {
printf( "An integer: %s (%d)/n", yytext,
atoi( yytext ) );
}
{DIGIT}+"."{DIGIT}* {
printf( "A float: %s (%g)/n", yytext,
atof( yytext ) );
}
if|then|begin|end|procedure|function {
printf( "A keyword: %s/n", yytext );
}
{ID} printf( "An identifier: %s/n", yytext );
"+"|"-"|"*"|"/" printf( "An operator: %s/n", yytext );
"{"[^}/n]*"}" /* eat up one-line comments */
[ /t/n]+ /* eat up whitespace */
. printf( "Unrecognized character: %s/n", yytext );
%%
main( argc, argv )
int argc;
char **argv;
{
++argv, --argc; /* skip over program name */
if ( argc > 0 )
yyin = fopen( argv[0], "r" );
else
yyin = stdin;
yylex();
}
这个例子是一个针对类Pascal语言的扫描器的雏形,它可识别不同类型的记号(token)并且能报告它看到的东西。
接下来的部分将解释这个例子的细节。

Flex是一个用于生成词法分析器的工具,它读取规则(正规表达式和C代码)并生成C源代码,定义了yylex()函数。本文档介绍了Flex的使用,包括简单示例、输入文件格式、模式匹配、动作、扫描器生成、开始条件、多个输入缓冲区、与Yacc的接口等。
3937

被折叠的 条评论
为什么被折叠?



