编译原理正式报告 实验一 TINY语言的词法分析

  • 实验目的

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

Experimental Requirement

Build the lexical parser (a scanner) of TINY language, using the Lex tool of third party. The experimental result Scanner can receive the sample program of Tiny language, and output is a sequence of tokes that are defined by regular expression.  

输入:

{ Sample program

in TINY language -

computes factorial

}

read x; { input an integer }

if 0 < x 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

  • 实验设计

①选择使用win_flex工具实现tiny程序的词法分析

②学习了解TINY语言特点以及关键字表

a.语句序列用分号隔开

b.所有变量都是整形变量,且不需要声明

c.只有两个控制语句,if和repeat

d.if判断语句必须以end结束,且有可选的else语句

e.read和write完成输入输出

f.花括号表示注释,但不允许嵌套注释

g.有<和=两个比较运算符h.有+、-、、/简单运算符

③根据Lex源程序的三部分结构(声明部分、转换规则、辅助函数)编写代码,其中,转换规则决定了构建的是tiny语言的词法分析器(扫描器)。

  • 内容和步骤

1.代码:

%{  

    #include <stdio.h>  

    #include <stdlib.h>   

    int count = 0;  

%}   

  

digit [0-9]+

keyword read|if|then|repeat|until|write|end

letter [a-zA-Z]+

operator ":="|"="|"+"|"-"|"*"|"/"|">"|"<"

ignore ","|";"|" "|\\t"|\\n"

LC \{

%%   

{digit} {count++;printf("%d\t(digit,%s)\n",count,yytext);}  

{keyword} { count++;printf("%d\t(keyword,%s)\n",count,yytext); }  

{letter} {count++;printf("%d\t(letter,%s)\n",count,yytext);}  

{operator} {count++;printf("%d\t(operator,%s)\n",count,yytext);}   

{ignore} { /* do    nothing*/ }

{operator} {count++;printf("%d\t(operator,%s)\n",count,yytext);}   

{LC} { char c;

    do

    { c = input();

    if (c == EOF) break;

    } while (c != '}');

}

%%

int main()

{

yyin = fopen("input.txt","r");

yylex();

fclose(yyin);

}

int yywrap()

{

return 1;

}

2.结果:

a.建立起win_flex工作环境,将教材样例中给出的tiny语言的示例代码保存到input.txt文件中,然后将代码写好,保存到lex文件中,利用win_flex生成.c文件(直接将lex文件拖到win_flex.exe上会生成默认文件名的lex.yy.c的源文件);

b.编译运行lex.yy.c即可读入教材样例中给出的tiny语言的示例代码,分解成token输出。

 

  • 实验结论:

1、理论基础

TINY的程序结构很简单,它在语法上与 Ada或Pascal的语法相似:仅是一个由分号分隔开的语句序列。另外,它既无过程也无声明。所有的变量都是整型变量,通过对其赋值可较轻易地声明变量(类似FORTRAN或BASIC)。

它只有两个控制语句:if语句和repeat语句,这两个控制语句本身也可包含语句序列。if语句有一个可选的else部分且必须由关键字end结束。除此之外,read语句和write语句完成输入/输出。在花括号中可以有注释,但注释不能嵌套。TINY的表达式也局限于布尔表达式和整型算术表达式。布尔表达式由对两个算术表达式的比较组成,该比较使用<与=比较算符。算术表达式可以包括整型常数、变量、参数以及 4个整型算符+、-、、/,此外还有一般的数学属性。布尔表达式可能只作为测试出现在控制语句中——而没有布尔型变量、赋值或I / O。

2、分析和总结

经过以上步骤,我成功使用win_flex工具实现了tiny程序的词法分析,并生成了可执行文件。在测试中,我输入了一些符合语法规则的程序代码,词法分析器能够正确地识别出每个标记的类型,并将其输出到屏幕上。通过转换规则的修改和添加,也可以实现构造其他语言的词法分析器(扫描器)。

通过本实验,我深入了解了win_flex工具的使用方法和词法分析的实现原理。win_flex工具具有灵活、可定制、高效等优点,可以帮助我们快速地生成词法分析器代码。在使用时需要注意生成的代码复杂,需要一定的编程经验和调试技巧。

3、对工具的评价

WinFlex是一个词法分析器生成器,用于生成计算机程序的词法分析器或扫描器。它是一个工具,可以生成C++代码,用于创建词法分析器,可以扫描输入文件并将其分解为单个标记或词元。

WinFlex是Flex工具的Windows版本,Flex工具通常用于基于Unix的系统。 WinFlex生成的代码可以与其他C++代码编译和链接,以创建完整的程序。它特别适用于创建编译器,解释器和其他需要解析输入文件的工具。

要使用WinFlex,通常需要编写一组规则,定义应如何将输入文件分解为标记。这些规则是用称为正则表达式的特殊语言编写的。然后,WinFlex基于这些规则生成C++代码,可用于扫描输入文件。

WinFlex是免费且开源的软件,可以从互联网上的各种来源下载。

以下是WinFlex的优点和缺点:

(1)优点:

a.灵活性:WinFlex是一个灵活的词法分析器生成器,可以根据不同的需求生成不同的词法分析器。

b.可定制性:WinFlex提供了丰富的选项和配置参数,可以让用户对生成的词法分析器进行更精细的定制。

c.性能高:WinFlex生成的词法分析器采用了高效的算法和数据结构,能够快速地扫描和识别输入文件中的标记。

d.易于使用:WinFlex提供了简单易懂的规则语法,用户可以很容易地编写词法分析器的规则。

e.跨平台:WinFlex支持Windows平台,并且可以通过在不同平台上编译生成的C++代码在其他平台上运行。

(2)缺点:

a.生成代码复杂:WinFlex生成的C++代码相对较复杂,不易于阅读和修改,需要一定的编程经验。

b.无法处理语法分析:WinFlex只能用于生成词法分析器,无法处理语法分析的任务,需要与其他工具或代码一起使用。

c.只支持C++:WinFlex只能生成C++代码,不支持其他编程语言,不利于其他语言的开发者使用。

d.难以调试:由于WinFlex生成的代码较为复杂,调试起来相对困难。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值