WhatsApp网页版登录WhatsApp网页版登录

WhatsApp中文版

词法分析器的输入是什么_FLEX词法分析器

1.FLEX简介单词的描述称为模式(Lexical Pattern),模式一般用正规表达式进行精确描述。FLEX通过读取一个有规定格式的文本文件WhatsApp网页版,输出一个如下所示的C语言源程序。+------------+       +------------+       +----------------+| 输入文件*.l |------>|flex工具     |------>|输出文件lex.yy.c |+------------+       +------------+       +----------------+FLEX的输入文件称为LEX源文件,它内含正规表达式和对相应模式处理的C语言代码。LEX源文件的扩展名习惯上用.l表示。FLEX通过对源文件的 扫描自动生成相应的词法分析函数 int yylex(),并将之输出到名规定为lex.yy.c的文件中。实用时,可将其改名为lexyy.c。该文件即为LEX的输出文件或输出的词法分析器。 也可将 int yylex()加入自已的工程文件中使用。2. LEX源文件的格式LEX对源文件的格式要求非常严格,比如若将要求顶行书写的语句变成非顶行书写就会产生致命错误。而LEX本身的查错能力很弱,所以书写时一定要注意。LEX的源文件由三个部份组成,每个部分之间用顶行的“%%”分割,其格式如下:定义部份%%规则部份%%用户附加C语言部份下面以统计单词出现的次数的源程序count.l做说明,count.l的内容如下:%{#include "stdio.h"#include "stdlib.h"int num_num=0,num_id=0;%}INTEGER ?*ID

a-zA-Z_0-9

*SPACE %%{INTEGER} { num_num++;printf("(num=%d)/n",atoi(yytext));/*打印数字值*//*数字数加一*/}{ID} { num_id++;printf("(id=%s)/n",yytext);}{SPACE} |. {/*什么也不做,滤掉白字符和其它字符*/}%%int main(){yylex();printf("num=%d,id=%d/n",num_num,num_id);return 0;}int yywrap()//此函数必须由用户提供{return 1;}2.1定义部分:%{#include "stdio.h"#include "stdlib.h"int num_num=0,num_id=0;%}INTEGER ?*ID

a-zA-Z_0-9

*SPACE 定义部份由C语言代码、模式的宏定义、条件模式的开始条件说明三部份组成。其中,C代码部份由顶行的%{和}%引入,LEX扫描源文件时将%{和}%之间的部分原封不动的拷贝到输出文件lex.yy.c中。上面的定义部分没有条件模式的开始条件说明部分,只有C语言代码、模式的宏定义。模式宏定义是一个正则表达式的定义,如上面所示的INTEGER ?*正则表达式的匹配如下:模式 解 释x 配置单个字母x. 匹配除换行符’/n’之外的任意字符 匹配x、y或z 匹配a、b、z及j至o之间的字母 除大写字母A-Z之外的其它字符  除大写字母A-Z和换行符之外的其它字符r* 匹配0个或多个rr+ 匹配1个或多个rr? 匹配0个或1个r2.2规则部分规则部份是LEX源文件的核心部份,它包括一组模式和在生成分析器识别相应模式后对相应模式进行处理的C语言动作(Action)。格式如下C语言代码模式1 动作1模式2 |模式3 动作3同定义部分一样,C语言代码必须出现在第一个模式之前,包括在%{和}%之中,且%{必须顶行书写。%{和}%之间的代码部份可用来定义yylex()用到的局部变量。模式必须顶行书写。模式可为正规式或用{}括起且在定义部份定义过的宏名。动作为用{}括起的C代码。且开始括号{与模式之间用白字符隔开,且须和模式在同一行上。注意,在模式后加一|表示模式2和3采用同一动作3.|和模式2以白字符隔开。2.3 用户附加C语言部份LEX对此部份不作任何处理,仅仅将之直接拷贝到输出文件lex.yy.c的尾部。在些部份WhatsApp网页版,可定义对模式进行处理的C语言函数、主函数和yylex要调用的函数yywrap()等。如果用户在其它C模块中提供这些函数WhatsApp网页版,用户代码部份可以省略。3.生成源代码和编译运行flex count.lgcc -g lex.yy.c -o count运行:osdba@osdba-laptop:~/tmp$ ./count

相关文章