语言定义 的子部分

8.1 语法定义


语法使用非严格的EBNF语法描述。

文件单元
FileUnit = PkgDef (ImportDef) Decl*

包定义
PkgDef = package ID (.ID)*

依赖导入(可选)
ImportDef = 'import' STRING as ID; |'{' (STRING as ID; )* '}'
声明定义
Decl = ScopeDecl | VarDecl | FuncDecl | EnumDecl | StructDecl | UnionDecl | InterfaceDecl | ClassDecl | EntrustDecl | ~

表达式
Exp = BaseExp | DotExp | UnaryExp | BinaryExp | TernaryExp | NewExp | PriorityExp

基础表达式
BaseExp = IDExp | ConstExp | CallExp | ArrarExp | ThisExp | SuperExp
IDExp = ID
ConstExp = c
CallExp = ID '(' ArgList')'
ArrarExp = ID '[' Exp ']'
ThisExp = 'this'
SuperExp = 'super'

成员访问表达式
DotExp = BaseExp ( '.' BaseExp)*  //BaseExp不得是ConstExp

一元表达式
UnaryExp = UnaryOP BaseExp
UnaryOP = '-' | '+' | '--' | '++' | '~' | '!'
二元表达式
BinaryExp = Exp BinaryOP Exp
BinaryOP = '+' | '-' | '*' | '/' | '%' |
            '&' | '|' | '&&' | '||' |
            '<<' | '>>' | '>>>' |
            '<' | '>' | '<=' | '>=' |
            '==' | '!=' | '=' |
            
三元表达式
TernaryExp = Exp '?' Exp ':' Exp

括号表达式
PriorityExp = '(' Exp ')'

作用域声明
ScopeDecl = ( 'public' | 'protected' | 'private' ) ':'

变量声明
VarDecl = Scope Type 'id' [=initExp] ';'
Scope = ['public' | 'protected' | 'private'| 'extern' | 'static'] 
Type = ['const' ] 'id'( '.' 'id')*

代理变量
Scope Type 'id''(' [ arglist] ')' 'delegate' ';'

闭包变量
Scope Type 'id''(' [ arglist] ')' 'closure' ';'

函数申明
VarDecl = Scope Type 'id''(' [ arglist] ')'[@override] [@cfun] [const] [final] (';' |  funbody )
arglist = argitem (',' argitem)*
argitem = type ['id']
funbody = BlkState
BlkState = '{' [Statement] '}'
Statement = ( BlkState | ExpState | IfState | ElseifState |
			ElseState | SwitchState | ForState | DoState |
			WhileState | GotoState | BreakState | ContinueState |
			ReturnState )*
	

TypeDecl = EnumDecl | StructDecl |  UnionDecl |EntrustDecl
FuncDecl = Type 'id''(' [ arglist] ')' '=' Serial
	Serial = 'u32'
	枚举声明
	EnumDecl = 'enum' id [: BaseType]'{' EnumItem* '}'
	BaseType = 基本整数类型
	EnumItem = 'id'[=initExp] ','

8.2 代码结构


每一个文件都必须定义一个作用域名,其他内容在此作用域定义。

生成的声明符号都在该作用域内,只能通过该作用域才能访问代码文件中声明的符号内容。

代码结构

包声明

package pkg.pkg2;

依赖单元

Import file=“dir/file.ext”;
Import file2=“dir/file2.ext”;

或者

Import{

	file=“dir/file.ext” ;
	file2=“dir/file2.ext”;
}

枚举定义

enum name : int32{
    item=0,
    item2=23,
    …
}

结构体定义

Struct name{
	Int32 i32;
	Union{
		Int32 s32;
		Flt32 f32;
    }
}

联合体定义

Union name{
	Int32 s32;
	Flt32 f32;
	Struct{…}
}

接口定义

Interface IFather{
    void eat(int32 arg);
}
Interface IFather2{
    void say(int32 arg);
}
Interface IChild :[ IFather,IFather2 ]{
    void walk(int32 arg);
}

类定义

Class Parent {
Private:
        Int32 mI32;
Public	Flt32 mF32;
Public:
    Void print(){}
Protected void toString(){}
    Virtual void vfun()=0;
}

Class child: Parent :[ IChild ]{
    void eat(int32 arg) @override{}
    void say(int32 arg) @override{}
    void walk(int32 arg) @override{}
    void vfun()@override{}
}

8.3 关键字


airlang 的关键字分为两种:普通关键字,宏关键字。 两者差别不大,但是宏关键字有特殊的标记作用,一般用于注解一些信息。

宏关键字

关键字注解
@file代码中获取文件的名称字符串
@line代码中获取代码所作行号数字
@func代码中获取函数声明字符串
@debug用于标记只在debug标志下启用的代码
@NotNulptr用于标记需要检查函数的指针参数非空
@override标记非静态成员函数是重写父类的函数

普通关键字

固定位宽类型关键字注解位宽(bit)
void空,一般用于表示无返回值0
bool布尔类型8
flt3232位单精度浮点32
flt6464位双精度浮点32
int88位有符号整数8
int168位有符号整数16
int328位有符号整数32
int648位有符号整数64
uint88位无符号整数8
uint1616位无符号整数16
uint3232位无符号整数32
uint6464位无符号整数64
char字符8

可变位宽类型的位宽由编译的目标CPU架构有关。

可变位宽类型关键字注解CPU32CPU64
sint有符号整数3264
uint无符号整数3264
uintptr指针3264
cstring字符串指针3264
修饰关键字注解
static静态
public完全公开的
protected对部分成员公开的
private私有的 成员
const常量化,只读
friend友元定义
分支关键字注解
if比较分支
elsif次比较分支
else比较默认分支
for循环
foreach循环
while循环
do循环
break跳出循环
continue继续下一轮循环
goto跳转到标签
return函数返回
类型定义关键字注解
enum枚举
struct结构体
union联合体
interface接口
class
entrust委托指针
其他关键字注解
false
true
nullptr
this
super

8.4 操作符


成员访问操作符

成员访问操作符的优先级最高。

成员访问操作符优先级注解
.0成员访问
.?0带null检查的成员访问

一元操作符

一元操作符优先级一致,主要查看其声明的先后顺序。

一元操作符优先级注解
~-10按位取反
!-10逻辑取反
--10符号取反
+-10取绝对值
++-10自增
---10自减

二元操作符

在语法解析表达式中,二元表达式最复杂的。

二元操作符优先级注解
*-20乘运算操作符
/-20除运算操作符
%-20模运算操作符
+-30加运算操作符
--30减运算操作符
<<-40左移操作符
>>-40逻辑右移操作符
>>>-40算术右移操作符
<-50小于操作符
<=-50小于等于操作符
>-50大于于操作符
>=-50大于等于操作符
==-60等于操作符
!=-60不等于操作符
&-70位与操作符
^-71位异或操作符
|-72位或操作符
&&-80逻辑与操作符
||-81逻辑或操作符

三元操作符

三元操作符主要用于比较赋值、简单的比较分支操作。

三元操作符优先级注解
? :-90

赋值操作符

赋值类操作符的优先级一致,优先级最低。

赋值操作符优先级注解
=-100赋值操作符
*=-100乘运算复合赋值操作符
/=-100除运算复合赋值操作符
%=-100模运算复合赋值操作符
+=-100加运算复合赋值操作符
-=-100减运算复合赋值操作符
&=-100位与运算复合赋值操作符
=-100位或运算复合赋值操作符
^=-100位异或运算复合赋值操作符
~=-100位取反运算复合赋值操作符
<<=-100左移运算复合赋值操作符
>>=-100逻辑右移运算复合赋值操作符
>>>=-100算术右移运算复合赋值操作符

其他操作符

括号表达式中的括号操作符,用于提升表达式的优先级,在算符优先解析算法,该系列是作为基本表达式进行解析的。

括号操作符优先级注解
()-10括号操作符
[]-10数组下标
cast-10静态类型转换
dyn_cast-10动态类型转换
()-10函数调用

8.5 类型系统


基本类型

固定位宽类型注解位宽(bit)
void空,一般用于表示无返回值
bool布尔类型8
flt3232位单精度浮点32
flt6464位双精度浮点32
int88位有符号整数8
int168位有符号整数16
int328位有符号整数32
int648位有符号整数64
uint88位无符号整数8
uint1616位无符号整数16
uint3232位无符号整数32
uint6464位无符号整数64
char字符8

可变位宽类型的位宽由编译的目标CPU架构有关。

可变位宽类型注解CPU32CPU64
sint有符号整数3264
uint无符号整数3264
uintptr指针3264
cstring字符串指针3264

枚举类型

枚举定义只能是定义整数类的值,其占用的字节数、有无符号性,通过基类标识指定。

如下所示:

enum Color:uint32{
    Red,
    Black,
}

结构体

结构体在airlang中是值类型,不会进入GC系统,除通过API分配独立的堆内存。

一般用于构成类中的共同属性。

struct Vec2{
    int32 x;
    int32 y;
}
struct Vec3 :Vec2{
    int32 z;
}

联合体

union Int32{
    int32 i32;
    struct{
        int8 [4] v4;
    }
}

接口

interface IEvent{
    void eat();
}

class Parent{
 int32 i32;

 void doing(){} 
}
class Child :Parent <IEvent>{
    int64 i64;
    void eat()@override{}
}

委托

entrust Func = void (int32,int64)@clang;