• Windows下使用Flex入门


    LEX是UNIX的工具,因此我们需要使用FLEX代替,使得在windows下使用;

    配对:

    LEX和YACC
    FLEX和BISON
    JFLEX和JavaCUP


    LEX是词法分析器,主要作用类似于扫描器,输入为源代码(当然我们现在写的示例不一定是源代码),输出为词法单元(泛化的东西,比如1,2,3都可以被称为NUM);

    当然中间匹配的过程很复杂,比如匹配正则表达式,并输出;使用LEX就不需要考虑这些,我们只需要定义以下几点:

    (1)正则表达式,怎么样才算匹配,比如我们定义的语言中INTEGER才是整数,则输入为INTEGER时匹配正则表达式;

    (2)返回的词法单元,当匹配时要返回什么需要自己定义;

    下载地址:http://download.csdn.net/detail/loseblue/283175#comment


    二、使用LEX



    下载的文件如下图:





    我们写一个统计文本单词个数、空白个数、数字个数;

    步骤1:定义*.L文件


    一开始要定义一个*.L文件,模板解释如下:

    %{
    //声明一些变量或函数
    %}
    //定义正则表达式
    //比如:
    //num ([0-9])+   //左边为符号,右边为正则表达式
    %%
    //定义一系列的动作,即如果匹配了上面定义的某个正则表达式之后的动作,此动作是C语言的语句
    //比如:
    //{num} {printf("num");} //左边为{模式},右边为{C语句};
    %%
    void main() //执行主函数
    {
    	yylex();  //开始解析语句,内置函数
    	//定义C语言语句
    }
    int yywrap()
    {
    	return 1;
    }


    真实代码如下:

    %{
    int wordCount = 0;
    int whiteCount = 0;
    int numCount = 0;
    %}
    letter [a-zA-Z]
    letters {letter}+
    numbers ([0-9])+
    whitespaces ([\t\n ])+
    %%
    {letters} {wordCount++;}   //当匹配letters的正则表达式时执行的动作,一般动作都是结合yacc并返回给语法分析器一个词法单元和属性值,此处把lex作为一个独立的工具使用
    {numbers} {numCount++;}
    {whitespaces} {whiteCount++;}
    %%
    void main()
    {
    	yylex();  //开始解析语句,内置函数
    	printf("单词数:%d\n",wordCount);
    	printf("空白数:%d\n",whiteCount);
    	printf("数字数:%d\n",numCount);
    }
    int yywrap()
    {
    	return 1;
    }


    步骤2:使用flex命令


    输入命令:flex 1.L

    注意:此处的命令行为lexyacc.bat 打开的命令行;


    flex 1.L 生成 lex.yy.c,此时的C文件可以被gcc编译,并可以使用;


    步骤3:使用gcc编译C程序


    Windows平台 的GCC主要是MinGW编译器:http://www.mingw.org/

    配置环境变量: path=mingw/bin;


    输入命令:gcc -o output.exe lex.yy.c


    此时生成output.exe;


    步骤4:在命令行中输入output执行exe



    此时简单的lex 程序就完成了;

    最后总共文件如下:

















  • 相关阅读:
    指针总结与地址
    寻址方式
    为什么要有指针?
    指针与变量
    Wired Memory
    Memory Usage Performance Guidelines
    内存管理与运行时
    Java jvm 内存回收机制
    GC详解及Minor GC和Full GC触发条件总结
    Java的内存回收机制详解X
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058039.html
Copyright © 2020-2023  润新知