linux终端lex程序运行,lex的简单使用

Lex & Flex 简介

Lex是lexical compiler的缩写,是Unix环境下非常著名的工具, Lex (最早是埃里克·施密特和 Mike Lesk 制作)是许多 UNIX 系统的标准词法分析器(lexical analyzer)产生程式,而且这个工具所作的行为被详列为 POSIX 标准的一部分。

Lex的基本工作原理为:由正则表达式生成NFA,将NFA变换成DFA,DFA经化简后,模拟生成词法分析器。

Lex 主要功能是生成一个词法分析器(scanner)的 C 源码,描述规则采用正则表达式(regular expression)。描述词法分析器的文件 *.l 经过lex编译后,生成一个lex.yy.c 的文件,然后由 C 编译器编译生成一个词法分析器。词法分析器,简言之,就是将输入的各种符号,转化成相应的标识符(token),转化后的标识符很容易被后续阶段处理,如Yacc 或 Bison,过程如图 :

bVbylrS?w=339&h=186

在linux系统上,我们最常用的是Flex,Flex (fast lexical analyser generator) 是 Lex 的另一个替代品。它经常和自由软件 Bison 语法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用C语言写成。Flex手册里对 Flex 描述如下:

FLEX (fast lexical analyzer generator) is a tool/computer program for generating lexical analyzers (scanners or lexers) written by Vern Paxson in C around 1987. It is used together with Berkeley Yacc parser generator or GNU Bison parser generator. Flex and Bison both are more flexible than Lex and Yacc and produces faster code.

Bison produces parser from the input file provided by the user. The function yylex() is automatically generated by the flex when it is provided with a .l file and this yylex() function is expected by parser to call to retrieve tokens from current/this token stream.

Lex & Flex 输入文件格式

Flex 的输入文件包含了三部分,分别是定义区(definitions)、规则区(rules)和用户代码区(user code)并且由单独占一行的两个连续的百分号("%%")分隔开:

definitions

%%

rules

%%

user code

下面对 Flex 输入文件的三个部分做出解释:

1 定义部分:定义部分包含变量的声明,正则定义,清单常量。在定义部分,文本放在“%{%}”括号中。用花括号括起来的所有内容都会直接复制到lex.yy.c文件中。

语法

%{

// Definitions

%}

2 规则部分:rules部分包含一系列规则,格式为:pattern action,并且模式 pattern 位于行首不能缩进,action 也应该起始于同一行,规则部分包含在“%% %%”中。

语法:

%%

pattern action

%%

下表显示了一些模式匹配。

Pattern

It can match with

[0-9]

all the digits between 0 and 9

[0+9]

either 0, + or 9

[0, 9]

either 0, ‘, ‘ or 9

[0 9]

either 0, ‘ ‘ or 9

[-09]

either -, 0 or 9

[-0-9]

either – or all digit between 0 and 9

[0-9]+

one or more digit between 0 and 9

[^a]

all the other characters except a

[^A-Z]

all the other characters except the upper case letters

a{2, 4}

either aa, aaa or aaaa

a{2, }

two or more occurrences of a

a{4}

exactly 4 a’s i.e, aaaa

.

any character except newline

a*

0 or more occurrences of a

a+

1 or more occurrences of a

[a-z]

all lower case letters

[a-zA-Z]

any alphabetic letter

w(x \

y)z

wxz or wyz

3 用户代码部分:这部分包含C语句和其他功能。我们还可以分别编译这些函数并使用词法分析器加载。

如何运行程序:

要运行该程序,首先应将其保存为扩展名.l或.lex。在终端上运行以下命令以运行程序文件。

步骤1:lex filename.l或lex filename.lex取决于扩展文件

步骤2:gcc lex.yy.c

步骤3:./ a.out

步骤4:在需要时将输入提供给程序

注意:按Ctrl + D或使用某些规则停止接受用户输入。请查看以下程序的输出图像以清除是否有疑问以运行程序。

简单例子

计算字符串中的字符数

/*** Definition Section has one variable

which can be accessed inside yylex()

and main() ***/

%{

int count = 0;

%}

/*** Rule Section has three rules, first rule

matches with capital letters, second rule

matches with any character except newline and

third rule does not take input after the enter***/

%%

[A-Z] {printf("%s capital letter\n", yytext);

count++;}

. {printf("%s not a capital letter\n", yytext);}

\n {return 0;}

%%

/*** Code Section prints the number of

capital letter present in the given input***/

int yywrap(){}

int main(){

// Explanation:

// yywrap() - wraps the above rule section

/* yyin - takes the file pointer

which contains the input*/

/* yylex() - this is the main flex function

which runs the Rule Section*/

// yytext is the text in the buffer

// Uncomment the lines below

// to take input from file

// FILE *fp;

// char filename[50];

// printf("Enter the filename: \n");

// scanf("%s",filename);

// fp = fopen(filename,"r");

// yyin = fp;

yylex();

printf("\nNumber of Captial letters "

"in the given input - %d\n", count);

return 0;

}

运行:

bVbylyP?w=533&h=243

查找读取文本所有整数

%{

/*

用flex写一个查找读取文本所有整数的程序

*/

int count = 0;

%}

%%

[+-]?[0-9]+ { count++; printf("%s\n", yytext); } /* Print integers */

\n {} /* newline */

. {} /* For others, do nothing */

%%

void main() {

yylex();

printf("Number count is %d\n", count);

}

int yywrap() {

return 1;

}

运行:

bVbylAY?w=568&h=180

参考文章:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内存page,Linux虚拟内存管理 - Page Table的作用

虚拟内存的作用:1.扩展实际有限的物理内存,当然这种扩展是虚拟的,比如物理内存512M,对于一个需要1G空间的进程来说,照样可以运行。这增加了操作系统是应用范围。2.使得进程中的数据空间增大,增大到多少与硬…

openoffice+linux+jodconverter+乱码,OpenOffice安装和转换乱码解决方案

前言:OpenOffice项目中用途:word转换pdfWindows安装、转换:安装包下载后一路OK就可以正常安装,转换没有问题Linux安装、转换:安装有分DEB包和RPM包,下面会说明各自安装方法在en_US.UTF-8 系统环境下会出现乱…

junit 参数化测试用例_JUnit:在参数化测试中命名单个测试用例

junit 参数化测试用例几年前,我写了有关JUnit参数化测试的文章 。 我不喜欢它们的一件事是JUnit使用数字命名了单个测试用例,因此,如果它们失败,您将不知道是哪个测试参数导致了失败。 以下Eclipse屏幕快照将向您展示我的意思&…

MX250和第三方Linux版区别,MX250和MX350哪个好一点,区别和差距在哪里?求推荐?_科技数码通...

MX350系列显卡使笔记本颜值变得更高,性能更强,更轻便,在轻便笔记本需求变得越来越大,但性能也要求越来越高,特别是在图像处理方面,这个时候MX系列的显卡便应运而生,其拥有者超低的功耗&#xff…

linux r包默认安装位置,R-Language(R语言或称r-project)的安装

1、R语言的简介R语言(r-project)是主要用于统计分析、绘图的语言和操作环境。2、配置yum源2.1、安装说明由于编译安装相对繁琐,故而安装使用repoforge的源解决,免去编译的麻烦。注意:请根据实际的系统OS版本选取合适的YUM源。2.3、rpmforge源…

aws s3 命令行_通过命令行界面使用AWS ElasticMapReduce

aws s3 命令行在本文中,我将通过使用EMR的CLI使用AWS MapReduce服务(称为ElasticMapReduce )。 使用EMR的过程可以大致分为三个步骤: 设置并填充S3存储桶 创建并运行EMR作业 从S3存储桶中获取结果 在开始这三个高级步骤之前&…

在5分钟内将Spring Boot作为Windows服务启动

最近,我不得不将Spring Boot应用程序部署为Windows服务,并且对使用winsw如此容易感到惊讶。 我之前曾写过关于使用procrun – Java程序作为Windows服务的文章 ,但是winsw更加容易 入门 Spring Boot文档的第59节是有关安装Spring Boot应用程序…

Android 画布画线,android实现一个简单的画布,可以用手指画线条。

满意答案wpdhc2016.07.05采纳率:49% 等级:7已帮助:359人public class DrawView extends View {Context mycontext;int toasttime 1000*60;boolean enabletoast true;//之前的坐标float preX;float preY;//路径private Path path;//画笔p…

设置html文字居中自动换行,CSS怎么设置文字自动换行?

CSS怎么设置文字自动换行?下面本篇文章就给大家介绍css设置文字(特别是连续的数字和英文)自动换行的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。关于换行问题,正常字符的换行是比较合理的,…

html霓虹灯效果图,HTML5 SVG+CSS3霓虹灯文字边框动画特效

【实例简介】【实例截图】【核心代码】使用SVG CSS实现动态霓虹灯文字效果#svgBox{[/b] width:100%;margin:100px auto;}.text{font-size: 64px;font-weight: bold;text-transform: uppercase;fill: none;stroke-width: 2px;stroke-dasharray: 90 310;animation: stroke 6s inf…

吉林省2021高考成绩排名查询,2021年吉林高考成绩排名查询系统,吉林高考位次排名表...

最近好多家长和考生留言,希望知道:吉林高考位次是什么?吉林高考位次与名次的区别?如何根据位次选大学?2020年吉林高考位次就是指考生高考成绩在全省同类考生中的位置。高考位次主要分为三大类:省市位次、区…

Picocli 2.0:类固醇上的Groovy脚本

Picocli 2.0增加了对其他JVM语言(尤其是Groovy)的支持。 当Groovy语言具有CliBuilder类的内置CLI支持时,为什么要使用picocli? 您可能会喜欢picocli的使用帮助,默认情况下会显示ANSI 颜色和样式 。 您可能喜欢的另一个…

angular字符串转成html,详解angular如何调用HTML字符串的方法

详解angular如何调用HTML字符串的方法前面的文章我们介绍过angular6.0的数据绑定,也就是前面页面如何调用后台的数据,我们接触到了调用普通数据——如:调用产品详情{{post.content}}。在使用中,我们会发现,如果按原来的…

html flash层级,解决FLASH遮住其他层元素问题

刚做了个幻灯片广告,产品人员需要在第一个位置放flash,然后其他的都是图片,但是幻灯片切换到第一张的时候,圆圈tab元素不见了,只有在谷歌浏览器下面正常,用firebug看是被flash盖住了,&#xff0…

prng伪随机数生成器_Java伪随机数生成器(PRNG)中的弱点

prng伪随机数生成器这将是Kai Michaelis,JrgSchwenk和我撰写的论文的总结,该论文在RSA Conference 2013的密码学家会议上发表 。 你可以得到我的演讲的幻灯片在这里和我们的全文在这里 。 我们对PRNG(主要是SecureRandom)附带的常…

五个使Java变得更好的功能

我偶然发现了Brian Goetz 提出的有关Java数据类的建议 ,立即意识到我也对如何使Java更好地成为一种语言有一些想法。 我实际上有很多,但这只是五个最重要的列表。 专制(2006),迈克贾奇(Mike Judge&#xf…

html选中列表整列变色,excel选中行变色完整代码和动画效果

内容提要:文章介绍excel选中行变色的效果以及实现选中行变色的VBA代码。在excel中如果行数过多,经常核对数据的准确性,容易错行跳行,所以才有本文的小技巧:excel选中行变色。当我们在excel工作表中,鼠标随便…

构造函数还是静态工厂方法?

我相信Joshua Bloch在他的非常好的书“ Effective Java”中首先说了它:与构造函数相比,静态工厂方法是实例化对象的首选方法。 我不同意。 不仅因为我相信静态方法是纯粹的邪恶,而且主要是因为在这种特殊情况下,它们伪装成好的方法…

html vue分页,Vue.js bootstrap前端实现分页和排序

写之前先抱怨几句。本来一心一意做.net开发的,渐渐地成了只做前端。最近项目基本都用java做后台,我们这些.net的就成了前端,不是用wpf做界面,就是用html写web页面。深知自己前端技术不足,以前虽说用asp.net前后台都做&…

计算机管理ap,如何设置AC功能管理无线AP

AC功能管理无线AP第一步、连接ap举例型号TL-ER6520G不同类型的AP供电方式可能有所差异,包括直流电源供电和网线供电(PoE供电)两种。如下[1] 直流电源供电使用自带的电源适配器给AP供电,要求AP安放位置必须有电源插座,优点是节省成本。按照拓扑…