vsfvm脚本语法

[复制链接]
 楼主| vsfopen 发表于 2018-7-19 11:02 | 显示全部楼层 |阅读模式
本帖最后由 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. 变量/常量定义可以在代码中任何有效位置定义变量,语法如下:
  1. var a;  // 定义变量a
  2. var b = 1; // 定义变量b,并赋值为1
  3. print(b, '\r\n');
  4. var c = a + 1;
  5. print(c, '\r\n');
  6. const d = 3; // 定义常量,必须初始化为常量(表达式不含变量)
变量定义不需要指定变量类型,在运行时会决定类型,比如:
var pin = gpio_create(0, 1);
这里gpio_create返回一个gpio类型的实例,所以pin的类型就是gpio。

4. 运算
基本兼容C语言的运算和优先级。不支持++,--操作;不支持+=,-=之类的操作。

5. 流程控制
支持if和while,目前不支持for,do,switch,break,continue。以后有机会增加(虚拟机可以支持这些,编译器没支持)
语法如下(大括号不能省):
  1. if (expression)
  2. {
  3.   ....
  4. }
  5. else if (another_expression)
  6. {
  7.   ....
  8. }
  9. else
  10. {
  11.   ....
  12. }

  13. while (expression)
  14. {
  15.   ....
  16. }

6. 函数
函数定义语法如下:
  1. func_name(a, b)
  2. {
  3.   return a + b;
  4. }
不需要定义返回值类型,函数参数可以使用普通表达式,可以使用实例,支持引用:
  1. func_name(gpio pin, value)
  2. {
  3.   if (value)
  4.   {
  5.     pin.set();
  6.   }
  7.   else
  8.   {
  9.     pin.clear();
  10.   }
  11. }
上面的代码里,函数第一个参数类型为gpio,这里不可省略,否则编译器无法有效识别函数中的pin.set和pin.clear。
  1. func_name(ref a, b)
  2. {
  3.   a = b;
  4. }
函数的参数一般为形式参数,如果参数前加了ref,就会变为引用参数,函数内部对引用参数的修改,会影响原变量。
函数调用方式和C语言兼容。

7. 线程
vsfvm支持多任务,可以动态建立线程(实际以协程方式运行,没有优先级)
语法如下:
  1. thread_func(gpio pin)
  2. {
  3.   while (1)
  4.   {
  5.     timer_delayms(100);
  6.     pin.toggle();
  7.   }
  8. }
  9. thread(thread_func, gpio_create(0, 0));


hicoo147 发表于 2020-2-22 20:00 | 显示全部楼层
去干吗啊~~~伤心啊~~~

90

主题

325

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部