/JunkLang

A Junk programming language based on C#,we want to make users die when they are using this lang.

Primary LanguageC#GNU General Public License v3.0GPL-3.0

JunkLang

1.字面值:

1.1 字节

数字使用罗马数字表示,可接受字符有:

O	0
I	1
V	5
X	10
L	50
C	100

表示范围 O ~ CCLV
任何超出范围的字面值均为非法字面值。
对于任何超出字面值的操作,需要拆分为两步或更多步进行才可以正常。

2.符号、标识符、注释和关键字

2.1 标识符

怎么可能会有标识符这种东西(

2.2 操作符

; 赋值
# 复制当前指针指向的值到它的下一个变量(不改变指针)
- 加法
+ 减法
/ 乘法
& 乘方
_ 开方
% 除法
* 求余
~ 取反
] 指针加
[ 指针减
0 指针设置到0
! 如果指针指向值为0则跳转到代码标签
| 无条件跳转到代码标签
? 定义代码标签
, 注释
^ 增加分配内存
v 减少内存分配
< 输出当前指针指向的字节
> 从控制台读取一行数字
( 按照数字输出当前字节
) 从控制台读取一个字节


3.运行时

3.1 运行时构成:

0字节变量空间(可以重分配,需要手动初始化)
一个长度为32bits指针,指向当前操作中的指针。

3.2 内存分配增加与减少
^字节值
将会增加内存分配。
假设现在有2字节长度的内存,执行以下代码后:

,,,,,,,,,,,,,,,,,,,代码开始
^CCLV	,将变量空间增加255长度
^XVI		,将变量空间增加16字节长度
,,,,,,,,,,,,,,,,,,,代码结束

此时内存空间长度为273字节。

v 可以减少内存长度
假设现在已有273字节长度

,,,,,,,,,,,,,,,,,代码开始
vCCLV	,减少255字节内存
vIIXX	,减少2字节内存
,,,,,,,,,,,,,,,,,代码结束

此时变量空间长度为0.

4.变量的访问

假设在一片长度为255的内存空间上,访问第16个字节,将其赋值为17
指针当前位置为0
则书写以下代码:

,,,,,,,,,,,代码开始
]XVI	,移动到第16字节
;XVII	,赋值为17
,,,,,,,,,,,代码结束

如果指针超出内存范围则后果是未定义的。

5.数学运算

对于数学运算-+/%*;&_均是在当前指针指向的对象上运行。

如:
-V
相当于C语言的(i为当前指针指向的变量):
i += 5

特殊运算~
~语法会把任何非0值变为0
会把0值变为1

如果值出现了溢出,则其后果是未定义的。

6.代码标签和跳转

我们可以使用下列方法制作一个死循环:

,,,,,,,,,代码开始
?V	,定义代码标签,这个标签的编号是5
|V	,无条件跳转到5号标签
,,,,,,,,,代码结束

标签编号必须是一个字节值。
每个标签编号仅可使用一次。

条件跳转:

!语法和|相同,不同之处在于!语法只在当前指针值为0时执行。

7.输入和输出
使用>语法进行输入,输入值被保存到当前指针指向的地址。
使用<语法进行输出,输出的值被保存到指针指向的地址。


8.HelloWorld例子

,分配内存
^XI			,十一字节

,初始化指针
0

,赋值出HelloWorld字符串的ASCII码
;LII		,H = 72(ASCII)
]I			,右移指针
;CI			,e
]I
;CVIII		,l
]I
;CVIII		,l
]I
;CXI		,o
]I			
;LXXXVII	,W
]I
;CXI		,o
]I
;CXIV		,r
]I
;CVIII		,l
]I
;C			,d
]I
;O			,结尾

,将指针置0,然后向右遍历输出字符串
0
?O
<
!O

vXI	,释放内存

9.粗略估算圆的面积和周长

,分配2字节的内存
^II

,指针置0
0

,输入到当前指针
>

,把这个值复制给另一个变量
#

,把指针移动到第二个变量,并且对其进行计算得到周长
]I
/II		,乘以2
/III	,乘以3(粗略的圆周率)
<		,输出周长

,把指针移动到第一个变量,并且把第二个变量复制给第一个变量
[I
#
]I
&II	,二次方
/II	,乘以3(粗略的圆周率)
<

,释放内存
vII