lex/flex 笔记

Lex的匹配策略:

1. 按最长匹配原则确定被选中的单词

2. 如果一个字符串能被若干正规式匹配,则先匹配排在前面的正规式。

lex源程序的写法:Lex源程序必须按照Lex语言的规范来写,其核心是一组词法规则(正规式)。一般而言,一个Lex源程序分为三部分,三部分之间以符号%%分隔。

定义段

%%

词法规则段

%%

辅助函数段

Lex源程序中常用到的变量及函数:

yyin和yyout:这是Lex中本身已定义的输入和输出文件指针。这两个变量指明了lex生成的词法分析器从哪里获得输入和输出到哪里。默认:键盘输入,屏幕输出。

yytext和yyleng:这也是lex中已定义的变量,直接用就可以了。

yytext:指向当前识别的词法单元(词文)的指针 yyleng:当前词法单元的长度。

ECHO:Lex中预定义的宏,可以出现在动作中,相当于fprintf(yyout, “%s”,yytext),即输出当前匹配的词法单元。

yylex():词法分析器驱动程序,用Lex翻译器生成的lex.yy.c内必然含有这个函数。

yywrap():词法分析器遇到文件结尾时会调用yywrap()来决定下一步怎么做: 若yywrap()返回0,则继续扫描  若返回1,则返回报告文件结尾的0标记。

1. 用lex翻译器编译lex源程序命令(假设filename.l是lex源程序名): flex filename.l

2. 用gcc编译器编译lex翻译器生成的c源程序(lex翻译器生成的c源程序名固定为 lex.yy.c): gcc [-o outfile] lex.yy.c –lfl

其中,-lfl是链接flex的库函数的,库函数中可能包含类似yywrap一类的标准函数。-o outfile是可选编译选项,该选项可将编译生成的可执行程序命名为outfile,如果不写该编译选项,默认情况下生成的可执行程序名为a.exe(linux下实际为a.out)。

3. 调用词法分析器yylex()的main函数可以写在lex源程序的辅助函数部分,也可以写在 其他的c文件中。如果main函数写在main.c中,则编译时需要和lex.yy.c一起编译链接,即编译链接命令为:gcc [-o outfile] lex.yy.c main.c –lfl

 1 %{
 2 /***********
 3     Sexy Lexy
 4 ***********/
 5 %}
 6 %%
 7 a+b*a {printf("1%s\n",yytext);}
 8 (ab)+c? {printf("2%s\n",yytext);}
 9 aa {printf("3%s\n",yytext);}
10 (a|b)*c {printf("4%s\n",yytext);}
11 %%
12 int main() {
13     yyin = stdin;
14     return yylex();
15 }

ababcbacaabaababaa
2ababc
4bac
1aaba
2abab
1aa

时间: 2024-08-05 20:03:22

lex/flex 笔记的相关文章

编译原理实战——使用Lex/Flex进行编写一个有一定词汇量的词法分析器

编译原理实战--使用Lex/Flex进行编写一个有一定词汇量的词法分析器 by steve yu 2019.9.30 参考文档:1.https://blog.csdn.net/mist14/article/details/486413492.https://wenku.baidu.com/view/1c6398903868011ca300a6c30c2259010202f3a4.html 1.Flex工具的概述 Flex工具是生成C语言的工具,我们在日常生活中,如果直接使用C语言进行编写词法分析

Flex笔记_MX DataGrid、列表和树

ListBase 和 AdvancedListBase 所有的MX List都是从 ListBase 和 AdvancedListBase 派生出来的. 属性: columnCount.columnWidth.dataProvider.iconField.iconFunction.labelField.labelFunction. lockedColumnCount.lockedRowCount.rowCount.rowHeight.selectable.selectedIndex. selec

Flex笔记_格式化数据

格式化程序(formatter) 是一类对象,它们可以接收原始数据,并将其转换为可展示的格式. 用法上同验证器在实现机制上比较类似. 应用模式有下列两种: 实时格式化: 脚本式格式化 用法简单,输入原始数据,就会输出结构清晰,容易认读的格式化数据. 内置的格式化程序 Formatter 所有专用格式化程序的父类,可以作为其它格式化程序的模板. format函数:接收一个需要被格式化的对象,返回string类型的结果. error属性 NumberFormatter 用来处理数值表示的细节,如小数

Flex笔记_处理用户输入

Form标签 在Flex中,Form标签的意义仅限于布局我们称之为控件的UI组件. id属性 MXML的id属性是ActionScript访问组件所包含值的重要途径. 示例:使用id属性访问控件的值 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library

Flex笔记_验证用户输入

内置验证器 Flex提供了很多内置的验证器,它们都是Validator类的子类. Flex以扩展Validator类的方式创建了内置验证器,以用于满足常用需求. Validator组件的重要属性和函数: enabled:Boolean类型,决定是否启用验证功能 required:Boolean类型,是否必填 requiredFieldError:String类型,设置显示给用户的消息 source:Object,设置想要验证的对象(组件) property:String,设置想要验证的对象属性

css3 flex笔记整理

flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器".它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目". 一.容器的属性 flex-direction flex-direction: row | row-reverse | column | column-revers

Flex 笔记整理 三

1. Panel, TitleWindow PopUpManager 透明 用一个类,这个类里引用一个组件, P如 Panel, TitleWindow等, 利用PopUpManager来弹出显示.    可能显示的都为透明窗体.    这时要引用从引用主主程序传进来的this (Sprite) 对象. 2. Flash Builder 保存修改构建空间 很久的问题 在FB 工具窗口的 项目菜单下,取消掉 自动构建 ,     要启动时按F11 即可,    如果运行调试时,老是只在 57% 时

Go语言(golang)开源项目大全

转http://www.open-open.com/lib/view/open1396063913278.html内容目录Astronomy构建工具缓存云计算命令行选项解析器命令行工具压缩配置文件解析器控制台用户界面加密数据处理数据结构数据库和存储开发工具分布式/网格计算文档编辑器Encodings and Character SetsGamesGISGo ImplementationsGraphics and AudioGUIs and Widget ToolkitsHardwareLangu

如何写一个解释器(1):编译原理

最近在看DSL的东西,对于外部DSL,写一个解释器是必不可少的.我试图归纳一下我学到的,以写一个解释器为目标,讲一下如果来实现一个可用的解释器.一个解释器通常可以分为一下几个阶段: 词法分析(Lexer) 语法分析(Parser, BNF, CFG, AST) 语义分析(AST的处理, annotated AST) 目标语言生成(stack-based) 这里的解释器不包括目标语言的执行和运行时环境,如果需要类似于python/ruby的解析执行器的话,还需要bytecode-compiler,