MrTjming / OUC-Compilation-Principle-Experiment

**海洋大学(OUC) 编译原理 实验

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

OUC-Compilation-Principle-Experiment

**海洋大学(OUC) 编译原理 实验

实验环境

  • Cygwin
  • flex
  • yacc

run.sh 是各实验脚本,能自动编译并对指定文件内容执行测试

运行方式./1run.sh

第一次实验

实验代码 见 exp1.l

实验1: Cygwin环境的熟悉和lex的使用1

实验目的

熟悉cygwin环境的使用,学习使用lex写简单的词法分析程序,会在cygwin环境下使用flex调试lex写的程序。

实验内容

读懂exam1.l和exam2.l两个例子,使用cygwin下的flex工具将exam1.l和exam2.l编译并调试通过。并且修改exam2.l,在其基础上增加如下记号:

  • 左右大小括号:{ } ( )
  • 将关系算符改写成C中的形式
  • 分号、赋值号:; =
  • 关键字:if else
  • 双斜线表示的注释://
  • 算术运算符号:+ - * /
  • 将标识符改为可含有下划线,并且可以以下划线开头
  • 将注释内容忽略

实验要求

在cygwin下用flex和gcc工具将实验调试通过,并写出测试例测试正确性。

选做实验e1

实验目的

熟悉cygwin环境的使用,学习使用lex写简单的词法分析程序,会在cygwin环境下使用flex调试lex写的程序。

实验内容

在实验1所改写的程序的基础上增加识别string记号。string是字符串,如果”出现在字符串中,则必须转义,写成\”形式;如果\出现在字符串中,也必须转义,写成\形式。

实验要求

在cygwin下用flex和gcc工具将实验调试通过,并写出测试例测试正确性。同时该实验必须满足如下要求:

  1. string是字符串,它是以双引号括起的一串字符。

  2. 双引号内的字符有如下要求:

    1. 不能包含单独的”或者\,除非用\进行转义。例如字符串内的”写成\”,而\写成\。
    2. 字符串内可以出现转义字符。转义字符可简化表示为\c,其中c为任意字母或数字或(反斜杠),”(双引号),’(单引号)三个符号中的一个。
    3. 字符串内不可包含实体的换行。(可以包含\n,但是如果两个“”中的字符串出现在两行中,即包含了实体换行,则不应识别为字符串)

第二次实验

实验代码 见exp2.l

实验2:用Lex设计词法分析器1

实验目的

学会用lex设计一个词法分析器。

实验内容

使用lex为下述文法语言写一个词法分析器。

语言文法:

<程序>->PROGRAM <标识符> ; <分程序> <分程序> -><变量说明> BEGIN <语句表> END. <变量说明> -> VAR <变量说明表>; <变量说明表>-><变量表>: <类型> | <变量表>: <类型>; <变量说明表> <类型>-> INTEGER | REAL <变量表>-> <变量> | <变量>, <变量表> <语句表> -><语句> | <语句>; <语句表> <语句>-><赋值语句> | <条件语句> | <WHILE语句> | <复合语句> <赋值语句> -><变量> := <算术表达式> <条件语句>->IF <关系表达式> THEN <语句> ELSE <语句> <WHILE语句>->WHILE <关系表达式> DO <语句> <复合语句>->BEGIN <语句表> END <算术表达式>-><项> | <算术表达式> + <项> | <算术表达式> - <项> <项> -> <因式> | <项> * <因式> | <项> / <因式> <因式> -> <变量> | <常数> | (<算术表达式>) <关系表达式> -> <算术表达式> <关系符> <算术表达式> <变量> -> <标识符> <标识符> -> <标识符><字母> | <标识符><数字> | <字母> <常数> -> <整数> | <浮点数> <整数>-> <数字> | <数字> <整数> <浮点数> -> .<整数> | <整数>.<整数> <关系符> -> < | <= | = | > | >=| <> <字母> -> A | B | …| X | Y | Z | a | b | …| x | y | z <数字>-> 0|1|2|…|9

实验要求

输入为用该语言所写的源程序文件;输出为记号序列,每个记号显示为二元组(记号名,记号属性值)的形式。输出可以在屏幕上,也可以输出到文件中。不要求建立符号表。

在cygwin下用flex和gcc工具将实验调试通过,并能通过例子parser0中testcases目录下的test1.p测试例的测试。

实验3:用Lex设计词法分析器2

实验目的

学会用lex设计一个词法分析器,并考虑其与后续语法分析器的链接问题。

实验内容

修改上次实验2的词法分析器,使其满足下列要求。

实验要求

  1. 要求每次调用词法分析函数yylex时,只返回一个记号(token);

  2. 为记号选择适当的属性值,并且每次词法分析函数返回记号前,都将记号的属性值存入全局变量yylval中。(yylval可以自己定义为全局变量);

  3. 记号属性值的选择:标识符的属性为标识符的名字字符串(例如,标识符name1的属性为字符串”name1”),整数的属性为整数值,浮点数的属性为浮点数值。其他记号属性值可自己选择。关键字可以省略属性。

  4. 注意:由于属性值需要存入yylval中,并且记号属性值的类型比较多(可能为字符串、整数、浮点数等),因此yylval必须能同时存放各种类型的值(提示:将yylval设置为union类型)。

  5. 在cygwin下用flex和gcc工具将实验调试通过,并能通过例子parser0中testcases目录下的test1.p测试例的测试。

第三次实验

Todo:

第四次实验

Todo:

About

**海洋大学(OUC) 编译原理 实验


Languages

Language:C 87.2%Language:Lex 6.0%Language:Yacc 4.1%Language:Makefile 1.5%Language:SWIG 0.4%Language:OpenEdge ABL 0.4%Language:C++ 0.2%Language:Shell 0.1%Language:Assembly 0.1%