Flex 学习笔记

importance
date
Jul 4, 2023
slug
flex学习笔记
status
Published
tags
编译
summary
Flex是一种基于正则表达式的词法分析器生成工具,其名称为"Fast Lexical Analyzer Generator"的缩写。它是GNU计划的一部分,因此也被称为Flex GNU。
type
Post

Definition

The definitions section contains declarations of simple name definitions to simplify the scanner specification, and declarations of start conditions, which are explained in a later section.
有点像c++或者c中的宏。
name definition
将“DIGIT”定义为匹配单个数字的正则表达式,“ID”定义为匹配一个字母后跟零个或多个字母或数字的正则表达式。随后用 {}进行引用
{DIGIT}+"."{DIGIT}*
与下面相同:
([0-9])+"."([0-9])*
 
使用 %{%} 使用多行定义,%{%} 必须单独成一行。
/**/ 用于comment
 

Rules

 

Patterns

 
notion image

Matched

当运行生成的扫描器时,它会分析输入,寻找与其模式匹配的字符串。如果找到多个匹配项,则选择匹配最多文本的项(对于尾部上下文规则,这包括尾部部分的长度,即使它将返回到输入中)。如果找到两个或更多长度相同的匹配项,则选择在输入文件中首先列出的规则。
一旦匹配确定,与匹配相对应的文本(称为token)将在全局字符指针 yytext 中提供,并且其长度在全局整数 yyleng 中提供。然后执行与匹配模式相对应的操作(参见操作),然后扫描剩余的输入以寻找另一个匹配。
如果找不到匹配项,则执行默认规则:将输入中的下一个字符视为匹配项并复制到标准输出。因此,最简单有效的输入是:
%%
生成一个扫描器,它只是将输入(逐个字符)复制到输出。
 

Actions

 
 

The Generated Scanner

flex 的输出是文件lex.yy.c,其中包含扫描例程 yylex() ,以及用于匹配标记的一些表格和辅助例程和宏。
每当调用 yylex() 时,它会从全局输入文件yyin(默认为stdin)中扫描标记。它会一直执行,直到遇到文件结束(此时返回值为0)或其中一个动作执行了 return 语句。
 
如果扫描器达到文件末尾,后续的调用将是未定义的,除非yyin指向一个新的输入文件(在这种情况下,扫描将从该文件继续),或者调用 yyrestart() 。 yyrestart() 接受一个参数,一个 FILE * 指针(如果您已经设置了 YY_INPUT 以从 yyin 以外的源进行扫描,则可以为NULL),并初始化yyin以从该文件进行扫描。实际上,只是将yyin分配给一个新的输入文件或使用 yyrestart() 来实现没有区别;后者可用于与以前版本的 flex 兼容,并且因为它可以用于在扫描过程中切换输入文件。它还可以通过使用yyin作为参数调用来丢弃当前的输入缓冲区;但最好使用 YY_FLUSH_BUFFER (参见操作)。请注意, yyrestart() 不会将起始条件重置为 INITIAL (参见起始条件)。
 
默认情况下(为了效率),扫描器使用块读取而不是简单的 getc() 调用从yyin中读取字符。可以通过定义 YY_INPUT 宏来控制其输入方式。调用 YY_INPUT() 的顺序是 YY_INPUT(buf,result,max_size) 。它的作用是将最多 max_size 个字符放入字符数组 buf 中,并在整数变量 result 中返回读取的字符数或常量 YY_NULL (在Unix系统上为0)以表示“EOF”。默认的 YY_INPUT 从全局文件指针yyin中读取。
 
scanner 将其输出写入yyout全局变量(默认为stdout),用户可以通过将其分配给其他指针来重新定义它。
 

Start Conditions

 

© songlinLife 2023 - 2025