B. [Sleeping Cup #10] Trivial Script Interpretation

    传统题 文件IO:interpretation 1000ms 512MiB

[Sleeping Cup #10] Trivial Script Interpretation

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

注意

本题需要使用文件读写(interpretation.in / interpretation.out)。

题目背景

在一个宁静的夜晚,Sleeping Jellyfish 正在设计一个简单的脚本语言解释器。这个解释器能够处理几种基本的数据类型和操作,包括变量定义、赋值、输出、加减运算等。由于 Sleeping Jellyfish 经常打瞌睡,他需要你帮忙实现这个解释器的核心功能,确保它能正确执行给定的脚本指令。

题目描述

实现一个简单的脚本语言解释器,支持以下数据类型和操作:

  1. 数据类型:

    • string:字符串类型
    • int:整数类型
    • char:字符类型
  2. 支持的操作:

    • 变量定义:为不同类型的变量赋予初始值
    • set:修改已有变量的值
    • output:输出变量的值或输出值
    • add:对变量进行加法操作(字符串为拼接,其他类型为数值相加)
    • minus:对变量进行减法操作(仅支持 intchar 类型)
    • for:循环执行一条指令

解释器需要读取输入文件中的指令序列并执行,将 output 操作的结果输出到指定文件中。

输入格式

输入文件第一行为一个整数 nn,表示共有 nn 条指令。

接下来 nn 行,每行是一条指令,格式如下:

  1. 变量定义:

    • string <变量名> <字符串常量>
    • int <变量名> <整数常量>
    • char <变量名> <字符常量>
  2. 赋值操作:

    • set <变量名> value <常量>(值的类型与变量定义时的类型一致)
    • set <变量名> variable <变量名>(后面的变量的类型与前面的变量定义时的类型一致)
  3. 输出操作:

    • output value <常量>(若输出 char 类型的常量,则输出它本身)
    • output variable <变量名>(若输出 char 类型的变量,用 [ASCII <字符的 ASCII 编码>] 格式输出)
  4. 加操作:

    • add <变量名> value <常量>(变量为 intstring 类型时,值的类型与变量定义时的类型一致;变量为 char 类型时,值为 int 类型,表示 ASCII 编码)
    • add <变量名> variable <变量名>(后面的变量的类型与前面的变量定义时的类型一致,仅支持 intstring 类型)
  5. 减操作:

    • minus <变量名> value <常量>(仅支持 intchar 类型,变量为 int 类型时,值的类型与变量定义时的类型一致;变量为 char 类型时,值为 int 类型,表示 ASCII 编码)
    • minus <变量名> variable <变量名>(后面的变量的类型与前面的变量定义时的类型一致,仅支持 int 类型)
  6. 循环:

    • for <循环次数> <循环执行的脚本>(循环执行的脚本中不会出现循环)

数据保证:

  • 1n10001 \le n \le 1000
  • 所有变量名的长度不大于 5050
  • 变量名只包含大小写字母和数字。
  • 变量名不由数字开头。
  • 同一个变量不会定义多次。
  • 未定义的变量不会被使用。
  • 参与 char 类型运算的整数常量在 [127,127][-127, 127] 范围内。
  • 其余所有的整数常量在 [0,2×109][0, 2 \times 10^9] 范围内。
  • 所有字符串常量的长度不大于 77
  • 字符串常量中只包含大小写字母和数字。
  • 字符常量只可能为大小写字母和数字。
  • 所有字符串变量的值在运算期间长度始终不超过 100100
  • 循环次数为不大于 100100 的整数常量。
  • 循环体有且仅有一条指令。
  • 循环内不会嵌套循环。
  • 运算可能会发生溢出,你需要按以下方式处理:
    • 使用 32 位无符号整数 uint32_t 进行整数运算。
    • 使用 8 位无符号整数 uint8_t 进行字符运算。
    • 输出变量的值时,临时转为对应大小的有符号整数(int32_tint8_t)再输出。
    • 特别注意:使用 std::cout 输出 int8_t 类型的变量时,请先转换为 int32_t 类型。

输出格式

对于每条 output 指令,将对应变量的值输出到文件中,每行一个结果。

样例

6
string a hello
output variable a
add a value world
output variable a
set a value hi
output variable a
hello
helloworld
hi
9
int x 10
char c a
add x value 5
minus c value 65
output variable x
output variable c
int l 1000000000
add l value 2000000000
output variable l
15
[ASCII 32]
-1294967296
7
char x a
for 100 add x value 1
output variable x
string t 123
for 3 add t value 666
for 3 add t variable t
output variable t
[ASCII -59]
123666666666123666666666123666666666123666666666123666666666123666666666123666666666123666666666

样例 1 解释

  1. 第一条指令 string a hello:定义字符串类型变量 a,初始值为 hello
  2. 第二条指令 output variable a:输出变量 a 的值,此时 ahello,故输出 hello
  3. 第三条指令 add a value world:对字符串变量 a 执行加法操作(字符串拼接),将 world 追加到 a 后,a 的值变为 helloworld
  4. 第四条指令 output variable a:输出此时 a 的值 helloworld
  5. 第五条指令 set a value hi:修改变量 a 的值为 hi
  6. 第六条指令 output variable a:输出修改后 a 的值 hi

样例 2 解释

  1. 第一条指令 int x 10:定义整数类型变量 x,初始值为 10
  2. 第二条指令 char c a:定义字符类型变量 c,初始值为字符 a(对应的 ASCII 码为 97)。
  3. 第三条指令 add x value 5:对整数变量 x 执行加法操作,x = 10 + 5 = 15
  4. 第四条指令 minus c value 65:对字符变量 c 执行减法操作(基于 ASCII 码值计算)。 c 的 ASCII 码值变为 97 - 65 = 32,对应字符为空格。
  5. 第五条指令 output variable x:输出整数变量 x 的值 15
  6. 第六条指令 output variable c:输出字符变量 c 的值(空格字符),故输出为 [ASCII 32]
  7. 第七条指令 int l 1000000000:定义整数类型变量 l,初始值为 1000000000
  8. 第八条指令 add l value 2000000000:对整数变量 l 执行加法操作。1000000000 + 2000000000 = 3000000000,但由于 int 类型的取值范围为 [-2^31, 2^31-1](即 [-2147483648, 2147483647]),3000000000 超出此范围导致整数溢出。在 C++ 中,有符号整数溢出后结果为 3000000000 - 4294967296 = -1294967296(按模 4294967296 计算)。
  9. 第九条指令 output variable l:输出溢出后的 l-1294967296

样例 3 解释

  1. 第一条指令 char x a:定义字符类型变量 x,初始值为字符 a(对应的 ASCII 码为 97)。
  2. 第二条指令 for 100 add x value 1:对字符变量 x 执行 100 次加法操作,每次加上 1x = 97 + 100 = 197,但由于 char 类型的取值范围为 [-128, 127]3000000000 超出此范围导致整数溢出。在 C++ 中,有符号整数溢出后结果为 197 - 256 = -59(按模 256 计算)。
  3. 第三条指令 output variable c:输出溢出后的字符变量 x 的值(ASCII -59 字符),故输出为 [ASCII -59]
  4. 第四条指令 string t 123:定义字符串类型变量 t,初始值为 123
  5. 第五条指令 for 3 add t value 666:对字符串变量 t 执行 3 次加法操作(字符串拼接),将 3666 追加到 t 后,t 的值变为 123666666666
  6. 第六条指令 for 3 add t variable t:对字符串变量 t 执行 3 次加法操作(字符串拼接),连续 3 次将 t 追加到 t 后,相当于将自身重复 2^3 = 8 次,t 的值变为 123666666666123666666666123666666666123666666666123666666666123666666666123666666666123666666666
  7. 第七条指令 output variable t:输出修改后 t 的值 123666666666123666666666123666666666123666666666123666666666123666666666123666666666123666666666