Lex 实现一个C语言子集的词法分析器

LEX实现一个C语言子集的词法分析器,该词法分析器读入一个C语言的源程序,完成有以下功能。
a. 滤掉空格。(其中空白符、制表符和换行符均视为空格,用来分隔单词)
b. 滤掉注释。(其中注释包括两种形式://和//)
c. 遇到非法单词时可显示“Error”,然后跳过错误部分继续显示
d. 将识别出来的合法单词分为以下五大类,依次输出各个单词的内部编码(编码为1—5,如下)及单词符号自身值。

  1. 关键字
  2. 标识符
  3. 常数:包括整数和实数(包括十进制小数形式,如1.23和指数形式如1.2e5或1.2E5)
  4. 运算符:如= + - * / < <= > >= == != 等符号
  5. 分隔符:; { } 等符号
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int yywrap();
int lineno=1;
%}

delim [ \t] 
ws {delim}+   
letter [A-Za-z]
digit [0-9]
id {letter}({letter}|{digit})*
integer [+-]?{digit}+
decimal [+-]?{integer}"\."{integer}
sciencenumber ({integer}|{decimal})[eE]{integer}
number ({integer}|{decimal}|{sciencenumber})
error_id (({digit})+({letter})+|"\."(\.)*{integer}|{integer}"\."(\.|{integer})*)
enter [ \n]
spchar ("{"|"}"|"["|"]"|"("|")"|";"|","|"'"|":")
ariop ("+"|"-"|"*"|"/")
relop ("<"|"<="|">"|">="|"=="|"!="|"=")
comment_1 \/\*(\*[^/]|[^*])*\*\/
comment_2 \/\/([^\n])*[\n]
reswd (auto|double|int|struct|break|else|long|switch|case|enum|register|typedef|char|extern|return|union|const|float|short|unsigned|continue|for|signed|void|default|goto|sizeof|volatile|do|if|while|static)

%%
{ws} {}
{comment_1} {}
{comment_2} {}
{enter} {lineno++;}
{reswd} {fprintf(yyout,"1, %s\n",yytext);}
{spchar} {fprintf(yyout,"5, %s\n",yytext);}
{id} {fprintf(yyout,"2, %s\n",yytext);}
{number} {fprintf(yyout,"3, %s\n",yytext);}
{error_id} {fprintf(yyout,"error, %s\n",yytext);}
{ariop} {fprintf(yyout,"4, %s\n",yytext);}
{relop} {fprintf(yyout,"4, %s\n",yytext);}

%%

int yywrap() {return 1;}

int main(void)
{
	char infilename[100];
	printf("input filename:");
	scanf("%s",infilename);
	yyin = fopen(infilename,"r");
	yyout = fopen("result.txt","w");
	yylex();
	return 0;
}


  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言川_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值