您的位置:首页 > 其它

lex语言词法分析

2016-04-06 18:11 288 查看
1.添加行号

%{
#include<stdio.h>
#include<stdlib.h>
int line=1;
%}

%%
[^\n]  {yymore();}
[\n]   {printf("%2d %s",line++,yytext);}
%%

int yywrap(void)
{
return 1;
}
int main(int argc,char** argv)
{
yyin=fopen(argv[1],"r");
while(yylex());
return 0;

}




2.将文件中每个非空的空白符号序列替换为单个空格

%{
#include<stdio.h>
#include<stdlib.h>
%}

%%

[^\n]    {printf("%s",yytext);}
[\t\n]   {printf(" ");}

%%

int yywrap(void)
{
return 1;
}

int main(int argc,char**argv)
{
yyin=fopen(argv[1],"r");
yylex();
return 0;
}




3.将文件中所有关键字转换为大写字母

%{
#include <stdio.h>
#include <stdlib.h>
int lineno=1;
%}

letter	[a-z]+
digit	[0-9]+
id	{letter}+({letter}|{digit})*

%%
[^id]	{
}
{id}	{
int i=0;
for(i=0;i<yyleng;i++)
if(yytext[i]>='a'&&yytext[i]<='z')
yytext[i]-=32;
printf("%s\n",yytext);

}

%%

int yywrap(void)
{
return 1;
}
int main(int argc, char** argv) {
yyin = fopen(argv[1], "r");
yylex();
return 0;
}




4.将文件中所有标识符转换为小写字母,且以下划线开头、

%{
#include <stdio.h>
#include <stdlib.h>
int lineno=1;
%}

letter	[A-Z]+
digit	[0-9]+
id	{letter}+({letter}|{digit})*

%%
[^id]	{
}
{id}	{
int i=0;
for(i=0;i<yyleng;i++)
if(yytext[i]>='A'&&yytext[i]<='Z')
yytext[i]+=32;
printf("_%s\n",yytext);

}

%%

int yywrap(void)
{
return 1;
}
int main(int argc, char** argv) {
yyin = fopen(argv[1], "r");
yylex();
return 0;
}




5.将文件中所有指数形式的常量转换为小数形式

例如:2.5e3 被转换为 2500

3.7e-2 被转换为 0.037

%{
#include <stdio.h>
#include <stdlib.h>
int lineno=1;
%}

FLOAT [0-9]*[.][0-9]+([eE][+-]?[0-9]*|[0])?f?

%%

{FLOAT} {
float t=0;
t=atof(yytext);
printf("%f",t);
}

%%

int yywrap(void)
{
return 1;
}
int main(int argc, char** argv) {
yyin = fopen(argv[1], "r");
yylex();
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: