实验一 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相关推荐

  1. 【不忘初心】Win10_20H2_2009_19042.572_X64_六合一_[纯净精简版](2020.10.29)

    母版来自MSDN  WIN10_20H2.19042.508,集成补到19041.572,20H2相比1909 2004版本要稳定很多,精简起来也比较顺手,相对来说体积比之前的要小一些,精简方法基本上 ...

  2. 2020.10.29腾讯QQ音乐社招前端电话一面总结

    2020.10.29腾讯QQ音乐社招前端电话一面总结 面试官晚上19:16打过来的,聊了44分钟,到八点准时结束.无论过没过,都记录一下面试过程吧,是问了几个大问题,在几个大问题的基础上根据你的回答, ...

  3. 第三轮测试卷一(2020.10.29)

    第三轮测试卷一(2020.10.29) 铺石板,输入n x m的广场,和a x a的石板,求最少需要多少石板? /* 算法思想:没啥.... 理解向上取整就行 */num=((n+a-1)/a)*(( ...

  4. 前仿真和后仿真的区别,按键消抖设计思想、PLL使用、ODDR2的原语使用 --2020/10/29工作总结

    2020/10/29工作总结 前仿真和后仿真的区别 前仿真 综合后仿真 后仿真 synthesize和implement.generate bitstream 参考链接 按键消抖设计思想 PLL使用 ...

  5. 【2020.10.29 洛谷团队赛 普及组】T2 U138014 魔法药水

    题目描述 小武的实验室里有一种魔法药水,这个药水有个很奇怪的性质,它只能在盛放的体积为2的幂次时保 持稳定,例如1,2,4,81,2,4,81,2,4,8.所以小武在实验室里放置了很多容积为2的幂次的 ...

  6. 重装正版Windows 10和Microsoft office home and student 2019教程(2020.10.29)

    目录 环境准备:一个U盘(至少8G) 步骤 第一步  利用微软下载工具制作U盘启动盘 到微软官网下载Windows 10 界面,"点击立即下载工具"后会弹出一个下载界面, 下载此文 ...

  7. 类神界原罪2的摄像机控制——Unity随手记(2020.10.29)

    好久没写博客了 事情的起因是我想要实现一种摄像机,要求摄像机能跟随锁定角色移动的同时还能绕角色旋转旋转.类似神界原罪2锁定角色后的摄像机. 先放上最后的实现代码 // 要跟随的目标public Tra ...

  8. 被开会占满的周四2020.10.29日记

    生活日记 上午醒来后还是球赛后遗症,不过这次反应强烈的是两只脚,脚背上半部分特别疼,只能慢慢的走路了. 中午班级开了入党积极分子的推优会,我第一次做了一把计票员,体验还是满独特的.下午照常的那位老师的 ...

  9. 2020 10 29日

    网站由具有特定服务的网页组成 网页由图像文字声频视频链接等元素组成,以浏览器查看的HTML文件 HTML:超文本标记语言 网页的形成 1.前端工程师用开发工具写代码 -- 标签及内容: 2.浏览器解释 ...

  10. 2020.10月做题记录

    PS:本博客仅选择了一些作者认为有必要记录的题目进行记录. week -1 2020.09.28-2020.10.4 军训+国庆放假-就这样又废了一周- 2020.10.04 回来第一天完全没有状态- ...

最新文章

  1. Hadoop hdfs完全分布式搭建教程
  2. 值得二刷的让MySQL性能“飞起来”的方法总结
  3. linux下防火墙iptables原理及使用
  4. [转载]VC6下安装STLport-5.2.1
  5. 利用linux的df和du命令查看文件和目录的内存占用
  6. 2018年SIAF 广州国际工业自动化技术及装备展览会下周隆重开幕
  7. 推荐几个最近Star过的Github仓库
  8. Mina、Netty、Twisted一起学(五):整合protobuf
  9. Vue cli3使用jQuery控件
  10. Vue中$nextTick的理解
  11. 20日直播预告丨一则ORA-600案例分析
  12. java 集合操作工具包_java之操作集合的工具类--Collections
  13. java清除运行窗口内容,Java实现软件运行时启动信息窗口的方法
  14. python webshell_linux下python版webshell后门查杀工具
  15. 这些小工具让你的Android开发更高效
  16. java能写前端么_java程序员会写前端吗
  17. 循迹避障智能小车c语言程序,智能循迹避障小车完整程序lpar;亲测好使rpar;
  18. 难以忽视的真相:谈及利润,iPhone‘独孤求败’
  19. 面试专题-电商项目面试篇
  20. 2022年4月语音合成(TTS)和语音识别(ASR)论文月报

热门文章

  1. nyoj3533D dungeon
  2. nyoj68三点顺序
  3. Create a PCL visualizer in Qt with QtDesigner
  4. SMGP3.0协议的概念知识
  5. Lua语言学习-垃圾回收
  6. 【UML】UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
  7. java使用MD5加密
  8. 深度学习常见算法之训练自己的数据
  9. php魔术方法__SET __GET
  10. 用c#开发微信 (16) 微活动 2 刮刮卡