linux flex是什么

linux中,flex是一个词法分析工具,能够识别文本中的词法模式;Flex读入给定的输入文件,如果没有给定文件名的话,则从标准输入读取,从而获得一个关于需要生成的扫描器的描述。

linux flex是什么

本教程操作环境:linux5.9.8系统、Dell G3电脑。

flex:词法分析器

flex是一个词法分析器。用来将一个.l文件生成一个.c程序文件。即生成一个词法分析器。然后读取输入,和正则表达式匹配,再执行相应的动作,实现了程序的功能。我们可以发现flex实现在程序外部就可以接受输入的功能。

Flex是一个生成扫描器的工具,能够识别文本中的词法模式。Flex 读入给定的输入文件,如果没有给定文件名的话,则从标准输入读取,从而获得一个关于需要生成的扫描器的描述。此描述叫做规则,由正则表达式和 C代码对组成。Flex 的输出是一个 C 代码文件——lex.yy.c——其中定义了yylex() 函数。编译输出文件可以生成一个可执行文件。当运行可执行文件的时候,它分析输入文件,为每一个正则表达式寻找匹配。当发现一个匹配时,它执行与此正则表达式相关的C代码。Flex 不是GNU工程,但是GNU为Flex 写了手册。

用法

安装 flex

sudo apt-get install flex//或者下载相应版本的安装文件安装

然后新建一个文本文件,输入以下内容:

%%[0-9]+  printf("?");#       return 0;.       ECHO;%%int main(int argc, char* argv[]) {    yylex();    return 0;}int yywrap() {     return 1;}

将此文件另存为 hide-digits.l 。注意此文件中的 %% 必须在本行的最前面(即 %% 前面不能有任何空格)。

之后,在终端输入:

flex hide-digits.l

此时目录下多了一个 “lex.yy.c” 文件,把这个 C 文件编译并运行一遍:

 gcc -o hide-digits lex.yy.c./hide-digits

然后在终端不停的敲入任意键并回车,可以发现,敲入的内容中,除数字外的字符都被原样的输出了,而每串数字字符都被替换成 ? 了。最后敲入 # 后程序退出了。如下:

eruiewdkfjeruiewdkfj1245?fdsaf4578fdsaf?...#

当在命令行中运行 flex 时,第二个命令行参数(此处是 hide-digits.l )是提供给 flex 的分词模式文件, 此模式文件中主要是用户用正则表达式写的分词匹配模式,用flex 会将这些正则表达式翻译成 C 代码格式的函数 yylex ,并输出到 lex.yy.c 文件中,该函数可以看成一个有限状态自动机。

当在命令行中运行 flex 时,第二个命令行参数(此处是 hide-digits.l )是提供给 flex 的分词模式文件, 此模式文件中主要是用户用正则表达式写的分词匹配模式,用flex 会将这些正则表达式翻译成 C 代码格式的函数 yylex ,并输出到 lex.yy.c 文件中,该函数可以看成一个有限状态自动机。

下面再来详细解释一下 hide-digits.l 文件中的代码,首先第一段是:

%%[0-9]+  printf("?");#       return 0;.       ECHO;%%

flex 模式文件中,用%% 和 %%做分割, 上面分割的内容被称为 规则(rules),本文件中每一行都是一条规则,每条规则由 匹配模式(pattern) 和 事件(action) 组成, 模式在前面,用正则表达式表示,事件在后面,即 C 代码。每当一个模式被匹配到时,后面的 C 代码被执行。

flex 会将本段内容翻译成一个名为 yylex 的函数,该函数的作用就是扫描输入文件(默认情况下为标准输入),当扫描到一个完整的、最长的、可以和某条规则的正则表达式所匹配的字符串时,该函数会执行此规则后面的 C 代码。如果这些 C 代码中没有 return 语句,则执行完这些 C 代码后, yylex 函数会继续运行,开始下一轮的扫描和匹配。

当有多条规则的模式被匹配到时, yylex 会选择匹配长度最长的那条规则,如果有匹配长度相等的规则,则选择排在最前面的规则。

int main(int argc, char *argv[]) {    yylex();    return 0;}int yywrap() { return 1; }

第二段中的 main 函数是程序的入口, flex 会将这些代码原样的复制到 lex.yy.c 文件的最后面。最后一行的 yywrap 函数, flex 要求有这么一个函数。

示例

HTML+CSS+jQuery实现Flex悬停滑块 HTML+CSS+jQuery实现Flex悬停滑块

一款HTML+CSS+jQuery实现的Flex悬停滑块特效

HTML+CSS+jQuery实现Flex悬停滑块 131 查看详情 HTML+CSS+jQuery实现Flex悬停滑块

word-spliter.l

%{#define T_WORD 1int numChars = 0, numWords = 0, numLines = 0;%}WORD([^ tnra]+)%%n{ numLines++; numChars++; }{WORD}{ numWords++; numChars += yyleng; return T_WORD; }<>{ return 0; }.{ numChars++; }%%int main() {int token_type;while (token_type = yylex()) {printf("WORD:t%sn", yytext);}printf("nCharstWordstLinesn");printf("%dt%dt%dn", numChars, numWords, numLines);return 0;}int yywrap() {return 1;}

本例中使用到了 flex 提供的两个全局变量 yytext 和 yyleng,分别用来表示刚刚匹配到的字符串以及它的长度

编译执行

flex word-spliter.lgcc -o word-spliter lex.yy.c./word-spliter < word-spliter.l输出:WORD:       %{WORD:       #define...WORD:       }Chars       Words   Lines470 70      27

可见此程序其实就是一个原始的分词器,它将输入文件分割成一个个的 WORD 再输出到终端,同时统计输入文件中的字符数、单词数和行数。此处的 WORD 指一串连续的非空格字符。

扩展

(1) 列出所需的所有类型的 token;

(2) 为每种类型的 token 分配一个唯一的编号,同时写出此 token 的正则表达式;

(3) 写出每种 token 的 rule (相应的 pattern 和 action )。

第 1 类为单字符运算符,一共 15 种:

+ * - / % = , ; !  ( ) { }

第 2 类为双字符运算符和关键字,一共 16 种:

=, ==, !=, &&, ||void, int, while, if, else, return, break, continue, print, readint

第 3 类为整数常量、字符串常量和标识符(变量名和函数名),一共 3 种。

拓展后

%{#include "token.h"int cur_line_num = 1;void init_scanner();void lex_error(char* msg, int line);%}/* Definitions, note: 42 is '"' */INTEGER             ([0-9]+)UNTERM_STRING       (42[^42n]*)STRING              (42[^42n]*42)IDENTIFIER          ([_a-zA-Z][_a-zA-Z0-9]*)OPERATOR            ([+*-/%=,;!(){}])SINGLE_COMMENT1     ("//"[^n]*)SINGLE_COMMENT2     ("#"[^n]*)%%[n]                { cur_line_num++;                       }[ tra]+          { /* ignore all spaces */               }{SINGLE_COMMENT1}   { /* skip for single line comment */    }{SINGLE_COMMENT2}   { /* skip for single line commnet */    }{OPERATOR}          { return yytext[0];         }   "="                { return T_Ge;              }"=="                { return T_Eq;              }"!="                { return T_Ne;              }"&&"                { return T_And;             }"||"                { return T_Or;              }"void"              { return T_Void;            }"int"               { return T_Int;             }"while"             { return T_While;           }"if"                { return T_If;              }"else"              { return T_Else;            }"return"            { return T_Return;          }"break"             { return T_Break;           }"continue"          { return T_Continue;        }"print"             { return T_Print;           }"readint"           { return T_ReadInt;         }{INTEGER}           { return T_IntConstant;     }{STRING}            { return T_StringConstant;  }{IDENTIFIER}        { return T_Identifier;      }<>             { return 0; }{UNTERM_STRING}     { lex_error("Unterminated string constant", cur_line_num);  }.                   { lex_error("Unrecognized character", cur_line_num);        }%%int main(int argc, char* argv[]) {    int token;    init_scanner();    while (token = yylex()) {        print_token(token);        puts(yytext);    }    return 0;}void init_scanner() {    printf("%-20s%sn", "TOKEN-TYPE", "TOKEN-VALUE");    printf("-------------------------------------------------n");}void lex_error(char* msg, int line) {    printf("nError at line %-3d: %snn", line, msg);}int yywrap(void) {    return 1;}

上面这个文件中,需要注意的是,正则表达式中,用双引号括起来的字符串就是原始字符串,里面的特殊字符是不需要转义的,而双引号本身必须转义(必须用 ” 或 42 ),这是 flex 中不同于常规的正则表达式的一个特性。

除单字符运算符外的 token 的编号则在下面这个 token.h 文件,该文件中同时提供了一个 print_token 函数,可以根据 token 的编号打印其名称。

#ifndef TOKEN_H#define TOKEN_Htypedef enum {    T_Le = 256, T_Ge, T_Eq, T_Ne, T_And, T_Or, T_IntConstant,    T_StringConstant, T_Identifier, T_Void, T_Int, T_While,    T_If, T_Else, T_Return, T_Break, T_Continue, T_Print,    T_ReadInt} TokenType;static void print_token(int token) {    static char* token_strs[] = {        "T_Le", "T_Ge", "T_Eq", "T_Ne", "T_And", "T_Or", "T_IntConstant",        "T_StringConstant", "T_Identifier", "T_Void", "T_Int", "T_While",        "T_If", "T_Else", "T_Return", "T_Break", "T_Continue", "T_Print",        "T_ReadInt"    };    if (token < 256) {        printf("%-20c", token);    } else {        printf("%-20s", token_strs[token-256]);    }}#endif

makefile

out: scannerscanner: lex.yy.c token.hgcc -o $@ $<lex.yy.c: scanner.lflex $<

1.png

相关推荐:《Linux视频教程》

以上就是linux flex是什么的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/262796.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 09:33:29
下一篇 2025年11月4日 09:34:48

相关推荐

  • 如何在 VS Code 中解决折叠代码复制问题?

    解决 VS Code 折叠代码复制问题 在 VS Code 中使用折叠功能可以帮助组织长代码,但使用复制功能时,可能会遇到只复制可见部分的问题。以下是如何解决此问题: 当代码被折叠时,可以使用以下简单操作复制整个折叠代码: 按下 Ctrl + C (Windows/Linux) 或 Cmd + C …

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • 常用的Flex布局属性有哪些

    flex布局的常用属性有哪些,需要具体代码示例 Flex布局是一种用于设计响应式网页布局的强大工具。它通过使用一组灵活的属性,可以轻松控制网页中元素的排列方式和尺寸。在本文中,我将介绍Flex布局的常用属性,并提供具体的代码示例。 display:设置元素的显示方式为Flex。 .container…

    2025年12月24日
    000
  • position布局与flex布局的比较与选择

    position布局与flex布局的比较与选择 在前端开发中,页面布局是一个非常重要的部分,它决定了页面元素的位置和排列方式。在CSS中,有多种方式可以实现页面布局,其中两种常见的方式是position布局和flex布局。本文将从比较和示例两方面来介绍这两种布局方式的特点,以便读者在实际开发中能够灵…

    2025年12月24日
    000
  • CSS 自适应布局属性指南:flex 和 grid

    CSS 自适应布局属性指南:flex 和 grid 简介:在现代web开发中,响应式设计已经成为了一个不可忽视的设计趋势。为了适应各种不同的屏幕大小和设备类型,CSS 提供了一些布局属性,其中两种最常用的方式是 flexbox 和 grid。本文将介绍这两种属性的使用方法,包括具体的代码示例。 一、…

    2025年12月24日
    000
  • CSS 弹性布局属性详解:flex 和 justify-content

    CSS 弹性布局属性详解:flex 和 justify-content 在现代的网页设计中,弹性布局(flexbox)成为了一种非常有用的布局方式。弹性布局允许我们轻松地创建自适应且灵活的布局,以适应各种屏幕尺寸和设备类型。两个核心属性 flex 和 justify-content 在弹性布局中扮演…

    2025年12月24日
    000
  • CSS 表格布局属性解读:table 和 display

    CSS 表格布局属性解读:table 和 display 在前端开发中,表格布局是常用的一种布局方式。CSS提供了一些表格布局属性,其中最常用的是table和display属性。下面将详细解读这两个属性,并给出具体的代码示例。 一、table 属性 table是CSS中用于设置元素为表格布局的属性。…

    2025年12月24日
    000
  • CSS 自适应布局属性优化技巧:flex 和 grid

    CSS 自适应布局属性优化技巧:flex 和 grid 在现代Web开发中,实现自适应布局是一项非常重要的任务。随着移动设备的普及和屏幕尺寸的多样化,确保网站在各种设备上都能良好地展示,适应不同的屏幕尺寸,是一个必不可少的要求。幸运的是,CSS提供了一些强大的属性和技巧来实现自适应布局。本文将重点介…

    2025年12月24日
    000
  • 详解Css Flex 弹性布局及其应用技巧

    详解CSS Flex 弹性布局及其应用技巧 引言:弹性布局(Flex)是CSS3中引入的一种新的布局模型,它能够让容器中的子元素自动调整大小和位置以适应不同的容器大小。使用Flex布局可以快速实现复杂的网页布局,并且具有良好的响应性能。 一、Flex布局的基本概念Flex布局由容器和子元素组成,容器…

    2025年12月24日
    000
  • 如何使用Css Flex 弹性布局实现响应式图片轮播

    如何使用Css Flex 弹性布局实现响应式图片轮播 在现代的网页设计中,响应式设计变得越来越重要。当我们设计一个网站或者应用程序时,我们希望它能够适应不同屏幕尺寸的设备,无论是手机、平板还是桌面电脑。 图片轮播是一个常见的网站组件,它可以用来展示多张图片的滑动效果。在本文中,我们将介绍如何使用Cs…

    2025年12月24日 好文分享
    000
  • 如何通过Css Flex 弹性布局实现表单元素的自适应布局

    如何通过CSS Flex 弹性布局实现表单元素的自适应布局 引言:随着移动设备的普及和多样化,以及响应式网页设计的发展,为了让网页在不同设备上有良好的显示效果,设计师和开发者们需要考虑如何实现元素的自适应布局。CSS Flex 弹性布局为我们提供了一个简单而灵活的解决方案。本文将介绍如何通过 CSS…

    2025年12月24日
    000
  • 详解Css Flex 弹性布局在音乐播放器设计中的应用

    详解CSS Flex 弹性布局在音乐播放器设计中的应用 在现代Web开发中,CSS弹性布局(Flex布局)已成为一种常用的布局技术。它为我们提供了一种简单而灵活的方式来实现可伸缩性和响应性强的界面设计。音乐播放器是一个经典的案例,可以借助Flex布局来实现良好的用户界面和交互体验。本文将详细介绍CS…

    2025年12月24日
    000
  • 如何通过Css Flex 弹性布局实现滑动菜单效果

    如何通过CSS Flex弹性布局实现滑动菜单效果 在网页设计中,滑动菜单是一种常见的交互效果,它可以让网页更加流畅和美观。本文将教你使用CSS Flex弹性布局来实现这一效果,并提供具体的代码示例。 CSS Flex是一种新的布局方式,可以方便地实现各种复杂的布局效果。它通过设置容器和子元素的属性来…

    2025年12月24日
    000
  • 如何使用Css Flex 弹性布局创建分页导航条

    如何使用 CSS Flex 弹性布局创建分页导航条 CSS Flex 弹性布局是一种灵活且强大的布局方式,可以帮助我们在分页导航条的设计中轻松实现适应不同屏幕大小和设备的布局效果。本文将介绍如何使用 CSS Flex 弹性布局来创建一个简单的分页导航条,并提供具体的代码示例。 首先,我们需要准备一些…

    2025年12月24日
    000
  • 详解Css Flex 弹性布局中的网格间距与边框处理方法

    标题:详解CSS Flex弹性布局中的网格间距与边框处理方法 引言:CSS Flex弹性布局是一种现代的页面布局方式,可以使网页在不同的屏幕尺寸下自动适应,并且具有灵活性和响应性。在使用CSS Flex弹性布局时,我们经常会遇到需要设置网格间距和边框的情况。本文将详细介绍CSS Flex弹性布局中的…

    2025年12月24日
    000
  • 如何使用CSS3的flex特性,优化网页排版效果?

    如何使用CSS3的flex特性,优化网页排版效果? 现如今,网页设计已经成为了一种艺术。在过去,我们使用传统的盒模型和浮动布局来实现网页排版效果,但是这种方法有很多限制,并且在不同设备上显示效果不一致。而CSS3的flex特性则为我们提供了一种更为灵活和强大的方式来布局网页。本文将为大家介绍如何使用…

    2025年12月24日
    000
  • 一文详解CSS3中的Flex布局

    本篇文章带大家了解一下css3中的flex布局,希望对大家有所帮助! 简介 什么是Flex布局 Flex是Flexible Box 的缩写,也称为弹性盒子布局。 Flex布局组成: flex容器(flex container)flex项(flex items)主轴(main axis)交叉轴(cro…

    2025年12月24日 好文分享
    000
  • 带你吃透Flex布局的三个属性:flex-grow、flex-shrink、flex-basis

    本篇文章带大家深入了解css flex布局的三个属性:flex-grow、flex-shrink、flex-basis,希望对大家有所帮助! 【推荐学习:css视频教程、web前端】 在我们日常开发中,flex布局可以说是家常便饭,对于很多的我们来说(你懂得^_^),可能我们用的比较多的应该就是垂直…

    2025年12月24日 好文分享
    000
  • 手把手带你使用CSS Flex和Grid布局实现3D骰子(附代码)

    在前端面试中,经常会问到如何使用 css 实现骰子/麻将布局。下面本篇文章给大家介绍一下用css 创建一个 3d 骰子(flex和grid布局实现3d骰子)的方法,希望对大家有所帮助! 通过本文可以学到: 使用transform来实现3D形状;给 3D 骰子实现旋转动画;使用 Flex 布局来实现骰…

    2025年12月24日 好文分享
    100
  • flex是css属性吗

    flex是css属性。css flex属性是flex-grow、flex-shrink和flex-basis属性的简写属性,用于设置或检索弹性盒模型对象的子元素如何分配空间;如果元素不是弹性盒模型对象的子元素,则flex属性不起作用。 本教程操作环境:windows7系统、CSS3&&amp…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信