Yacc 与 Lex-词法分析器工具

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 标识符
) 特殊符号
) 特殊符号
; 特殊符号
} 特殊符号

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值