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
%{
/***********
Sexy Lexy
***********/
%}
%%
a+b*a {printf("1%s\n",yytext);}
(ab)+c? {printf("2%s\n",yytext);}
aa {printf("3%s\n",yytext);}
(a|b)*c {printf("4%s\n",yytext);}
%%
int main() {
yyin = stdin;
return yylex();
}
ababcbacaabaababaa
2ababc
4bac
1aaba
2abab
1aa
lex/flex 笔记的更多相关文章
- flex笔记 - 基础
flex笔记 - 基础 文章中的所有图示代码都放在了github上: 阮一峰flex博客跟学代码 传统的布局解决方案,基于盒模型, 依赖 display, position, float属性来进行布局 ...
- 编译原理实战——使用Lex/Flex进行编写一个有一定词汇量的词法分析器
编译原理实战--使用Lex/Flex进行编写一个有一定词汇量的词法分析器 by steve yu 2019.9.30 参考文档:1.https://blog.csdn.net/mist14/artic ...
- Flex 笔记整理 三
1. Panel, TitleWindow PopUpManager 透明 用一个类,这个类里引用一个组件, P如 Panel, TitleWindow等, 利用PopUpManager来弹出显示. ...
- 一篇文章弄懂flex布局
壹 ❀ 引 谈到flex布局,我不知道有多少人跟我一样,在本能的想到justify-content:center与align-items:center两条属性之后,除此之外的其它属性居然显得格外陌生 ...
- GO语言的开源库
Indexes and search engines These sites provide indexes and search engines for Go packages: godoc.org ...
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- Linux软件安装为什么名字不一样
一.说安装 1.安装 yacc :# yum install byacc 2.安装 glib: :# yum install glibc 3.安装 wireshark :# yum install w ...
- 游戏引擎网络开发者的64做与不做(二A):协议与API
[编者按]在这个系列之前的文章"游戏引擎网络开发者的64做与不做(一):客户端方面"中,Sergey介绍了游戏引擎添加网络支持时在客户端方面的注意点.本文,Sergey则将结合实战 ...
- Centos 安装KScope1.6.2
准备工作:安装ctags graphviz,和cscope (可以用yum install来安装) 1.首先下载kscope,最好下载16.x的版本,这个最好的 下载kscope-1.6.2.tar ...
随机推荐
- 【译】 AWK教程指南 9读取命令行上的参数
大部分的应用程序都允许使用者在命令之后增加一些选择性的参数.执行awk时这些参数大部分用于指定数据文件文件名,有时希望在程序中能从命令行上得到一些其它用途的数据.本小节中将叙述如何在awk程序中取用这 ...
- 怎么保存退出vi编辑
按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi:w file 将修改另外保存到file中,不退出vi:w! 强制保存,不推出vi:wq 保存文件并退出vi:wq! 强制保存文件,并退出v ...
- HW6.29
public class Solution { public static void main(String[] args) { int count = 0; int[] card = new int ...
- HW6.25
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- POJ-3714 Raid 平面最近点对
题目链接:http://poj.org/problem?id=3714 分治算法修改该为两个点集的情况就可以了,加一个标记... //STATUS:C++_AC_2094MS_4880KB #incl ...
- CP-ABE环境配置
本环境配置步骤参考互联网: 1.安装m4 sudo apt-get install m4 2.安装gmphttp://gmplib.org/ 下载gmplib ./configure make ma ...
- java 内部类的使用
http://www.cnblogs.com/wenruo/p/5387995.html 内部类 就是在类中嵌套的另一个类. 非静态内部类 创建内部类的方式就是把类定义在外部类里面. class Ou ...
- 关于Java Collections API您不知道的5件事,第2部分
注意可变对象 java.util 中的 Collections 类旨在通过取代数组提高 Java 性能.如您在 第 1 部分 中了解到的,它们也是多变的,能够以各种方 式定制和扩展,帮助实现优质.简洁 ...
- ANT打包J2EE项目war包
1.下载并安装ant 2.安装ant步骤如下 .解压下载的zip包 .进入解压的目录,把bin目录放入系统变量PATH中. eg:E:\dev_tools\apache-ant-\bin .打开cmd ...
- SQL2008--SQL语句-存储过程-触发器-事务处理-基本语法-函数
环境 SQL2008 1.存储过程建立 库-可编程性-存储过程-右击“存储过程”-点击“新建存储过程” SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCRE ...