本帖最后由 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));
|