1.下载词法分析器工具
http://download.csdn.net/download/pikaxuji/4382949
2.解压后如图所示
先安装flex-2.5.4a-1.exe
再安装第一个文件,安装后会在同一个目录
以我的为例:D:\Mysoft\GnuWin32\GnuWin32
打开此文件的bin目录:shift+右键打开命令行
输入flex c.l 得到一个lex.yy.c文件
c.l则是根据Lex和Yacc语法编写的文件
c.l
%{
#include <stdio.h>
#include <stdlib.h>
%}
RESERVED else|if|int|return|void|while
SYMBOLS "+"|"-"|"*"|"/"|"<"|"<="|">"|">="|"=="|"!="|"="|";"|","|"("|")"|"["|"]"|"{"|"}"|"/*"|"*/"
ID [a-zA-Z]+
NUM [0-9]+
SPACE [ \n\t\r]+
%%
{RESERVED} {
printf("%s\t\t\t保留字\n",yytext);
}
{SYMBOLS} {
printf("%s\t\t\t特殊符号\n",yytext);
}
{NUM} {
printf("%d\t\t\t数字\n",atoi(yytext));
}
{ID} {
printf("%s\t\t\t标识符\n",yytext);
}
{SPACE} |
. {
/*什么也不做,滤掉白字符和其它字符*/
}
%%
int main()
{
char* infilename="C:\CLionProject\CLex\gcd.cm";
printf("文件名:%s\n",infilename);
yyin= fopen(infilename,"r");//读取文件
return yylex();
}`这里写代码片`
int yywrap()//此函数必须由用户提供
{
return 1;
}
C:\CLionProject\CLex\gcd.cm
int gcd (int u, int v)
{
if (v == 0)
return u ;
else
return gcd(v,u-u/v*v);
/* u-u/v*v == u mod v */
}
void main(void)
{
int x;
int y;
x = input();
y = input();
output(gcd(x,y));
}
用CLion运行lex.yy.c
输出:
文件名:gcd.cm
int 保留字
gcd 标识符
( 特殊符号
int 保留字
u 标识符
, 特殊符号
int 保留字
v 标识符
) 特殊符号
{ 特殊符号
if 保留字
( 特殊符号
v 标识符
== 特殊符号
0 数字
) 特殊符号
return 保留字
u 标识符
; 特殊符号
else 保留字
return 保留字
gcd 标识符
( 特殊符号
v 标识符
, 特殊符号
u 标识符
- 特殊符号
u 标识符
/ 特殊符号
v 标识符
* 特殊符号
v 标识符
) 特殊符号
; 特殊符号
/* 特殊符号
u 标识符
- 特殊符号
u 标识符
/ 特殊符号
v 标识符
* 特殊符号
v 标识符
== 特殊符号
u 标识符
mod 标识符
v 标识符
*/ 特殊符号
} 特殊符号
void 保留字
main 标识符
( 特殊符号
void 保留字
) 特殊符号
{ 特殊符号
int 保留字
x 标识符
; 特殊符号
int 保留字
y 标识符
; 特殊符号
x 标识符
= 特殊符号
input 标识符
( 特殊符号
) 特殊符号
; 特殊符号
y 标识符
= 特殊符号
input 标识符
( 特殊符号
) 特殊符号
; 特殊符号
output 标识符
( 特殊符号
gcd 标识符
( 特殊符号
x 标识符
, 特殊符号
y 标识符
) 特殊符号
) 特殊符号
; 特殊符号
} 特殊符号