美文网首页
三. Flex进阶:需要了解的一些知识

三. Flex进阶:需要了解的一些知识

作者: Dakini_Wind | 来源:发表于2019-02-16 12:47 被阅读9次

参考:
词法分析器生成工具flex
词法分析器总结--flex&bison
词法分析生成器flex的选项

1. Flex的一些常见选项:

%option 7bit%option 8bit:指示flex生成一个7bit或8bit的扫描器与-7,-8 选项等价。
%option caseful%option case-sensitive:区分大小写,与-i相反。
%option case-insensitive%option caseless:忽略大小写,与-i选项等价。
%option debug:让生成的扫描器运行在debug模式,与-d选项等价。
%option yylineno:flex 生成的扫描器用全局变量yylineno 维护着输入文件的当前行编号。option lex-compat隐含有这个选项。
%option interactive:指示flex生成一个交互式的扫描器。交互式扫描器就是向前查看下一个匹配的token是什么。结果就是总向前多看了一个字符,即使是在扫描器已经看够了文本已经排除了token 的歧义。但向前查看给了扫描器强大的交互能力。与-I等价。
%option yylineno:记录符号所在行号。如果使用了%option lex-compat,则隐含地使用了该选项。
%option yywrap:如果没有设置(就如%option noyywrap),当扫描器遇到end-of-file 时,不会调用yywrap(),但简单的假定没有更多的文件可以扫描(直到用户把yyin 指向新的文件并再一次调用yylex())。
%option bison-bridge:生成的扫描器API能够被bision调用。API为与bision兼容而作了些小改变。
%option reentrant:生成可重用的扫描器API,这些API用于多线程环境。
%option c++:如果没有指定该选项,生成的扫描器.c文件是C语言格式的,指定后则生成C++文件。
%option array:yytext的类型由char *变为数组。
%option pointer:与--array, %option array相反。

2. 一些常用全局变量和宏

(1) FILE \*yyin,\*yyout:为指向字符输入和结果输出文件的指针。如用户未对其定义,则设为标准输入文件stdinstdout
(2)int yylex():为词法分析程序,它自动移动文件指针yyin和yyout。在定义模式动作时,用户可用return语句结束yylex(),return 必须返回一整数。由于yylex()的运行环境都是以全局变量的方式保存,因此,在下一次调用yylex()时,yylex()可从上次扫描的断点处继续 扫描,在语法分析时,可利用这一特性。若用户未定义相应的return语句,则yylex()继续分析被扫描的文件,直到碰到文件结束标志EOF。在读到 EOF时,yylex()调用int yywrap()函数(该函数用户必须提供),若该函数返回非0值,则yylex()返回0而结束。否则,yylex()继续对yyin指向的文件扫描。
(3) char *yytext:存放当前被识别的词形
(4) int yyleng:存放字符串yytext的长度
(5)int yywrap():参见(2)
(6) yymore():将当前识别的词形保留在yytext中,分析器下次扫描时的词形将加追加在yytext中。例模式定义如下
……
hello {printf(“%s!”,yytext);yymore();}
world {printf(“%s!”,yytext);}
……
当输入串为”helloworld”时,将输出”hello!helloworld!”
(7) yyless(int n):回退当前识别的词形中n个字符到输入
(8) unput(char c):回退字符c到输入,它将作为下一次扫描的开始字符
(9) input():让分析器从输入缓冲区中读取当前字符,并将yyin指向下一字符
(10) yyterminate():中断对当前文件的分析,将yyin指向EOF。
(11) yyrestart(FILE * file):重新设置分析器的扫描文件为file
(12) ECHO:将当前识别的字符串拷贝到yyout
(13) BEGIN:激活开始条件对应的模式
(14) REJECT:放弃当前匹配的字符串和当前的模式,让分析器重新扫描当前的字符串,并选择另一个最佳的模式再次进行匹配。

3. 条件模式

LEX提供控制模式在一定状态下使用的功能,称为条件模式。LEX首先在定义部份通过%start来定义条件句。在规则部份可通过宏
BEGIN 条件名 来激活条件。BEGIN INITIALBEGIN 0将休眠所有的条件模式,使分析器回到开始状态。
例:将输入文件中的单词”magic” 作如下处理:识别”magic”时,如”magic”所在行行首为字符’a’,则输出”first”;若为’b’,则输出”second”;否则,输出”magic”。如不用条件模式,LEX源文件可这样写:

%{int flag;}%
%%
^a {flag=’a’;ECHO;}
^b {flag=’b’;ECHO;}
/n {flag=0;ECHO;}
magic {
switch(flag)
{
case ‘a’:printf(“first”);break;
case ‘b’:printf(“second”);break;
default :ECHO;break;
}
}
%%

如使用条件模式,则上述源文件可简化为

%start AA BB CC
%%
^a {ECHO;BEGIN AA;}
^b {ECHO;BEGIN BB;}
/n {ECHO;BEGIN 0;}
<AA>magic {printf(“first”);}
<BB>magic {printf(“second”);}
%%

相关文章

  • 三. Flex进阶:需要了解的一些知识

    参考:词法分析器生成工具flex词法分析器总结--flex&bison词法分析生成器flex的选项 1. Flex...

  • Flex 布局

    需要了解的一些Flex的知识: 可以用于以后的实践 Flex : Flex 是 Flexible Box 的缩写,...

  • flex 基础 && flex-basis解析

    1、 基础知识 flex-阮一峰 2、关于flex属性的一些说说明 首先明确一点是, flex 是 flex-gr...

  • Grid vs Flexbox

    首先,读这篇文章前你需要对Flexbox和Grid布局有所了解,如果你还不知道,那么知识点来了 Flex布局 和 ...

  • 商业PM入门学习(七)

    三、广告产品知识进阶 1、如何从客户的视角,帮助客户做SEM优化 SEM了解: SEM(1) SEM(2) 2、产...

  • 魏敏_3/66学习笔记

    已经深刻掌握的知识点如下 知识点A:flex line flex items 在flex container中按f...

  • 魏敏_2/66学习笔记

    已经深刻掌握的知识点如下 知识点A:display:flex和inline-flex的区别: flex的作用对象是...

  • 学习的进阶之路

    获取知识有三个层次:了解、理解和掌握。 而单纯的听讲,你只能到了解这个层次。 要想进阶,就必须结合实例,来进行研究...

  • PHP学习笔记第二篇 编程思维与规范

    了解完php编程的基础知识,接下来应该学习进阶知识点的,但是我认为一些核心的编程思维和编程规范是非常重要的,所以放...

  • flex弹性布局之容器属性

    一、flex布局 学习flex弹性布局为了解决一些特殊的布局,在这之前我们可以利用大盒子套小盒子,浮动,定位等来完...

网友评论

      本文标题:三. Flex进阶:需要了解的一些知识

      本文链接:https://www.haomeiwen.com/subject/vsybeqtx.html