Skip to main content

2. Yaklang 中的语句

要了解一个 Yaklang 的基础程序,我们可以从基础结构开始了解:

  1. 标准的 Yaklang 脚本或程序,他的文件应该是以 .yak 结尾的(我们之后简称 Yaklang 为 Yak);

  2. Yak 代码分为至少一个语句,最基础的语句之间可以通过 ; 分割,但是我们也可以通过换行(\n)来分割语句;

  3. Yak 的语句分为 13 种大类型,分别为:

语句类型目的案例描述
注释语句提供按行的注释或整块儿注释# 号注释 # Comment
普通注释 // Comment
多行注释 /* Hello YakComment */
变量声明语句自动或强制创建一个新的变量,这个变量会对应 YakVM 编译中的一个新符号Golang 风格 var abc = 123
强制创建变量 abc := 123
自动创建 abc = 123
表达式语句执行一个表达式,例如函数调用,数值运算,字符串运算等1+1
"abc".HasPrefix("ab")
赋值表达式运算赋值+表达式的简易写法a += 1
代码块主动创建一个新的定义域,执行若干行语句a=1; {a++; a += 12}
IF 控制流支持 if / elif / else if / else 风格的 IF 语句编写if a>1 {println("Hello V1ll4n")}
Switch 控制流支持 Case 多值短路特性的 Switch 语句,与 break / fallthrough 配套switch a {case 1,2,3: println("Hello")}
FOR IN 循环语句Python 风格的 For IN 语句技术实现for a in [1,2,3] {println(a)}
FOR RANGE 循环语句Golang 风格的 For Range 语句技术实现for _, a = range [1,2,3] {println(a)}
FOR 循环控制经典的 C 风格三语句 FOR 循环for i = 1; i < 10; i ++ {println(i)}
for {println("无限循环")}
Defer 延迟执行语句Golang 风格的在函数或执行体结尾执行的语句块儿或者函数调用defer func{ if recover() != nil { println("Catched") }}
Go 并发语句Golang 风格的并发语句go server.Start()
ASSERT 断言语句用以快速检查程序中是否有失败的问题,定义为 assert <expr>, expr1assert 1+1 == 2, "计算失败"

语言构建 eBNF 范式(节选)#

program: ws* statementList;
statementList: (statement(';'? | EOS? | ws*) )+;
// 语句的构成也并不复杂statement    // 基本语句    : lineCommentStmt
    // 声明变量的优先级比表达式高,这个规则匹配应该是 var a,d,b,c 只能支持 Var,特殊语法    | declearVariableExpressionStmt
    // var(...) 或者 var 单独使用,作为类型,expression 是右值    | expressionStmt    | assignExpressionStmt    | block eos
    | empty
    // 流程控制    | ifStmt /* if expr {} elif {} */    | switchStmt    | forRangeStmt    | forStmt    | breakStmt eos    | returnStmt eos    | continueStmt eos    | fallthroughStmt eos    | includeStmt    | deferStmt    | goStmt    | assertStmt    ;