forked from xxq250/Nasal-Interpreter
🎨 format
This commit is contained in:
+15
-15
@@ -40,15 +40,15 @@ These two expressions have the same first set,so `LL(1)` is useless for this lan
|
||||
Problems mentioned above have been solved for a long time, but recently i found a new problem here:
|
||||
|
||||
```javascript
|
||||
var f=func(x,y,z){return x+y+z}
|
||||
(a,b,c)=(0,1,2);
|
||||
var f = func(x, y, z) { return x + y + z }
|
||||
(a, b, c) = (0, 1, 2);
|
||||
```
|
||||
|
||||
This will be recognized as this:
|
||||
|
||||
```javascript
|
||||
var f=func(x,y,z){return x+y+z}(a,b,c)
|
||||
=(0,1,2);
|
||||
var f = func(x, y, z) { return x + y + z }(a, b, c)
|
||||
= (0, 1, 2);
|
||||
```
|
||||
|
||||
and causes fatal syntax error.
|
||||
@@ -58,9 +58,9 @@ I think this is a serious design fault.
|
||||
To avoid this syntax error, change program like this, just add a semicolon:
|
||||
|
||||
```javascript
|
||||
var f=func(x,y,z){return x+y+z};
|
||||
^ here
|
||||
(a,b,c)=(0,1,2);
|
||||
var f = func(x, y, z) { return x + y + z };
|
||||
^ here
|
||||
(a, b, c) = (0, 1, 2);
|
||||
```
|
||||
|
||||
### version 1.0 parser (last update 2019/10/14)
|
||||
@@ -222,8 +222,8 @@ Better use `callfv` instead of `callfh`,
|
||||
making this process slow.
|
||||
|
||||
```javascript
|
||||
var f=func(x,y){return x+y;}
|
||||
f(1024,2048);
|
||||
var f = func(x, y) { return x + y; }
|
||||
f(1024, 2048);
|
||||
```
|
||||
|
||||
```x86asm
|
||||
@@ -530,12 +530,12 @@ func <0x2a3>:
|
||||
Now we add coroutine in this runtime:
|
||||
|
||||
```javascript
|
||||
var coroutine={
|
||||
create: func(function){return __cocreate;},
|
||||
resume: func(co) {return __coresume;},
|
||||
yield: func(args...) {return __coyield; },
|
||||
status: func(co) {return __costatus;},
|
||||
running:func() {return __corun; }
|
||||
var coroutine = {
|
||||
create: func(function) { return __cocreate; },
|
||||
resume: func(co) { return __coresume; },
|
||||
yield: func(args...) { return __coyield; },
|
||||
status: func(co) { return __costatus; },
|
||||
running: func() { return __corun; }
|
||||
};
|
||||
```
|
||||
|
||||
|
||||
+16
-16
@@ -40,23 +40,23 @@
|
||||
上面这个问题已经解决很久了,不过我最近发现了一个新的语法问题:
|
||||
|
||||
```javascript
|
||||
var f=func(x,y,z){return x+y+z}
|
||||
(a,b,c)=(0,1,2);
|
||||
var f = func(x, y, z) { return x + y + z }
|
||||
(a, b, c) = (0, 1, 2);
|
||||
```
|
||||
|
||||
这种写法会被错误识别合并成下面这种:
|
||||
|
||||
```javascript
|
||||
var f=func(x,y,z){return x+y+z}(a,b,c)
|
||||
=(0,1,2);
|
||||
var f = func(x, y, z) { return x + y + z }(a, b, c)
|
||||
= (0, 1, 2);
|
||||
```
|
||||
|
||||
语法分析器会认为这是个严重的语法错误。我在Flightgear中也测试了这个代码,它内置的语法分析器也认为这是错误语法。当然我认为这是语法设计中的一个比较严重的缺漏。为了避免这个语法问题,只需要添加一个分号就可以了:
|
||||
|
||||
```javascript
|
||||
var f=func(x,y,z){return x+y+z};
|
||||
^ 就是这里
|
||||
(a,b,c)=(0,1,2);
|
||||
var f = func(x, y, z) { return x + y + z };
|
||||
^ 就是这里
|
||||
(a, b, c) = (0, 1, 2);
|
||||
```
|
||||
|
||||
### version 1.0 parser (last update 2019/10/14)
|
||||
@@ -193,15 +193,15 @@ for (var i=0;i<4000000;i+=1);
|
||||
|
||||
2021/6/3 update:
|
||||
|
||||
修复了垃圾收集器还是他妈的会重复收集的bug,这次我设计了三个标记状态来保证垃圾是被正确收集了。
|
||||
修复了垃圾收集器还是会重复收集的bug,这次我设计了三个标记状态来保证垃圾是被正确收集了。
|
||||
|
||||
将`callf`指令拆分为`callfv`和`callfh`。并且`callfv`将直接从`val_stack`获取传参,而不是先通过一个`vm_vec`把参数收集起来再传入,后者是非常低效的做法。
|
||||
|
||||
建议更多使用`callfv`而不是`callfh`,因为`callfh`只能从栈上获取参数并整合为`vm_hash`之后才能传给该指令进行处理,拖慢执行速度。
|
||||
|
||||
```javascript
|
||||
var f=func(x,y){return x+y;}
|
||||
f(1024,2048);
|
||||
var f = func(x, y) { return x + y; }
|
||||
f(1024, 2048);
|
||||
```
|
||||
|
||||
```x86asm
|
||||
@@ -475,12 +475,12 @@ func <0x2a3>:
|
||||
在这个版本中我们给nasal加入了协程:
|
||||
|
||||
```javascript
|
||||
var coroutine={
|
||||
create: func(function){return __cocreate;},
|
||||
resume: func(co) {return __coresume;},
|
||||
yield: func(args...) {return __coyield; },
|
||||
status: func(co) {return __costatus;},
|
||||
running:func() {return __corun; }
|
||||
var coroutine = {
|
||||
create: func(function) { return __cocreate; },
|
||||
resume: func(co) { return __coresume; },
|
||||
yield: func(args...) { return __coyield; },
|
||||
status: func(co) { return __costatus; },
|
||||
running: func() { return __corun; }
|
||||
};
|
||||
```
|
||||
|
||||
|
||||
+4
-4
@@ -67,7 +67,7 @@ __`vec`__ has unlimited length and can store all types of values.
|
||||
|
||||
```javascript
|
||||
var vec = [];
|
||||
var vec = [0, nil, {}, [], func(){return 0}];
|
||||
var vec = [0, nil, {}, [], func() { return 0 }];
|
||||
append(vec, 0, 1, 2);
|
||||
```
|
||||
|
||||
@@ -255,7 +255,7 @@ if (1) {
|
||||
While loop and for loop is simalar to C/C++.
|
||||
|
||||
```javascript
|
||||
while(condition) {
|
||||
while (condition) {
|
||||
continue;
|
||||
}
|
||||
for (var i = 0; i<10; i += 1) {
|
||||
@@ -327,7 +327,7 @@ var fib = func(f) {
|
||||
}(
|
||||
func(f) {
|
||||
return func(x) {
|
||||
if(x<2) return x;
|
||||
if (x<2) return x;
|
||||
return f(f)(x-1)+f(f)(x-2);
|
||||
}
|
||||
}
|
||||
@@ -597,7 +597,7 @@ var fib(var* args, usize size, gc* ngc) {
|
||||
// if you want your function safer, try this
|
||||
// nas_err will print the error info on screen
|
||||
// and return vm_null for runtime to interrupt
|
||||
if(num.type!=vm_num) {
|
||||
if (num.type!=vm_num) {
|
||||
return nas_err("extern_fib", "\"num\" must be number");
|
||||
}
|
||||
// ok, you must know that vm_num now is not managed by gc
|
||||
|
||||
+4
-4
@@ -64,7 +64,7 @@ __`vec`__ 有不受限制的长度并且可以存储所有类型的数据。(当
|
||||
|
||||
```javascript
|
||||
var vec = [];
|
||||
var vec = [0, nil, {}, [], func(){return 0}];
|
||||
var vec = [0, nil, {}, [], func() { return 0 }];
|
||||
append(vec, 0, 1, 2);
|
||||
```
|
||||
|
||||
@@ -247,7 +247,7 @@ if (1) {
|
||||
while循环和for循环大体上与C/C++是一致的。
|
||||
|
||||
```javascript
|
||||
while(condition) {
|
||||
while (condition) {
|
||||
continue;
|
||||
}
|
||||
for (var i = 0; i<10; i += 1) {
|
||||
@@ -314,7 +314,7 @@ var fib = func(f) {
|
||||
}(
|
||||
func(f) {
|
||||
return func(x) {
|
||||
if(x<2) return x;
|
||||
if (x<2) return x;
|
||||
return f(f)(x-1)+f(f)(x-2);
|
||||
}
|
||||
}
|
||||
@@ -579,7 +579,7 @@ var fib(var* args, usize size, gc* ngc) {
|
||||
var num = args[0];
|
||||
// 如果你想让这个函数有更强的稳定性,那么一定要进行合法性检查
|
||||
// nas_err会输出错误信息并返回错误类型让虚拟机终止执行
|
||||
if(num.type!=vm_num) {
|
||||
if (num.type!=vm_num) {
|
||||
return nas_err("extern_fib", "\"num\" must be number");
|
||||
}
|
||||
// vm_num作为普通的数字类型,不是内存管理的对象,所以无需申请
|
||||
|
||||
Reference in New Issue
Block a user