本帖最后由 vsfopen 于 2018-7-19 11:21 编辑
vsfvm设计的时候,只考虑了资源有限的MCU硬件,所以在语法上做了非常精简,并没有太多语法特性,不过作为简单的胶水语言也足够应用了。vsfvm最早采样dart的语法,语法上可以看到非常多的C语言的影子,当然也做了一些针对脚本语言的优化。vsfvm具备lexer层,也就是说,可以通过增加python的lexer来支持python的语法。不过目前已经实现的是dart语法。
1. 注释兼容C语言的注释,包括//和/**/。
2. 数值
和C语言一样,可以使用普通10进制的数值、可以用0x1234ABCD或者0X1234ABCD来指定16进制、可以用0b01000000或者0B01000000来指定二进制的数值。数值是32位的。
3. 变量/常量定义可以在代码中任何有效位置定义变量,语法如下:
var a; // 定义变量a
var b = 1; // 定义变量b,并赋值为1
print(b, '\r\n');
var c = a + 1;
print(c, '\r\n');
const d = 3; // 定义常量,必须初始化为常量(表达式不含变量)
变量定义不需要指定变量类型,在运行时会决定类型,比如:
var pin = gpio_create(0, 1);
这里gpio_create返回一个gpio类型的实例,所以pin的类型就是gpio。
4. 运算
基本兼容C语言的运算和优先级。不支持++,--操作;不支持+=,-=之类的操作。
5. 流程控制
支持if和while,目前不支持for,do,switch,break,continue。以后有机会增加(虚拟机可以支持这些,编译器没支持)
语法如下(大括号不能省):
if (expression)
{
....
}
else if (another_expression)
{
....
}
else
{
....
}
while (expression)
{
....
}
6. 函数
函数定义语法如下:
func_name(a, b)
{
return a + b;
}
不需要定义返回值类型,函数参数可以使用普通表达式,可以使用实例,支持引用:
func_name(gpio pin, value)
{
if (value)
{
pin.set();
}
else
{
pin.clear();
}
}
上面的代码里,函数第一个参数类型为gpio,这里不可省略,否则编译器无法有效识别函数中的pin.set和pin.clear。
func_name(ref a, b)
{
a = b;
}
函数的参数一般为形式参数,如果参数前加了ref,就会变为引用参数,函数内部对引用参数的修改,会影响原变量。
函数调用方式和C语言兼容。
7. 线程
vsfvm支持多任务,可以动态建立线程(实际以协程方式运行,没有优先级)
语法如下:
thread_func(gpio pin)
{
while (1)
{
timer_delayms(100);
pin.toggle();
}
}
thread(thread_func, gpio_create(0, 0));
|