TINY语言的词法分析

实验目的

(评价依据,描述是否准确到位)

构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造。

构造出的扫描器,能够读入教材样例中给出的tiny语言的示例代码,分解成token输出。

实验设计

(评价依据实验方案设计是否合理)

词法分析

1、关键字: if, then, else, end, repeat, until, read, write.
所有的关键字都是保留字,且全部小写。

2、专用符号: +  - * / = < ( ) ; :=

这里只用了<, 没有使用>,:=为赋值符号

3、其它标记是ID和NUM, 通过下列正则表达式定义:

ID = letter+
NUM = digit+
letter = [a-zA-Z]
digit = [0-9]

大写和小写是有区别的

4、空格是由空白、制表符和新行组成。它通常被忽略,除了它必须分开ID、NUM关键字

5、注释用{...}围起来,且不能嵌套。

DFA

TINY扫描程序的DFA如下图所示:

内容和步骤

1、代码:

 /************************* tiny.l* @author stzg* 2015-9-21 23:08************************/
%{
#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} {printf("get brackets : %s\n", yytext);
}{SPACE} {
/*ABANDON THESE CHARACTORS*/
}{ID} {printf("get an ID: %s\n", yytext);
}
{LC} { char c;do{ c = input();if (c == EOF) break;//if (c == '\n') lineno++;} while (c != '}');
}%%
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;
}

2、结果:

输入:

{ Sample programin TINY language -computes factorial
}
read x; { input an integer }
if 0 < x then { don't compute if x <= 0 }fact := 1;repeatfact := fact * x;x := x - 1until x = 0;write fact  { output factorial of x }
end

输出:

实验结论:

1、理论基础(评价依据 理论知识非常清楚)

我们采用flex进行词法分析。flex是一个用来生成扫描器(scanners)的工具,其中扫描器就是可以识别文本中词法模式的程序。具体流程为:flex读取给定的输入文件,或标准输入(当没有给定文件名时)读取信息来生成一个扫描器。信息以正则表达式和C代码组成,这种形式称为规则(rule)。flex生成C源代码文件lex.yy.c,其中定义了一个函数yylex()。这个文件通过编译,并用-lfl 链接生成可执行文件。当可执行文件被执行时,它分析输入中可能存在的符合正则表达的内容。当找到任何一个与正则表达式相匹配内容时,相应的C 代码将被执行。

flex输入文件由三段组成:定义(definitions),规则(rules),用户代码(user code)

2、分析和总结(评价依据:是否能够对实验结果作出完整和准确的描述,是否能够捕捉到实验中的各种现象,是否有强的信息综合能力,是否能得出正确的结论。)

实验过程中需要配置flex和bison的环境变量,在对原输入串进行分析的预处理在嵌套判断上出现了问题,调试了几次后才发现是计数值应该减少2。通过这次实验对词法分析器的运行机制有了更深的了解,状态转换图让我了解了一些编程语言的词法分析器是怎么书写的。

3、对工具的评价(优缺点及其局限性的总结)

flex的设计目标就是生成一个高性能的扫描器。它已经对处理大量rule 做了优化。除了用-C 选项进行表格压缩之外,还有一些option/action 会影响到扫描器的速度。

比如JavaScript,就不适合使用flex作为词法分析器,JavaScript 正则表达式字面量和除法操作符的二义性, 很难用 lex 解决, 一般只用 lex 做很少的事情, 然后把真正含义的辨清延迟到 parse 阶段.

真正复杂的问题是bison搞不定的,譬如说C++需要语义分析和语法分析同时做,让语义分析的结果来指导语法分析到底要选择哪条grammar rule来resolve conflict

flex ++是一个类似于C ++的词法扫描程序,它作为flex包的一部分包含在内。 生成的代码不依赖于任何运行时或外部库,除了内存分配器(malloc或用户提供的替代),除非输入也依赖于它。 这在传统操作系统或C运行时,设施可能不可用的嵌入式和类似情况下非常有用。

Flex只能为C和C ++生成代码。要使用flex从其他语言生成的扫描程序代码,可以使用SWIG等语言绑定工具。

参考文章

Windows环境下lex入门

LEX/FLEX词法分析器

自己动手写编译器之TINY编译器词法分析

Yacc 与 Lex-词法分析器工具

编译原理实验一 TINY语言的词法分析

《编译原理》实验报告——TINY语言的词法分析相关推荐

  1. 编译原理实验一 TINY语言的词法分析

    实验一 TINY语言的词法分析 一.实验目的 (评价依据,描述是否准确到位) 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造.实验结果:构造出的扫描器,能够读入教材样例中给 ...

  2. 编译原理——实验壹——TINY语言的词法分析

    一. 实验目的 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造.构造出的扫描器,能够读入tiny语言的示例代码,分解成token输出. 掌握使用lex工具 掌握构造词法分析 ...

  3. c语言词法分析器实验原理,词法分析器的设计与实现 编译原理实验报告.doc

    词法分析器的设计与实现 编译原理实验报告 中北大学软件学院 实 验 报 告 专 业 软件工程 课程名称 编译原理 学 号 姓 名 辅导教师 张静 成绩 实验日期2015.5.19实验时间14:00~1 ...

  4. 编译原理上机实习c语言小子集编译程序的实现报告,合肥工业大学编译原理实验报告(完整代码版)...

    <合肥工业大学编译原理实验报告(完整代码版)>由会员分享,可在线阅读,更多相关<合肥工业大学编译原理实验报告(完整代码版)(58页珍藏版)>请在人人文库网上搜索. 1.计算机与 ...

  5. html解析器编译原理,编译原理实验报告词法分析器(内含源代码).docx

    编译原理实验报告词法分析器(内含源代码) 编译原理实验(一) --词法分析器 实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则. 该语言的单词符号包括: 1该程序能识别的单词符号 ...

  6. 编译原理实验报告一:PL0语言编译器分析(PL0,词法分析,语法分析,中间代码生成)

    实验报告一:PL0语言编译器分析 一.实验目的 通过阅读与解析一个实际编译器(PL/0语言编译器)的源代码, 加深对编译阶段(包括词法分析.语法分析.语义分析.中间代码生成等)和编译系统软件结构的理解 ...

  7. 编译原理实验报告三:语法分析(PL0,词法分析,语法分析,中间代码生成)

    实验报告三:语法分析 一.实验目的 通过设计.开发一个S语言的语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容的理解,提高语法分析方法的实践能力. 二.实验要求        根 ...

  8. 中山大学编译原理实验——实现PL0语言的编译程序(无坑有缩进版)

    PL0-Compiler 代码传送门 ps:吐槽一下,老师给的代码实在是太烂了.又没缩进又多编译错误,除此之外还有很多细节漏掉关键字,总之就很多坑,所以这里发一个无坑带缩进版,方便大家学习. 中山大学 ...

  9. 《编译原理》实验预习报告——TINY语言的词法分析

    实验目的 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造.实验结果:构造出的扫描器,能够读入教材样例中给出的tiny语言的示例代码,分解成token输出. Experime ...

最新文章

  1. 怎么锁定电脑屏幕_和平精英怎么在电脑上玩?匹配手机最简单的方式玩你值得拥有...
  2. 6 OC中 isa 和 superclass 的总结
  3. R语言ggplot2可视化并添加特定区间的回归线、R原生plot函数可视化并添加特定区间的回归线:Add Regression Line Between Certain Limits
  4. css margin-top设置html元素之间的距离
  5. java把二维转换为一维_在R语言中什么函数可以将二维数组转换成一维数组
  6. 模拟器上安装不能被卸载的apk
  7. java程序设计实用教程答案_Java程序设计实用教程(课本习题解答).doc
  8. Docker修改空间大小
  9. java集合继承_java集合继承关系
  10. 大神齐聚,算法大赛复赛晋级名单揭晓!
  11. kafka配置项host.name advertised.host.name
  12. centos7安装最新稳定版nginx
  13. 拉普拉斯平滑(Laplacian smoothing)
  14. php短信验证码的前台代码怎么写,php短信验证码接口代码示例
  15. 特效编辑器开发手记1——令人蛋疼菊紧的Cocos2d-x动态改变粒子数
  16. mysql_affect_array_Mysql代理类 支持Master/Slave 读写分离
  17. 史上最强鸿蒙教程来袭!跟Android初学者分享几点经验,专题解析
  18. 让自己分享的网址在QQ中更有逼格
  19. 提取图片中的文字怎么做?这几种简单方法别错过
  20. 一站式在线医疗解决方案,即构音视频技术助建互联网医疗

热门文章

  1. oracle查询数据库启动时的参数文件,【Oracle】数据库启动阶段参数文件、控制文件的问题处理...
  2. 统计信号处理_声学前端:深度学习算法和传统信号处理方法各有千秋
  3. 指针冒泡排序c语言代码,用指针编写冒泡排序方法
  4. 如何复制java卡,使用java做一个简单的集卡程序
  5. 我的世界java版怎么装在u盘_我的世界选择器参数怎么使用?
  6. 逆clarke变换_是clarke变换还是clark
  7. torch的拼接函数_从零开始深度学习Pytorch笔记(13)—— torch.optim
  8. html5中有哪些新属性,整理HTML5中表单的常用属性及新属性
  9. python事件循环_简单了解一下事件循环(Event Loop)
  10. 十二、Powerbi绘制人员地区分布图和后期学习