Lex学习笔记——规范

news/2024/11/24 22:27:57/

lex是构建词法分析程序的工具,词法分析程序把随机输入流标记化(tokenize),即,将它拆分成词法标记。当编写lex规范时,可以创建lex匹配输入所用的一套规则。每次匹配一个模式时,lex程序就调用你提供的C代码来处理被匹配的文本。lex程序把lex规范转化为包含C例程yylex()的文件,程序可以调用yylex()来运行词法分析程序。

lex规范

lex规范由三部分组成:定义段、规则段和用户子例程段。
定义段:处理lex用在词法分析程序中的选项,并且一般建立词法分析程序运行的执行环节。由"%{"和“%}”扩住的部分是C代码,它们将被逐字地拷贝到词法分析程序中。这些C代码一开始即被放入输出代码中,所以这里包含的定义部分可以由规则段中的代码引用。lex提供了一种简单的替换机制,使定义长的或复杂的模式变得容易。
%%
规则段:每个规则都由两个部分组成-模式和动作,由空白分开。模式是UNIX样式的正则表达式,即由工具(例如grep、sed和ed)使用的相同表达式的扩展版本。lex的多数版本将模式后的所有语句当做一个动作,而另一些版本只读取行的第一条语句并且默默地忽略其他的语句。如果动作包含多条语句或多个行,为了安全起见通常使用大括号。
%%
用户子例程段:包含任何有效的C代码,被逐字拷贝到生成的词法分析程序中。

Lex函数
yylex:这个函数开始分析工作,它由lex自动生成
yywrap:这个函数在文件(或输入)的末尾调用,如果函数的返回值是1,就停止解析。因此它可以用来解析多个文件,代码可以写在第三段,这样就能够解析多个文件。方法是使用yyin文件指针,指向不同的文件,直到所有的文件都被解析。最后,yywrap可以返回1来表示解析的结束
yyless:这一函数可以用来送回除了前n个字符外的所有读出标记
yymore:这一函数告诉lexer将下一个标记附加到当前标记后

lex生成的扫描器在成功识别模式后,通过lex变量存储该模式对应的值,并将其返回给上层调用者
yyin:FILE类型,指向lexer正在解析的当前文件
yyout:FILE
类型,指向记录lexer输出的位置,缺省情况下,yyin和yyout都指向标准输入和输出
yytext:匹配模式的文本存储在这一变量中(字符串类型)
yyleng:给出匹配模式的长度
yylineno:提供当前的行数信息(某些lex的实现不支持)

示例

单词计数示例的定义段如下:

%{
unsigned charCount = 0, wordCount = 0,  lineCount = 0;
%}word [^ \t\n]+
eol \n

单词计数示例的规则段如下:

%%
{word} {wordCount++; charCount+=yyleng;}
{eol} {charCount++; lineCount++;}
. charCount++;

yyleng是lex的内部变量,表示词法分析程序识别的字符串长度。
单词计数示例的用户子例程段:

main()
{yylex();printf("%d %d %d\n", lineCount, wordCount, charCount);
}

http://www.ppmy.cn/news/221521.html

相关文章

32线镭神雷达跑LeGO-LOAM:3D 激光SLAM

32线镭神雷达跑LeGO-LOAM:3D 激光SLAM 安装LeGO-LOAM镭神雷达的相关修改LeGO-LOAM的修改修改utility.h修改imageproject.cpp Enjoy youself跑rosbag实时在线建图 序 最近老板给了个镭神的32线雷达让我搞一下3D SLAM,决定跑一下LeGO-LOAM。但是LeGO-LOAM…

xorl %eax, %eax

这是GNU的汇编 xorl %eax, %eax(这句起什么作用) 按位异或,相同的位置为0,不同的位置为1,eax和eax的每一位都相同,所以相当于清零。 movl 8(%ebp), %ecx testl %ecx, %ecx(这句起什么作…

lex(flex)yacc(bison)

初始配置 文法分析用Flex(Lex):将数据分隔成一个个的标记token (标示符identifiers,关键字keywords,数字numbers, 中括号brackets, 大括号braces, 等等etc.)语法分析用Bison(Yacc): 在分析标记的时候生成抽象语法树. Bison 将会做掉几乎所有的这些工作, …

Windows下安装lex(flex)与yacc(bison)

上完第一节编译原理,Mr李要求这周自己探索一下lex和yacc这两个工具。 查了一下lex与yacc是两个在Unix下的分别作词法分析和语法分析的工具,都说很强大。而他俩在linux下又有对应的东西叫flex与bison。虽然硬盘上装了ubuntu但是不怎么用,linu…

ElasticSearch7.X和ElasticSearch8.X学习记录

ElasticSearch7 倒排索引 数据写入时,建立关键字和主键的映射,查询时–>关键字–>主键–>对应文章 分片 因为ES是以检索为主的产物,为了便于查询,会将数据进行分片,例如:根据性别分片,当查询女…

【ESXi 7.x内部升级】ESXi 升级 —— 小版本升级(7.X或8.X版本内升级)

目录 4. 小版本升级(7.X或8.X版本内升级)4.1 示例 — 使用 vSphere Lifecycle Manager升级 ESXi目标:将 VMware ESXi 7.0 U2e 升级为 7.0 U3f(1)在vSphere Client 中查看需要升级的 ESXi 版本(2&#xff09…

如何使用lex

第一次在blog上粘代码时觉得很郁闷,缩进变得很短,关键字也没有颜色变化(当然这么简单的用复制粘贴也只能是这种效果)后来自己用c#做了个小程序,用来在代码里贴上html标签。折腾里一个晚上,费了不少劲。第二…

yylex使用

%{#include <stdio.h>#include <stdlib.h>int num_num 0;int num_id 0; %} INTEGER [-]?[1-9][0-9]* ID [a-zA-Z][a-zA-Z_0-9]* SPACE [ \n\t] %% {INTEGER} { num_num;printf("(num %d)\n", atoi(yytext));/*打印数字值*//*数字数加一*/ }{ID} { nu…