【编译原理】基于Flex构造词法分析器

【问题描述】设计c语言常见单词的正规式,编制lex源文件,利用flex编译得到词法分析的.c文件,继而对该文件编译得到词法分析器。

【输入形式】输入一段c语言程序

【输出形式】各类单词的token字,或者给出程序中的单词错误。

【样例输入】

int main(){

    int a = 10;

    double b = 20.9;

    if(a <= b)

        a+=b;

    else a = 0;

    return a;

}



【样例输出】

line1:(type, int)

line1:(keyword, main)

line1:(bracket, ()

line1:(bracket, ))

line1:(bracket, {)

line2:(type, int)

line2:(identify, a)

line2:(OPT, =)

line2:(integer, 10)

line2:(bracket, ;)

line3:(type, double)

line3:(identify, b)

line3:(OPT, =)

line3:(decimal, 20.9)

line3:(bracket, ;)

line4:(keyword, if)

line4:(bracket, ()

line4:(identify, a)

line4:(OPT, <=)

line4:(identify, b)

line4:(bracket, ))

line5:(identify, a)

line5:(OPT, +=)

line5:(identify, b)

line5:(bracket, ;)

line6:(keyword, else)

line6:(identify, a)

line6:(OPT, =)

line6:(integer, 0)

line6:(bracket, ;)

line7:(keyword, return)

line7:(identify, a)

line7:(bracket, ;)

line8:(bracket, })



【样例说明】需要识别的关键字包括void, int, main, double, return, float, if, else, do, while, for, scanf, printf, char, sqrt, abs, 运算符(算术、关系、逻辑、位);需要识别的其他单词有标识符, 整数(十进制形式、指数形式),实数(十进制形式、指数形式),字符串;过滤注释及空格。

【评分标准】根据设计文档的质量、lex文件的正确性,代码的正确性、代码的时间空间复杂度、识别单词的种类等综合评分

相关代码

%option noyywrap

%{
     #include <stdlib.h>
     #include <string.h>
     int line = 1;
     typedef struct msg{
		int line;
		char type[100];
		char text[100];
		struct msg* next;
	}msg,*Msg;

     Msg m,p;

	void store(int line,char *type, char *text)
	{
		Msg newmsg = (Msg)malloc(sizeof(msg));
		newmsg->line = line;
		strcpy(newmsg->type,type);
		strcpy(newmsg->text,text);
		p->next = newmsg;
		p = p->next;
	}
     int error = 0;
%}
digital [0-9]
integer ("+"|"-")?[1-9]{digital}*
decimal {integer}(.(0)*[1-9]{digital}*)
float [0-9]*([0-9]\.?|\.[0-9])[0-9]*([Ee]([-+]?[0-9]+)?)
alphabet [A-Za-z]
identifier ({alphabet}|"_")({alphabet}|"_"|{digital})*
operator ("+"|"-"|"*"|"/"|"+="|"-="|"*="|"/="|"++"|"--"|">"|"<"|">="|"<="|"=="|"=")
type ("int"|"void"|"char"|"double"|"short")
keyword ("if"|"else"|"scanf"|"for"|"printf"|"return"|"sqrt"|"abs"|"main"|"float")
typeidentify ("%"|"&"){alphabet}
%%
\n {++line;}
{type} {
     store(line,"type",yytext);
}
{keyword} {
     store(line,"keyword",yytext);
     }
{integer} {
     store(line,"integer",yytext);
     }
{decimal} {
     store(line,"decimal",yytext);
     }
{float} {
     char *chare = strchr(yytext,'e');
     int n = strlen(yytext);
     if(chare!= 0 && yytext[n-1] == 'e')
     {
          error = 1;
          printf("Error at Line %d: Illegal floating point number \"%s\".\n",line,yytext);
     }
     store(line,"float",yytext);
}
{typeidentify} {
     store(line,"typeidentify",yytext);
     }
{identifier} {
     store(line,"identify",yytext);
     }
("("|")"|"{"|"}"|"["|"]"|"\""|","|";") {
     store(line,"bracket",yytext);
     }
{operator} {
     store(line,"OPT",yytext);
     }
"//".*  {}
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/]       {}
. {}
%%
/* 存储 再统一输出 实现出现错误时不输出其他结果*/



int main()
{
    m = (Msg)malloc(sizeof(msg));
    p = m;
    yyin=stdin;
    yylex();
    if (error == 1)
        return 0;
    p = m;
    p = p->next;
    while(p) {
        printf("line%d:(%s, %s)\n", p->line, p->type, p->text);
        p = p->next;
    }
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,词法分析器是编译器的一个重要组成部分,其作用是将源代码转换为单词序列(token),为后续的语法分析器提供输入。以下是一个简单的词法分析器的设计: 1. 定义单词类型 在设计词法分析器之前,需要定义程序可能出现的单词类型,例如:关键字、标识符、常量、运算符等等。 2. 定义有限自动机 在词法分析器,使用有限自动机(Finite Automaton,FA)来识别不同的单词类型。有限自动机可以用状态转移图来表示,其每个状态代表自动机的状态,状态之间的转移代表输入字符后自动机的状态转换。可以使用工具如JFLAP等来创建有限自动机。 3. 实现词法分析器 在实现词法分析器时,可以使用以下步骤: - 读取源代码文件。 - 逐个字符读取源代码,并将其转换为单词序列。 - 对每个单词,使用有限自动机进行识别,并将其分类为不同的单词类型。 - 将识别出的单词存储单词序列,并返回给语法分析器。 可以使用工具如Lex、Flex等来辅助实现词法分析器。 4. 调试和测试 在实现词法分析器后,需要进行调试和测试。可以使用各种测试用例来测试词法分析器的正确性,并进行调试以解决可能出现的问题。 以上是一个简单的词法分析器的设计,具体的实现方式和细节还需要结合具体的编程语言和需求来进行设计。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值