func main(av:[ac::number]string)
A := $av[1]; B := $av[2]
astr := av[3]
- bbool := av[ac-1] == "True"
+ l := av[]
+ bbool := av[l-1] == "True"
print "Hello World, what lovely oceans you have!"
/* When a variable is defined in both branches of an 'if',
* and used afterwards, the variables are merged.
insert(list, "@start");
insert(list, "~end")
- for i:=1; then i=i+1; while i < ac:
+ for i:=1; then i=i+1; while i < argv[]:
insert(list, argv[i])
insert(list, "Hello!")
printlist(list)
while 1 if True else False:
print
case 2: print "two"
+ print "one" ++ a4[], c[]
###### output: type_err3
.tmp.code:8:12: error: expected number but variable 'c' is string
.tmp.code:34:14: error: cannot find requested field in foo
.tmp.code:35:17: error: have string but need number
.tmp.code:38:29: error: expected number found Boolean
+ .tmp.code:41:23: error: have number but need string
+ .tmp.code:41:29: error: string cannot provide length
oceani: type error in program - not running.
###### test: type_err4
} }$
###### Binode types
- Index,
+ Index, Length,
###### term grammar
$0 = b;
} }$
+ | Term [ ] ${ {
+ struct binode *b = new(binode);
+ b->op = Length;
+ b->left = $<Term;
+ $0 = b;
+ } }$
+
###### print binode cases
case Index:
print_exec(b->left, -1, bracket);
printf("]");
break;
+ case Length:
+ print_exec(b->left, -1, bracket);
+ printf("[]");
+ break;
+
###### propagate binode cases
case Index:
/* left must be an array, right must be a number,
}
break;
+ case Length:
+ /* left must be an array, result is a number
+ */
+ t = propagate_types(b->left, c, perr, NULL, 0);
+ if (!t || t->compat != array_compat) {
+ type_err(c, "error: %1 cannot provide length", prog, t, 0, NULL);
+ return NULL;
+ }
+ if (!type_compat(type, Tnum, rules))
+ type_err(c, "error: have %1 but need %2", prog,
+ Tnum, rules, type);
+ return Tnum;
+ break;
+
###### interp binode cases
case Index: {
mpz_t q;
ltype = NULL;
break;
}
+ case Length: {
+ lleft = linterp_exec(c, b->left, <ype);
+ mpq_set_ui(rv.num, ltype->array.size, 1);
+ ltype = NULL;
+ rvtype = Tnum;
+ break;
+ }
#### Structs