实验报告二 (编程语言分析及其应用)

实验目的与要求:
目的:设计与实现简易编程语言及其分析算法,包括简易tensor编程语言的设计与实现、简易tensor语言的类型分析与检测。通过语言分析的应用实验,熟练掌握编程语言的设计和分析以及相关基本思想,如语法分析、语义分析、类型检测等思想;通过实现简单tensor语言的实践,进一步培养具备解决复杂计算机工程问题设计/开发的实践能力。

有两个题目,二选一。

第一题:关于Tensor的编程设计

本实验分为两部分,如下所示

第一部分:简易tensor编程语言的设计和实现

tensor(张量,多维数据数组)是大多数机器学习采用的数据结构。本实验拟设计一种支持tensor的简易编程语言,主要功能如下:

(1)数据:随机生成,one,zero,多层列表

(2)操作:

(2.1)数据生成:算术操作:加法+,乘法(点乘.,叉乘*)

(2.2)形状操作:shape,reshape,size

(2.3)切片操作:slice

(2.4)输出操作:print

(2.5)卷积操作(选做):conv

(2.6)会话与图计算(选做):session,run

(3)条件语句:其中条件为整数的比较,其他情况可选做

程序运行要求:输入一段tensor简易语言程序,分析并运行程序

提示:先分析语法(文法设计),再实现计算功能(语义设计)

第二部分:简易tensor语言的类型检测

目前简易tensor语言主要有两种数据类型,即整数和tensor,其中tensor的纬度会影响数据的操作。请设计一个简易tensor语言的类型检测器,当给定一个tensor程序,分析程序中每个语句的可见变量的类型并输出。以下是一个示例:

    y=1;  //输出y: int

    x=[1,2]; //输出y: int, x: tensor(2)

    y=[[3,4,5],[6,7,8]]; //输出x: tensor(2), y: tensor(2,3)

    z=x*y; //输出x: tensor(2), y: tensor(2,3), z: tensor(3)

    print(z);  //输出x: tensor(2), y: tensor(2,3), z: tensor(3)

    y=[[3,4],[5,6],[7,8]]; //输出x: tensor(2), y: tensor(3,2), z: tensor(3)

    z=x*y  //有错误,x的纬度和y的纬度不匹配

第二题:关于 lisp语言解释器和分组加密算法语言

本实验分为两部分,如下所示

第一部分:Lisp 语言解释器

Lisp 是一种函数式编程语言,每一个表达式都可以计算出一个结果。Lisp 表达式 有两种形式——原子或列表。所谓原子,简单的讲就是一个字符串,可以使用的字符有 大小写英文字母、数字和 +-*/!?=<>_ ;而列表则是由若干个表达式和一对括号在两侧括起构成。

原子的例子:


    12

    +

    John

    Burger

列表的例子:

    (f a b c)

    (define x (+ 2 3))

(+ 1 1)

在本题中,基本数据有自然数和布尔值,基本的函数有四个:加减乘除(整除),还有一些Lisp 预先定义好的函数eq?,define,lambda,cond。

(1)程序分析与解释:

(1.1)输入从标准输入读入数据。一段 Lisp 程序,其中每行是一个表达式。

(1.2)输出到标准输出。对于 Lisp 程序中每一行的表达式,相应输出一行。

如果该表达式发生语法错误或者语义错误,则输出syntax error或semantic error;如果使用了 define 函数则输出 define ,否则输出该表达式的值。

(2)类型检测

(2.1)输入从标准输入读入数据。一段 Lisp 程序,其中每行是一个表达式。

(2.2)输出到标准输出。对于 Lisp 程序中每一行的表达式,相应输出一行。

如果该表达式发生语法错误或者语义错误,则输出syntax error或semantic error;如果使用了 define 函数则输出其定义的值的类型(int,boolean,fun),否则输出该表达式的值的类型。


第二部分:分组加密算法语言

分组加密算法大都是由一些基本的操作组成,比如置换、S 盒等等。再加上一些简单的逻辑控制语句,就可以清晰地描述出该算法的内部结构。基于此,本实验拟设计了一种简单的语言,用来描述分组加密算法的逻辑结构。

该语言的结构大致如下:

变量声明部分

BEGIN

加密算法部分

END

一、变量声明部分

该语言仅有两种变量,分别为二进制串变量和循环控制变量。在此处声明的变量均为二进制串变量,格式为:变量名 (长度),例如:

state(64)

key(10)

tmp(5)

beta(20)

循环控制变量为整数类型,变量名仅为一个小写英文字母,因此总共只有 26 个循环控制变量,不需要声明即可在加密算法部分直接使用。

二、加密算法部分

在这一部分顿顿设计了三种句法,分别为赋值、循环和分组。

试实现一个分组加密器,可以把顿顿的代码转化为相应的加密程序。即根据输入的置换表、S 盒、代码,对若干组明文和密钥进行加密,输出相应的密文。

(1)输入格式:

从标准输入读入数据。

第一行包含用空格分隔的两个整数 n 和 m,表示有 n 个置换表 和m个S盒,保证0 ≤ n,m ≤ 10,然后依次输入这些置换表和S盒。

每个置换表占两行,第一行包含用空格分隔的两个正整数 a 和 b,分别表示该置换 表对应输入、输出二进制串的长度,保证 1 ≤ a, b ≤ 64;第二行 b 个用空格分隔的整数, 其中每个整数都在 [0, a) 范围内,表示该置换表的内容。

每个 S 盒占两行,第一行包含用空格分隔的两个正整数 c 和 d,分别表示该 S 盒对 应输入、输出二进制串的长度,保证 1 ≤ c, d ≤ 8;第二行 2c 个用空格分隔的整数,其 中每个整数都在 [0, 2d ) 范围内,表示该 S 盒的内容。

从第 2 + 2n + 2m 行开始,输入顿顿的代码。END 位于代码最后一行,可以借此判 读是否读入了全部代码。

接下来一行包含一个正整数 k,表示有 k 组数据需要加密,保证 k ≤ 10。

在最后的 2k 行里,每两行包含一组加密数据,其中第一行为明文、第二行为密钥, 皆以 01 串的形式给出。

(2)输出格式

输出到标准输出。

串表示相应的密文。 01 行,每行一个 k 输出

实验报告统一命名为: 深大2019编程语言-学号-姓名-实验报告二.doc
本次实验除了实验报告,还需提交程序,把所有程序打包成以下文档
深大2019编程语言-学号-姓名-实验报告二(程序).zip
截止日期:2019.7.3

你可能感兴趣的:(实验报告二 (编程语言分析及其应用))