美文网首页
实验报告二 (编程语言分析及其应用)

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

作者: Xindolia_Ring | 来源:发表于2019-06-19 20:45 被阅读0次

    实验目的与要求:
    目的:设计与实现简易编程语言及其分析算法,包括简易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

    相关文章

      网友评论

          本文标题:实验报告二 (编程语言分析及其应用)

          本文链接:https://www.haomeiwen.com/subject/wrrxxctx.html