2. Yaklang 中的语句
要了解一个 Yaklang 的基础程序,我们可以从基础结构开始了解:
标准的 Yaklang 脚本或程序,他的文件应该是以 .yak 结尾的(我们之后简称 Yaklang 为 Yak);
Yak 代码分为至少一个语句,最基础的语句之间可以通过 ; 分割,但是我们也可以通过换行(\n)来分割语句;
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>, expr1 | assert 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 ;