Yacc 与 Lex-词法分析器工具

来源:互联网 发布:java线程池使用实例 编辑:程序博客网 时间:2024/05/10 14:52

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|whileSYMBOLS "+"|"-"|"*"|"/"|"<"|"<="|">"|">="|"=="|"!="|"="|";"|","|"("|")"|"["|"]"|"{"|"}"|"/*"|"*/"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 标识符
) 特殊符号
) 特殊符号
; 特殊符号
} 特殊符号

0 0
原创粉丝点击