flex词法分析器 - flex文件格式

news/2025/3/6 21:37:49/文章来源:https://www.cnblogs.com/xiaobing3314/p/18756537

第三章输入文件的格式
flex输入文件由三部分组成,以只包含”%%”的行分隔。
definitions
%%
rules
%%
user code
3.1 定义段的格式
定义段包含简单名称定义的声明,以简化扫描程序规范,以及启动条件的声明,这些将在后面的部分中解释。
名称定义有如下形式:
name definition
“name”是一个以字母或下划线(“”)开头的单词,后面跟着0个或多个字母、数字、””、或”-”(破折号)。定义从名称后面的第一个非空白字符开始,一直到行尾。随后可以使用{name}引用定义,它将展开为(definition)。例如:
DIGIT [0-9]
ID [a-z][a-z0-9]*
将DIGIT定义为匹配单个数字的正则表达式,将ID定义为匹配字母后跟0个或多个字母或数字的正则表达式。后面提到的
{DIGIT}+"."{DIGIT}*
等效为:
([0-9])+"."([0-9])*
匹配一个或多个数字后面跟着’.’的0个或多个数字的浮点数。
无缩进注释(即以’/’开头的行)被逐字复制到输出中,直到下一个’/’。
任何缩进的文本或包含在’%{’和’%}’中的文本也会被逐字复制到输出中(删除’%{’和’%}’符号)。’%{’和’%}’符号必须在行上不缩进。
%top块类似于’%{’’...’’%}’块,除了%top块中的代码被重新定位到生成文件的顶部,在任何flex定义之前(实际上,yyIN_HEADER是在’%top’块之前定义的)。当您希望定义某些预处理宏或在生成代码之前包含某些文件时,%top块非常有用。单个字符{和}用于分隔%top块,如下例所示:
%top{
/* This code goes at the "top" of the generated file. /
#include <stdint.h>
#include <inttypes.h>
}
允许使用多个%top块,并且保留它们的顺序。
3.2 规则的格式
flex输入的规则部分包含了一系列这样的规则:
pattern action
其中pattern必须不缩进,动作必须从同一行开始。有关模式和操作的进一步描述,请参阅模式章节。
在规则部分,任何出现在第一个规则之前的缩进或%{ %}封闭的文本都可以用来声明扫描程序的局部变量,以及(在声明之后)在扫描程序进入时执行的代码。规则部分中的其它缩进或%{ %}文本仍然被复制到输出中,但其含义没有明确定义,并且很可能导致编译时错误(该特性是为了POSIX兼容性而存在的,参见lex和posix,了解其它类似的特性)。
任何缩进的文本和包含在%{ %}中的文本将逐字复制到输出中(删除%{和%}符号)。%{和%}符号必须在行上不缩进。
3.3 用户代码段格式
用户代码部分只是逐字复制到lex.yy.c中。它用于调用扫描器或被扫描器调用的函数。这个部分的存在是可选的,如果缺少,也可以跳过输入文件中的第二个”%%”。
3.4 输入中的注释
flex支持C风格的注释,也就是说/
/之间的任何内容都被认为是注释。每当flex遇到注释时,它就将整个注释逐字复制到生成的源代码中。注释可能出现在任何地方,但有以下例外:
注释可能不会出现在flex期望正则表达式的规则部分。这意味着注释可能不会出现在一行的开头,或者紧跟在扫描器状态列表之后。
注释不能出现在定义部分的%option行上。
如果你想遵循一个简单的规则,那么总是在新行开始注释,在初始/
之前使用一个或多个空白字符。该规则在输入文件的任何地方都适用。
以下示例中的所有注释都是有效的:
%{
/* code block */
%}

/* Definitions Section */
%x STATE_X

%%
/* Rules Section /
ruleA /
after regex / { / code block / } / after code block /
/
Rules Section (indented) /
<STATE_X>{
ruleC ECHO;
ruleD ECHO;
%{
/
code block /
%}
}
%%
/
User Code Section */

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

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

相关文章

数据集蒸馏论文阅读

Dataset Distillation 18年的论文,最早提出数据蒸馏的概念 理论 通常的梯度下降是小批量的 SGD,每次都需要从训练数据中选一个 minibatch 来更新。这篇文章的重点是学习到一个合成数据 \(\hat x=\{\hat x_i\}_{i=1}^M\) 和学习率 \(\hat \eta\),这样我们就可以固定梯度下降的…

数据蒸馏论文阅读

Dataset Distillation 18年的论文,最早提出数据蒸馏的概念 理论 通常的梯度下降是小批量的 SGD,每次都需要从训练数据中选一个 minibatch 来更新。这篇文章的重点是学习到一个合成数据 \(\hat x=\{\hat x_i\}_{i=1}^M\) 和学习率 \(\hat \eta\),这样我们就可以固定梯度下降的…

激活函数汇总

激活函数 激活函数是用来加入非线性因素的,因为线性模型的表达能力不够。 Sigmoid (1) 公式:\(S(x)=\frac{1}{1+e^{-x}}\) (2) 函数图:(3) 缺点: ① 输出值落在(0,1)之间,期望均值为0.5,不符合均值为0的理想状态 ② 该函数存在一正一负两块“死区”(死区:梯度计算为0,…

深入探究C语言内存分配系列函数

深入探究C语言内存分配系列函数 目录深入探究C语言内存分配系列函数内存是什么?内存分配的三种方式为什么要学习动态分配的系列函数?四大内存分配函数前置知识malloc与freemallocfreerealloccallocDeepseek的总结 当我们完成一个程序设计时,需要对其背后的底层原理学习 操作…

第一课 引言与词向量

对于文字的意义,语言学家有很多种定义。其中一种定义运用在自然语言处理中非常有用,这种意义的定义见下分布式语义就是看上下文词来决定单词的意义。于是我们可以利用词向量来衡量两个词之间的相似程度,词的意义被分散在词向量的每一维中 词嵌入之所以叫词嵌入,是因为我们给…

2025.03.06 CW 模拟赛 A. 岛屿

题面 & 题解 A. 岛屿 概率期望会不了一点. 思路 假设我们最开始有 \(a\) 个「蓝蓝 / 红红」链, \(b\)​ 个「蓝红」链. 我们考虑对于每一个「蓝红」链向外连边. 如图, 我们将红点向外连向一条「蓝蓝」链, 由于每一个点只能最多向外连一条边, 那么它们就「合成」了一条蓝蓝链…

日报202535

今天总算是把项目组的事情解决了,于是正式开了Springboot+vue的学习,用了一晚上的时间配置好了环境(更新了JDK与Maven,重新设置了idea的设置) 然后了解了springboot的配置文件和基本使用,跑出了第一个spring的网页。这看着真有意思吧感觉比jsp方便不少。

Java SPI机制使用

1. Service Provider Interface SPI描述接口提供者优先规定接口要求,然后交由具体的实现者对接口进行内容的实现;2. 实现 //1. 定义接口 public Interface Demo_interface{//具体实现者必须要实现的内容void doexcute(); } //2.实现接口 public class Demo_Impl implements D…

互联网寒冬下,如何写好一份.NET求职简历?附带简洁免费的简历模板!!!

前言 在当今互联网行业的寒冬时期,每一位求职者都面临着更为激烈的竞争环境,如何在众多.NET候选人中脱颖而出,成为企业心仪的对象,用心准备一份简历显得尤为重要。简历不仅是个人职业经历的简要概述,更是向潜在雇主、HR展示你专业技能、项目经验、个人特质以及求职诚意的关…

注册github

今天成功注册了github账户,并上传了一个小项目。

HarmonyOS Next 属性动画和转场动画

HarmonyOS Next 属性动画和转场动画 在鸿蒙应用开发中,动画是提升用户体验的关键要素。通过巧妙运用动画,我们能让应用界面更加生动、交互更加流畅,从而吸引用户的注意力并增强其使用粘性。鸿蒙系统为开发者提供了丰富且强大的动画开发能力,其中属性动画是整个动画体系的核…