2020-10-29
实验一 TINY语言的词法分析
一、实验目的
(评价依据,描述是否准确到位)
利用第三方的lex工具构造tiny语言的词法分析器(扫描器)并使得构造出的扫描器能够读入教材样例中给出的tiny语言的示例代码,分解成token输出。
学习如何使用flex,配置它的环境并使用。
学习如何编写正则表达式和tiny语法结构。
学习如何使用工具获取tokens。
二、实验设计
(评价依据实验方案设计是否合理)
由词法分析器的工作方式可以知道,实验需要做到:理解并使用tiny语言,使用构造出的扫描器,能够读入教材样例中给出的tiny语言的示例代码,分解成token输出。,经编译后在c编译器上使用和调用。
三、内容和步骤
1.配置环境:
配置环境变量:右击此电脑->属性->高级系统设置->“高级”一栏下的环境变量 在系统变量Path中增加win_flex_bison的路径。直接在桌面新建一个test文件夹,里面创建文本文件后改名lex.l打开cmd,同样方法获得路径,输入cd :路径,比如我cd C:\Users\Administrator\Desktop\test 回车后进入。没有报错,文件夹出现新文件,说明配置成功
2.代码:
%{
#include "stdio.h"
#include "stdlib.h"
%}INT_DEX [1-9][0-9]*|[0]
INT_HEX [0][Xx]([1-9][0-9]*|[0])
INT_OCT [0][0-7]
FLOAT [0-9]*[.][0-9]+([eE][+-]?[0-9]*|[0])?f?
SEMI [;]
COMMA [,]
ASSIGNOP [=]
RELOP [>]|[<]|[>][=]|[<][=]|[=][=]|[!][=](^[=])
PLUS [+]
MINUS [-]
STAR [*]
DIV [/]
AND [&][&]
OR [|][|]
DOT [.]
NOT [!]
TYPE int|float
LP \(
RP \)
LB \[
RB \]
LC \{
RC \}
STRUCT struct
RETURN return
IF if
ELSE else
WHILE while
SPACE [ \n\t]
ID [a-zA-Z_][a-zA-Z_0-9]*
/*end of definition*/
%%
{SEMI} {printf("get semmi : %s\n", yytext);}{COMMA} {printf("get comma : %s\n", yytext);
}
{ASSIGNOP} {printf("get assignop : %s\n", yytext);
}{INT_DEX} |
{INT_HEX} |
{INT_OCT} {printf("get an integer: %s\n", yytext);
}{FLOAT} {printf("get a float: %s\n", yytext);
}{PLUS} |
{MINUS} |
{DIV} |
{STAR} {printf("get an operator: %s\n", yytext);
}{RELOP} {printf("get a relop: %s\n", yytext);
}{AND} |
{OR} |
{NOT} {printf("get a logic operator: %s\n", yytext);
}{DOT} {printf("get a dot: %s\n", yytext);
}
{STRUCT} |
{RETURN} |
{IF} |
{ELSE} |
{WHILE} {printf("get keyword: %s\n", yytext);
}{TYPE} {printf("get type: %s\n", yytext);
}{LP} |
{RP} |
{LB} |
{RB} |
{LC} |
{RC} {printf("get brackets : %s\n", yytext);
}{SPACE} |
. {
/*ABANDON THESE CHARACTORS*/
}{ID} {printf("get an ID: %s\n", yytext);
}
%%
int yywrap() {return 1;
}int main(int argc, char** argv) {if (argc > 1) {if (!(yyin = fopen(argv[1], "r"))) { perror(argv[1]);return 1;}}while (yylex());return 0;
}
3.结果:
测试如下案例(书本23页):
{ sample progarm
in tiny language -
computer factorial
}
read x;{ input an integer }
if x < 0 then { don’t compute if x <= 0}
fact := 1;
repeat
fact := fact * x;
x := x - 1
until x = 0;
write fact {output factorial of x}
End
四、实验结论:
1 理论基础(评价依据 理论知识非常清楚)
TINY的程序结构是一个由分号分隔开的语句序列。另外,它既无过程也无声明。所有的变量都是整型变量,通过对其赋值可较轻易地声明变量(类似FORTRAN或BASIC)。它只有两个控制语句:i f语句和repea语句,这两个控制语句本身也可包含语句序列。If语句有一个可选的else部分且必须由关键字end结束。除此之外,read语句和write语句完成输入/输出。在花括号中可以有注释,但注释不能嵌套。
TINY的表达式也局限于布尔表达式和整型算术表达式。布尔表达式由对两个算术表达式的比较组成,该比较使用<与=比较算符。算术表达式可以包括整型常数、变量、参数以及4个整型算符+、-、*、/,此外还有一般的数学属性。布尔表达式可能只作为测试出现在控制语句中——而没有布尔型变量、赋值或I / O。
本次书上的测试案例:
{ sample progarm
in tiny language -
computer factorial
}
read x;{ input an integer }
if x < 0 then { don’t compute if x <= 0}
fact := 1;
repeat
fact := fact * x;
x := x - 1
until x = 0;
write fact {output factorial of x}
End
flex的语法被分为三个部分:
{definitions}/定义段
%%
{rules}/规则段
%%
{user subroutines}/代码段
definitions:LABEL REGULAR_EXPRESSION
LABEL是这里类字符串的名称,REGULAR_EXPRESSION则是匹配这种字符串的正则表达式。
正则表达式的语法:
| 或
[] 括号中的字符取其一
- a-z表示ascii码中介于a-z包括a.z的字符
\ 转义(flex不能识别除字母外的字符)
- 0或多个字符
? 0或1个字符
- 1或多个字符
^ 除此之外的其余字符
. 除\n外的所有字符,等价于^\n
2、分析和总结(评价依据:是否能够对实验结果作出完整和准确的描述,是否能够捕捉到实验中的各种现象,是否有强的信息综合能力,是否能得出正确的结论。)
整个实验的流程其实很清楚:
(1)环境配置
(2)编写.l文件,并利用flex,devc++编译
(3)运行并输入tiny例子,完成分析
本实验的唯一难点在于编写.l文件,文件分为定义段,规则段,代码段三部分。
{definitions}/定义段
%%
{rules}/规则段
%%
{user subroutines}/代码段
规则段用于提取,代码段用于c程序的运行。
在正则表达式上会有些难度,规则段其实按照例子来就很简单,代码段搞不懂说明c语言没有掌握透彻。
3、对工具的评价(优缺点及其局限性的总结)
lex是一个产生词法分析器, Lex常常与yacc语法分析器产生程序。
Lex读进一个代表词法分析器规则的输入字符串流,然后输出以C语言实做的词法分析器源代码。有名的Lex公开源代码版本是flex,代表"快速的词法分析器"。因此优点在于速度快,但是必然会失去部分稳定性。
2020-10-29相关推荐
- 【不忘初心】Win10_20H2_2009_19042.572_X64_六合一_[纯净精简版](2020.10.29)
母版来自MSDN WIN10_20H2.19042.508,集成补到19041.572,20H2相比1909 2004版本要稳定很多,精简起来也比较顺手,相对来说体积比之前的要小一些,精简方法基本上 ...
- 2020.10.29腾讯QQ音乐社招前端电话一面总结
2020.10.29腾讯QQ音乐社招前端电话一面总结 面试官晚上19:16打过来的,聊了44分钟,到八点准时结束.无论过没过,都记录一下面试过程吧,是问了几个大问题,在几个大问题的基础上根据你的回答, ...
- 第三轮测试卷一(2020.10.29)
第三轮测试卷一(2020.10.29) 铺石板,输入n x m的广场,和a x a的石板,求最少需要多少石板? /* 算法思想:没啥.... 理解向上取整就行 */num=((n+a-1)/a)*(( ...
- 前仿真和后仿真的区别,按键消抖设计思想、PLL使用、ODDR2的原语使用 --2020/10/29工作总结
2020/10/29工作总结 前仿真和后仿真的区别 前仿真 综合后仿真 后仿真 synthesize和implement.generate bitstream 参考链接 按键消抖设计思想 PLL使用 ...
- 【2020.10.29 洛谷团队赛 普及组】T2 U138014 魔法药水
题目描述 小武的实验室里有一种魔法药水,这个药水有个很奇怪的性质,它只能在盛放的体积为2的幂次时保 持稳定,例如1,2,4,81,2,4,81,2,4,8.所以小武在实验室里放置了很多容积为2的幂次的 ...
- 重装正版Windows 10和Microsoft office home and student 2019教程(2020.10.29)
目录 环境准备:一个U盘(至少8G) 步骤 第一步 利用微软下载工具制作U盘启动盘 到微软官网下载Windows 10 界面,"点击立即下载工具"后会弹出一个下载界面, 下载此文 ...
- 类神界原罪2的摄像机控制——Unity随手记(2020.10.29)
好久没写博客了 事情的起因是我想要实现一种摄像机,要求摄像机能跟随锁定角色移动的同时还能绕角色旋转旋转.类似神界原罪2锁定角色后的摄像机. 先放上最后的实现代码 // 要跟随的目标public Tra ...
- 被开会占满的周四2020.10.29日记
生活日记 上午醒来后还是球赛后遗症,不过这次反应强烈的是两只脚,脚背上半部分特别疼,只能慢慢的走路了. 中午班级开了入党积极分子的推优会,我第一次做了一把计票员,体验还是满独特的.下午照常的那位老师的 ...
- 2020 10 29日
网站由具有特定服务的网页组成 网页由图像文字声频视频链接等元素组成,以浏览器查看的HTML文件 HTML:超文本标记语言 网页的形成 1.前端工程师用开发工具写代码 -- 标签及内容: 2.浏览器解释 ...
- 2020.10月做题记录
PS:本博客仅选择了一些作者认为有必要记录的题目进行记录. week -1 2020.09.28-2020.10.4 军训+国庆放假-就这样又废了一周- 2020.10.04 回来第一天完全没有状态- ...
最新文章
- Hadoop hdfs完全分布式搭建教程
- 值得二刷的让MySQL性能“飞起来”的方法总结
- linux下防火墙iptables原理及使用
- [转载]VC6下安装STLport-5.2.1
- 利用linux的df和du命令查看文件和目录的内存占用
- 2018年SIAF 广州国际工业自动化技术及装备展览会下周隆重开幕
- 推荐几个最近Star过的Github仓库
- Mina、Netty、Twisted一起学(五):整合protobuf
- Vue cli3使用jQuery控件
- Vue中$nextTick的理解
- 20日直播预告丨一则ORA-600案例分析
- java 集合操作工具包_java之操作集合的工具类--Collections
- java清除运行窗口内容,Java实现软件运行时启动信息窗口的方法
- python webshell_linux下python版webshell后门查杀工具
- 这些小工具让你的Android开发更高效
- java能写前端么_java程序员会写前端吗
- 循迹避障智能小车c语言程序,智能循迹避障小车完整程序lpar;亲测好使rpar;
- 难以忽视的真相:谈及利润,iPhone‘独孤求败’
- 面试专题-电商项目面试篇
- 2022年4月语音合成(TTS)和语音识别(ASR)论文月报