T299014 J++语言
题目背景
在这个题目中,你要尝试制作一个编译器来编译一个语言
题目描述
`J++` 语言是一个自定义语言并且是编译型语言
先通过以下代码片段来尝试理解 J++
### J++ 语言片段:
~~~
main()->int{
a->int;
a::read()->int;
b->int;
b::read()->int;
ans->int:a+b;
ans::write->int;
0::return;
}
~~~
以上是 J++ 语言代码片段,实现了a+b,
在J++中,缩进是不必要的。
程序必须执行在main函数当中,main函数为int类型,必须返回0,不返回算编译错误
函数的声明:
`函数名称 引用符 数据类型`
其中,函数名称为不为数字开头且不含空格的字符串,引用符是 `->` 或者是 `>>`,两者等价,没有区别,数据类型共有6种:`int`,`float`,`string`,`bool`,`void`,`指针类型为前五种类型任意一个加上*号`,
**函数后面跟的数据类型并不是返回值类型!**
函数后方的数据类型是传入参数的数据类型,如果没有参数请加一个int`函数名称()->int`
如`a->int`,声明一个 `int` 类型的 `a`,`b>>int*` 声明一个 `int` 类型的指针变量
**注意!void类型与c++不一样**
void类型可以存储任何类型的数据
特别的,指针变量赋值跟 C++ 类似,需要注意的是在 J++ 中赋值为
~~~
a->int;
b->int*;
b:&a;
*b:a;
~~~
在这个代码中又出现了新的符号`:`,这个符号表示赋值
继续回到代码一当中:`read()`和`write()`
read是读入函数,write是输出函数,通过`::`传递参数给函数(所有函数都是这样调用的,如果有多参数则如下代码)
~~~
a,b,c::read()->int;
~~~
如有多参数则应该使用`,`隔开变量。
调用函数后方的`->`代表参数传递类型,如有多参数类型不同,见以下代码。
~~~
a,b,c::read()->int[a,c]->float[b];
~~~
在数据类型后方加入一对`[]`,里面填写该类型的变量
如果不想写`->数据类型`则可在函数外侧对该函数进行准确声明:`read(a,b,c)->int[a,b]->float[b];`,然后在下方代码调用时可直接写`a,b,c::read();` 如果是自定义函数,见下文
第n个片段
~~~
sum()->int[2[a,b]]{//新建一个有2个int参数sum函数,参数名分别为a,b
for i:a ; iint[2[a,b]]{}`
代表新建一个函数,有两个int类型变量
如果要新建一个有多参数且类型不同的函数,两种方法:`a(a,b,c)->int[a,b]->bool[c]`,在这里面变量类型是固定的,如果希望变量随时改动,可以这样`a(a,b,c)`,但是需要在调用函数时使用前文所提到的调用方法
如果希望变量数量不固定,可以这样定义:`a(a...)`,在函数声明时在括号中先写几个变量名,代表最少数量,后方加三个点,即可传参数量多,但对于一般的函数,传太多的参数是没有用的。
一般这种方法是用来对write函数声明使用的
如果函数的变量值是`void`,则该函数可以穿任何类型变量且不用在调用时填写参数类型
注释:`//`后方的内容直接跳过
循环结构:`for i:a;i
输入格式
好几行,表示 `J++` 代码片段
然后是输入数据,不超过 $3$ 行,全部为 `int` 类型
### 输入数据不一定和程序应输入数量相等
输出格式
如果报错,先输出一个`error\n`,“\n为换行符”再输出错误行数
**你需要使用序数词的缩写形式,如第一行输出1st,第二行2nd等等**
**可能有多行报错,每行一个,全部输出**
运行成功则按照程序运行输出输入数据的答案
说明/提示
#### 本题数据纯手造
对于10%的数据,程序没有输入
对于30%的数据,程序不超过10行,无函数定义和循环结构
对于50%的数据,程序不超过15行,有循环结构无函数定义
对于70%的数据,程序不超过20行,有函数定义无循环结构
对于100%的数据,程序不超过30行,有函数定义有循环结构
基数词序数词对照表
| 基数词 | 序数词 | 基数词|序数词| 基数词|序数词|
| :----------: | :----------: | :----------:| :----------:| :------:| :---------:|
| 1 | 1st | 2 | 2nd | 3 | 3rd | 4 | 4th |
| 5 | 5th | 6 | 6th | 7 | 7th | 8 | 8th |
| 9 | 9th | 10 | 10th | 11 | 11th | 12 | 12th |
| 13 | 13th | 14 | 14th | 15 | 15th | 16 | 16th |
| 17 | 17th | 18 | 18th | 19 | 19th | 20 | 20th |
| 21 | 21st | 22 | 22nd | 23 | 23rd | 24 | 24th |
| 25 | 25th | 26 | 26th | 27 | 27th | 28 | 28th |
| 29 | 29th | 30 | 30th |