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
    评论
词法分析是编译器的一个重要组成部分,它负责将字符流(源代码)转换为一个个的词法单元(Token)。对于C语言子集的词法分析程序,我们可以利用lex词法分析生成工具来实现lex(也称为flex)是一种基于正则表达式词法分析器生成工具,它可以根据用户提供的规则自动生成词法分析程序。 首先,我们需要定义C语言子集的词法规则。例如,可以定义标识符、关键字、运算符、常量等词法单元,并给出相应的正则表达式规则。 接下来,使用lex工具根据这些规则生成词法分析程序。在生成过程中,lex会将规则转换为状态机,从而实现C语言子集源代码的扫描和分析。 生成的词法分析程序可以接受源代码作为输入,并将其转换为一个个的词法单元。同时,在词法分析的过程中,可以构建符号表(Symbol Table),用于记录源代码中出现的标识符和常量的相关信息。 符号表通常是一个数据结构,用于存储标识符和常量的名称、类型、作用域等信息。在词法分析程序中,每当遇到一个标识符或常量时,可以将其加入符号表。 最后,词法分析程序可以将词法单元和符号表作为输出进行返回。 综上所述,我们可以利用lex词法分析生成工具实现C语言子集的词法分析程序,并在生成的过程中构建和输出符号表。生成的程序可以将源代码转换为词法单元,并将标识符和常量的相关信息存储在符号表中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

言川_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值