打印

vsfvm脚本语法

[复制链接]
1194|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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. 变量/常量定义可以在代码中任何有效位置定义变量,语法如下:
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));


使用特权

评论回复

相关帖子

沙发
hicoo147| | 2020-2-22 20:00 | 只看该作者
去干吗啊~~~伤心啊~~~

使用特权

评论回复
发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

325

帖子

8

粉丝