lex 常用函数

news/2024/11/24 23:02:17/
yyleng
只要扫描程序匹配标记时,标记的文本就存储在以空字符终止的字符串yytext中,而且它的长度存储在yyleng中,yyleng中的长度与由strlen(yytext)返回的值是相同的。
yyless()
从与规则相关的代码中调用yyless(n),这条规则推回除标记开头的几个字符以外的所有字符。当决定标记之间边界的规则不方便表示为正则表达式时,它是很有用的
例:
\"[^"]\" {
if(yytext[yyleng-2]=='\\')
{
yyless(yyleng-1);
yymore();
}
else
{
.......
}
}
yyless()的另一用处是使用不同的其实状态的规则从新处理标记:
sometoken{BEGIN OTHER_STATE;yyless(0);}
yylex()
由lex创建的扫描程序的入口点yylex()。调用yylex()启动或者重新开始扫描。如果lex动作执行讲数值传递给调用的程序return,那么对yylex()的下次调用就从它的停止地方继续。
yylex()中的用户代码
规则段中的所有代码都被拷贝到yylex()。以空白开始的行被假定是用户代码。"%%"后的代码直接放置在接近扫描程序的开始处,在第一条执行的语句之前。
yymore()
可以从与规则相关的代码中调用yymore(),这条规则告诉lex给这个标记附加下一个标记
yytext
每当词法分析程序匹配标记时,标记的文本就存储在以空字符结尾的字符串yytext中
每次匹配一个新的标记时,就要替换yytext的内容,如果yytext的内容还要使用,通过strdup()或者自己申请内存来保存字符串拷贝,从而使字符串的拷贝拷贝位于刚刚分配的内存中。

strdup

原型:extern char *strdup(char *s);
  头文件:#include <string.h>
  用法:char *strdup(char *s);
  功能:复制字符串s
  说明:strdup()在内部调用了malloc()为 变量分配内存,当程序结束后,必须用free()释放相应的内存空间,否则会造成内存泄漏
  举例:
  // strdup.c
  //#include <syslib.h>
  #include <stdio.h>
  #include <string.h>
  int main()
  {
  char *s="Golden Global View";
  char *d;
  clrscr();
  d=strdup(s);
  printf("%s",d);
  free(d);
  getchar();
  return 0;
  }
  例
  CString sPath="d:\\1.jpg";
  LPTSTR str = strdup( sPath );
yywrap()
当词法分析程序遇到文件结尾时,它调用例程yywrap()来找出下一步要做什么,如果返回0,扫描程序继续扫描,如果返回1,扫描程序就返回报告文件结尾需标记。
lex库中yywrap()的标准版本总是返回1,如果yywrap()返回指示有更多的输入0,那么它首先需要调整指向新的文件yyin,可能使用fopen()。
起始状态
在定义段可以声明起始状态,也称起始状态条件或起始规则。起始状态用于限制某些规则的范畴,或者改变词法分析程序处理部分文件的方式。
没有起始状态的那些规则能应用于任何状态。
动作中的BEGIN语句设置了当前的起始状态。

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

相关文章

Lex学习笔记——规范

lex是构建词法分析程序的工具&#xff0c;词法分析程序把随机输入流标记化&#xff08;tokenize&#xff09;&#xff0c;即&#xff0c;将它拆分成词法标记。当编写lex规范时&#xff0c;可以创建lex匹配输入所用的一套规则。每次匹配一个模式时&#xff0c;lex程序就调用你提…

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

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

xorl %eax, %eax

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

lex(flex)yacc(bison)

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

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

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

ElasticSearch7.X和ElasticSearch8.X学习记录

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

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

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

如何使用lex

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