电子科技大学编译技术icoding--实验一 词法分析

博客围绕词法分析实验展开,介绍利用flex设计词法分析器,该分析器从标准输入读入源代码后输出单词类别编号及附加信息。还提及实验前需安装flex,编译文件的方法,上传文件要求,以及实验要点,如正则表达式处理、进制转换等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请根据词法分析实验中给定的文法,利用flex设计一词法分析器,该分析器从标准输入读入源代码后,输出单词的类别编号及附加信息。 附加信息规定如下: 当类别为 Y_ID、num_INT 或 num_FLOAT 时,附加信息为该类别对应的属性,如 main, 100, 29.3等; 当类别为 关键字 时,附件信息为 KEYWORD; 当类别为 运算符 时,附件信息为 OPERATOR; 当类别为 其它符号时,附件信息为 SYMBOL; 例如对于源代码

int main(){
    return 3;
}

词法分析器的输出为:

<261, KEYWORD>
<260, main>
<285, SYMBOL>
<286, SYMBOL>
<287, SYMBOL>
<269, KEYWORD>
<258, 3>
<292, SYMBOL>
<288, SYMBOL>

请在本页面上传词法分析实验所有源代码及实验报告(源代码至少包括一个flex源文件,即 .l 文件,如有其它 .c 或 .h 文件,也请一并上传)

本实验中的单词类别定义如下,该定义包含在 token.h 中,此头文件可直接使用,无需上传

// 单词类别
enum yytokentype {
	num_INT = 258,
	num_FLOAT = 259,

	Y_ID = 260,

	Y_INT = 261,
	Y_VOID = 262,
	Y_CONST = 263,
	Y_IF = 264,
	Y_ELSE = 265,
	Y_WHILE = 266,
	Y_BREAK = 267,
	Y_CONTINUE = 268,
	Y_RETURN = 269,

	Y_ADD = 270,
	Y_SUB = 271,
	Y_MUL = 272,
	Y_DIV = 273,
	Y_MODULO = 274,
	Y_LESS = 275,
	Y_LESSEQ = 276,
	Y_GREAT = 277,
	Y_GREATEQ = 278,
	Y_NOTEQ = 279,
	Y_EQ = 280,
	Y_NOT = 281,
	Y_AND = 282,
	Y_OR = 283,
	Y_ASSIGN = 284,

	Y_LPAR = 285,
	Y_RPAR = 286,
	Y_LBRACKET = 287,
	Y_RBRACKET = 288,
	Y_LSQUARE = 289,
	Y_RSQUARE = 290,
	Y_COMMA = 291,
	Y_SEMICOLON = 292,

	Y_FLOAT = 293
};

 

%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* endptr;
enum yytokentype {
	num_INT = 258,
	num_FLOAT = 259,

	Y_ID = 260,

	Y_INT = 261,
	Y_VOID = 262,
	Y_CONST = 263,
	Y_IF = 264,
	Y_ELSE = 265,
	Y_WHILE = 266,
	Y_BREAK = 267,
	Y_CONTINUE = 268,
	Y_RETURN = 269,

	Y_ADD = 270,
	Y_SUB = 271,
	Y_MUL = 272,
	Y_DIV = 273,
	Y_MODULO = 274,
	Y_LESS = 275,
	Y_LESSEQ = 276,
	Y_GREAT = 277,
	Y_GREATEQ = 278,
	Y_NOTEQ = 279,
	Y_EQ = 280,
	Y_NOT = 281,
	Y_AND = 282,
	Y_OR = 283,
	Y_ASSIGN = 284,

	Y_LPAR = 285,
	Y_RPAR = 286,
	Y_LBRACKET = 287,
	Y_RBRACKET = 288,
	Y_LSQUARE = 289,
	Y_RSQUARE = 290,
	Y_COMMA = 291,
	Y_SEMICOLON = 292,

	Y_FLOAT = 293
};
int a1;
float a2;
%}

DIGIT [0-9]+
WORD  [a-zA-Z]+
DIGIT16 [0-9a-fA-F]+

%%
0[xX]{DIGIT16}   {a1 = strtol(yytext, &endptr, 16); return num_INT;}
[0-9]+       {a1 = atoi(yytext); return num_INT;}
{DIGIT}+"."*{DIGIT}*      {a2 = atoi(yytext); return num_FLOAT;}

"//"(.*)   {yywrap();}
"\n"        {}
" "         {}
"int"       {return Y_INT;}
"void"      {return Y_VOID;}
"const"     {return Y_CONST;}
"if"        {return Y_IF;}
"else"      {return Y_ELSE;}
"while"     {return Y_WHILE;}
"break"     {return Y_BREAK;}
"continue"  {return Y_CONTINUE;}
"return"    {return Y_RETURN;}

[a-zA-Z_][a-zA-Z0-9_]*    {return Y_ID;}

"+"         {return Y_ADD; }
"-"         {return Y_SUB; }
"*"         {return Y_MUL; }
"/"         {return Y_DIV; }
"%"         {return Y_MODULO; }
"<"         {return Y_LESS; }
"<="        {return Y_LESSEQ; }
">"         {return Y_GREAT; }
">="        {return Y_GREATEQ; }
"!="        {return Y_NOTEQ;}
"=="        {return Y_EQ; }
"!"         {return Y_NOT;}
"&&"        {return Y_AND;}
"||"        {return Y_OR;}
"="         {return Y_ASSIGN;}

"("         {return Y_LPAR;}
")"         {return Y_RPAR; }
"{"         {return Y_LBRACKET;}
"}"         {return Y_RBRACKET;}
"["         {return Y_LSQUARE;}
"]"         {return Y_RSQUARE;}
","         {return Y_COMMA;}
";"         {return Y_SEMICOLON;}

"."         {return Y_FLOAT;}
%%

void main()
{
	int tok;
	
	while(tok = yylex()) 
	{	
		if(tok == Y_ID)
				printf("<260, %s>\n", yytext);
			else if(tok == num_INT)
				printf("<258, %d>\n", a1);
			else if(tok == num_FLOAT)
				printf("<259, %f>\n", a2);
			else if(tok == Y_INT || tok == Y_VOID || tok == Y_CONST || tok == Y_IF || tok == Y_ELSE || tok == Y_WHILE || tok == Y_BREAK ||  tok == Y_CONTINUE ||  tok == Y_RETURN)
				printf("<%d, %s>\n", tok, "KEYWORD");
			else if(tok == Y_ADD || tok == Y_SUB || tok == Y_MUL || tok == Y_DIV || tok == Y_MODULO || tok == Y_LESS || tok == Y_LESSEQ ||  tok == Y_GREAT ||  tok == Y_GREATEQ || tok == Y_NOTEQ || tok == Y_EQ || tok == Y_NOT || tok == Y_AND || tok == Y_OR || tok == Y_ASSIGN)
				printf("<%d, %s>\n", tok, "OPERATOR");
			else if(tok == Y_LPAR || tok == Y_RPAR || tok == Y_LBRACKET || tok == Y_RBRACKET || tok == Y_LSQUARE || tok == Y_RSQUARE || tok == Y_COMMA ||  tok == Y_SEMICOLON || tok == Y_FLOAT)
				printf("<%d, %s>\n", tok, "SYMBOL");
	}
}

int yywrap(){	
    return 1;  
    }

本实验应用flex,实验前建议在本地安装好flex,可通过cmd命令直接操作。

flex test.l

编译lex.yy.c文件时,个人应用cmd命令调用gcc编译,较为方便。

gcc lex.yy.c

上传文件时,请将实验报告(Word文档或PDF文档)一并上传,否则系统不予通过。

实验要点:        单行注释的正则表达式及忽略处理

                          变量名的正则表达式

                          十六进制数如何转化为十进制数

                          flex自身全局变量和已定义函数的合理调用

注:个人作业仅供参考和学习交流,如有不足之处欢迎批评指正,请勿抄袭!

                          

### 关于电子科技大学 iCoding 平台实验六的资源 对于电子科技大学iCoding平台上的实验六,该实验主要围绕着Web开发中的前后端交互展开。学生需掌握如何利用HTML, CSS以及JavaScript构建前端页面,并通过AJAX技术实现与后端服务器的数据交换[^1]。 #### 前端部分 为了完成此实验,了解并实践以下概念至关重要: - **HTML结构设计**:创建合理的文档对象模型(DOM),确保网页布局清晰合理。 - **CSS样式美化**:运用层叠样式表(CSS)来增强视觉效果,使网站更加美观易用。 - **JavaScript编程逻辑**:编写脚本处理用户输入事件、动态更新DOM节点等内容。 ```html <!-- HTML 示例 --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <!-- 链接外部CSS文件 --> <link rel="stylesheet" href="./styles.css"/> </head> <body> <div id="content"></div> <!-- 引入jQuery库简化Ajax操作 --> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <!-- 自定义JS代码 --> <script type="text/javascript"> $(document).ready(function(){ $.ajax({ url: '/api/data', // 请求地址 method:'GET', success:function(response){ $('#content').html(JSON.stringify(response)); } }); }) </script> </body> </html> ``` #### 后端服务搭建 在后端方面,则需要熟悉Node.js或其他适合的语言框架,用来接收来自客户端发起的各种HTTP请求,并返回相应的JSON数据作为响应体给到浏览器解析显示。 ```javascript // Node.js Express 示例 const express = require('express'); const app = express(); app.get('/api/data', (req, res)=>{ const data = { message : 'Hello from server!' }; res.json(data); }); app.listen(3000, ()=>{ console.log('Server is running on port 3000.'); }); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值