zoukankan      html  css  js  c++  java
  • lex/flex 笔记

    Lex的匹配策略: 

    1. 按最长匹配原则确定被选中的单词 

    2. 如果一个字符串能被若干正规式匹配,则先匹配排在前面的正规式。

    lex源程序的写法:Lex源程序必须按照Lex语言的规范来写,其核心是一组词法规则(正规式)。一般而言,一个Lex源程序分为三部分,三部分之间以符号%%分隔。  

    定义段

    %%

    词法规则段

    %% 

    辅助函数段

    Lex源程序中常用到的变量及函数:  

    yyin和yyout:这是Lex中本身已定义的输入和输出文件指针。这两个变量指明了lex生成的词法分析器从哪里获得输入和输出到哪里。默认:键盘输入,屏幕输出。  

    yytext和yyleng:这也是lex中已定义的变量,直接用就可以了。

    yytext:指向当前识别的词法单元(词文)的指针 yyleng:当前词法单元的长度。  

    ECHO:Lex中预定义的宏,可以出现在动作中,相当于fprintf(yyout, “%s”,yytext),即输出当前匹配的词法单元。  

    yylex():词法分析器驱动程序,用Lex翻译器生成的lex.yy.c内必然含有这个函数。  

    yywrap():词法分析器遇到文件结尾时会调用yywrap()来决定下一步怎么做: 若yywrap()返回0,则继续扫描  若返回1,则返回报告文件结尾的0标记。

    1. 用lex翻译器编译lex源程序命令(假设filename.l是lex源程序名): flex filename.l

    2. 用gcc编译器编译lex翻译器生成的c源程序(lex翻译器生成的c源程序名固定为 lex.yy.c): gcc [-o outfile] lex.yy.c –lfl

    其中,-lfl是链接flex的库函数的,库函数中可能包含类似yywrap一类的标准函数。-o outfile是可选编译选项,该选项可将编译生成的可执行程序命名为outfile,如果不写该编译选项,默认情况下生成的可执行程序名为a.exe(linux下实际为a.out)。  

    3. 调用词法分析器yylex()的main函数可以写在lex源程序的辅助函数部分,也可以写在 其他的c文件中。如果main函数写在main.c中,则编译时需要和lex.yy.c一起编译链接,即编译链接命令为:gcc [-o outfile] lex.yy.c main.c –lfl

     1 %{
     2 /***********
     3     Sexy Lexy
     4 ***********/
     5 %}
     6 %%
     7 a+b*a {printf("1%s
    ",yytext);}
     8 (ab)+c? {printf("2%s
    ",yytext);}
     9 aa {printf("3%s
    ",yytext);}
    10 (a|b)*c {printf("4%s
    ",yytext);}
    11 %%
    12 int main() {
    13     yyin = stdin;
    14     return yylex();
    15 }

    ababcbacaabaababaa
    2ababc
    4bac
    1aaba
    2abab
    1aa

  • 相关阅读:
    Java 7的javax.net.ssl.SSLHandshakeException
    Oracle数据泵导出数据库
    ORA-00054: 资源正忙 --锁表的解决方法
    Linux学习私人笔记-Shell基础
    Linux学习私人笔记-目录和文件的基本命令
    Linux学习私人笔记-文件基本命令
    Linux学习私人笔记-账号管理
    Linux学习私人笔记-Vim
    form提交表单时本地下载
    SQL Servel 中分页解决
  • 原文地址:https://www.cnblogs.com/zinthos/p/4167871.html
Copyright © 2011-2022 走看看