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
一开始要定义一个*.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; }
输入命令:flex 1.L
注意:此处的命令行为lexyacc.bat 打开的命令行;
flex 1.L 生成 lex.yy.c,此时的C文件可以被gcc编译,并可以使用;
Windows平台 的GCC主要是MinGW编译器:http://www.mingw.org/
配置环境变量: path=mingw/bin;
输入命令:gcc -o output.exe lex.yy.c
此时生成output.exe;
此时简单的lex 程序就完成了;
最后总共文件如下: