青语言使用文档

语法概览

创建于 2023-04-22 / 最近更新于 2023-04-25 / 2235
字体: [默认] [大] [更大]

青语言设计中的一个核心点就是:语法尽量简单

青语言的语法主要参考了JavaScript语言,需要学习的概念较少,是一门难度极低的编程语言。在正式开始学习青语言的语法细节之前,我们先总体上了解一下青语言的语法设计。这部分适合有编程基础的使用者快速掌握青语言,如果没有编程基础看不懂也没关系,我们会在之后更详细地进行介绍。

青语言代码输入解释器后,会首先分割为语法元素,可以分为4种语法元素——关键字、符号、变量、函数
其中关键字和符号是固定的,关键字包括:

元    空    真    假    如果    再则    否则    当 
执行    直到    返回    跳出    继续    取反
异步    等待    尝试    排查    例行    遍历

由于关键字本身也是中文,如果和其他中文代码连在一起,会造成断句歧义,所以请记住,关键字需要能够和其他代码分隔开,包括通过空白、符号等实现间隔,最简单的方式就是前后留空白。

第二种语法元素是符号,包括:

;     中文分号开头表是单行注释
;; 连续两个中文分号是多行注释的开头,一直到另一个连续的双分号
,     逗号没有具体的意义,在青语言中仅表示间隔,解析期会被丢弃,同时支持中英文两种逗号
”“      中文的双引号用来表示字符串
、     中文的顿号用来向函数传递单个参数

{ }    【 】    ( )    《 》

+    -    *    /    %    +=    -=    *=    /=    %=
>    <    ==    >=    <=    !=    <>    
&&    ||
=    :

部分符号我们还提供了对应的中文,但是要注意一点,符号会自动作为语法中的分隔符,所以使用的时候可以连着其他代码一起写,但是使用中文替代时,需要前后添加空白,以避免断句歧义。符号对应的中文包括:

加    减    乘    除以    模    加等    减等    乘等    除等    模等
大于    小于    等于    大于等于    小于等于    不等于
且    或
为    设为

除了固定的关键字和符号外,剩下的就是用户可以自定义的变量和函数了,对于这两种语法元素,青语言使用了简单的方式进行标记。

#开头的都是变量,不能是单独的#号,语法解析上是从#号开始直到下一个分隔标记,包括空白或者符号。例如:

#变量1    
#甲    
#乙

@开头的都是函数,不能是单独的@号,语法解析上是从@号开始直到下一个分隔标记,包括空白或者符号。例如:

@显示  
@读文本文件

下面是基础语法概览

第一个程序
@显示、“你好,编程世界”
注释

从分号到行末的都是注释,注释的内容不会作为代码执行,以两个;;开头是多行注释,直到另一个;;

;这是一行注释,这里的内容作为对代码的说明,不会被执行

;;
    这是一段注释
    支持多行注释
    这部分内容都不会执行
;;
数据类型
空     ;空类型,表示不存在或者值为空


真     ;逻辑类型,表示逻辑真


假     ;逻辑类型,表示逻辑假


0xFF   ;二进制类型,表示二进制数据


123    ;这是整数


4.56   ;这是小数


“这是一段字符串”    ;用中文双引号括起来的部分是字符串
赋值
#甲 : 123      ;用冒号表示在当前语境给变量#甲绑定值123 


#乙 = 4.56      ;用等于号表示顺着语境链向上查找变量#乙并绑定值4.56
取值

直接调用变量名,解释器会根据当前语境向上查找变量对应的值,并将值返回,例如经过上面的赋值之后,我们输入

#甲

将会看到这样的输出

>> 123

这里,前面的>> 是输出提示符,后面的123是变量对应的值。

中缀运算

事实上,上面提到的赋值语句其实本事就是是一种中缀运算。常见的中缀运算符还包括

1+2*3/4-5  ;四则算术运算


5%3    ;取模运算


2>3    ;比较运算,包括 >, <, >=, <=, ==, <>,


1 小于 2 ;中缀运算都有对应的中文包括  加、减、乘、除以、模、大于、小于、大于等于、小于等于、等于、不等于 


        ;注意,使用中文中缀符时,一定要注意前后要有空格或其他空白字符,用作代码的分割标识





#甲 设为 123  ;设为用于赋值,对应 :号


#乙 为 4.56   ;为用于赋值,对应 = 号
数组
【1,2,3】   ;中括号表示数组,内部存放多个元素,可用逗号分隔


【1 2 3】    ;不用逗号分隔也是可以的


【1,2.3,“你好”】    ;数组可以存放任意类型的元素
对象
#张三 = @{    ;@{ 开头表示对象
	#姓名: “张三”      ;对象本质上也是语境,对象的属性使用 : 定义,本质上是在本级语境执行绑定
	#年龄: 15
}
路径

类似于中文中的组词,当我们把变量名组合起来,就表示变量的访问路径

#数组 = 【1,2,3】

#数组#1    ;这里先访问到变量#数组,然后在#数组里访问#1


          ;这里的#1表示访问序号为1的元素,数组序号从0开始,所以#1表示访问的是第2个元素,显示 2


#对象 = @{

	#姓名: “张三”

	#年龄: 15

	@显示姓名: @【】{

		@显示、#姓名
	}
}

#对象#姓名     ;这里先访问到#对象,再在#对象里访问#姓名,显示 “张三”
#对象@显示姓名【】   ;对象里的函数会在对象语境内执行,这里会显示#对象内的#姓名属性
自定义函数
@双倍 = @【#某】{              ;@开头表示是函数,定义函数的格式是 @【参数列表】{执行语句...}
	返回 2 * #某           ;返回语句用于返回值
}





@双倍【3】     ;调用函数的方式是在函数名后面加上【实参列表】


@双倍、3       ;如果函数只有一个参数,可以使用顿号简化传参


              ;以上两种调用方式等价,返回 6
分支
如果 2 < 1 {
	@显示、“条件为真”    ;由于分支的判断条件为假,这个代码块不会执行
}否则{

	@显示、“条件为假”   ;由于分支的判断条件为假,所以执行这个代码块
}


;如果存在多种可能,我们可以使用“再则”进行多次判断
#甲 = 3

如果 #甲 等于 1 {
	@显示、“变量#甲的值为1”
}再则 #甲 等于 2 {
	@显示、“变量#甲的值为2”
}再则 #甲 等于 3 {
	@显示、“变量#甲的值为3”
}否则 {
	@显示、“变量#甲的值大于3”
}
循环
#序 = 1                   ;设置循环控制变量初始值为 1


当 #序 小于等于 10 {       ;当#序小于等于10时,循环执行

	@显示、#序             ;这里会显示从1到10

	#序 加等 1             ;每次循环让#序自增1
}



当 #次:1,#次 小于等于 5,#次 加等 1 { ;当语句后面跟随3个语句
	@显示、#次                        ;分别是定义循环控制变量,循环条件,每次循环结束对控制变量的操作
}


#某 = 1


执行 {                    ;先执行后判断循环控制条件,至少执行一次
	@显示、#某
	#某 加等 1

}直到 #某 等于 5
多任务
@斐波那契=@【#某】{如果 #某 小于 2 { 返回 #某}否则 { 返回 @斐波那契【#某-1】+@斐波那契【#某-2】}}


;使用 @分支 函数开启新的任务,注意这里传递的参数是代码块,但是独立的{}会被认为是对象
;这里我们在{}前加了一个关键字 元 ,表示不对{}求解,其仍然表示代码块

@分支、元{@显示、@斐波那契、30}



;使用 @并行 函数,一次开启多个任务

@并行、【


	元{@显示、@斐波那契、30}


	元{@显示、@斐波那契、30}


	元{@显示、@斐波那契、30}


】
1 人点赞过