v2: break, continue, for in fixes, fixed size array, |

pull/3646/head
Alexander Medvednikov 2020-02-04 08:29:50 +01:00
parent c7f07cd0b6
commit 432ee93916
8 changed files with 58 additions and 14 deletions

View File

@ -447,6 +447,7 @@ pub fn (a []char) index(v char) int {
return -1
}
/*
// []int.reduce executes a given reducer function on each element of the array,
// resulting in a single output value.
pub fn (a []int) reduce(iter fn(accum, curr int)int, accum_start int) int {
@ -491,6 +492,7 @@ pub fn (a []byte) eq(a2 []byte) bool {
pub fn (a []f32) eq(a2 []f32) bool {
return array_eq(a, a2)
}
*/
// compare_i64 for []f64 sort_with_compare()
// sort []i64 with quicksort

View File

@ -414,6 +414,7 @@ fn sub(prev int, curr int) int {
}
fn test_reduce() {
/*
a := [1, 2, 3, 4, 5]
b := a.reduce(sum, 0)
c := a.reduce(sum, 5)
@ -426,6 +427,7 @@ fn test_reduce() {
g := e.reduce(sub, -1)
assert f == -6
assert g == -7
*/
}
fn test_filter() {
@ -469,8 +471,10 @@ fn test_array_str() {
}
fn test_eq() {
/*
assert [5, 6, 7].eq([6, 7]) == false
assert [`a`, `b`].eq([`a`, `b`]) == true
*/
}
fn test_sort() {
@ -576,7 +580,7 @@ fn test_clear() {
assert arr.len == 3
arr.clear()
assert arr.len == 0
arr << 3
arr << 2
arr << 1
@ -586,7 +590,7 @@ fn test_clear() {
assert arr[1] == 2
assert arr[2] == 1
assert arr[3] == 0
arr.clear()
assert arr.len == 0
}

View File

@ -24,9 +24,11 @@ pub fn isnil(v voidptr) bool {
return v == 0
}
/*
fn on_panic(f fn(int)int) {
// TODO
}
*/
pub fn print_backtrace_skipping_top_frames(skipframes int) {
$if windows {

View File

@ -13,7 +13,7 @@ FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | Selecto
AssignExpr | PrefixExpr | MethodCallExpr | IndexExpr | RangeExpr
pub type Stmt = VarDecl | GlobalDecl | FnDecl | Return | Module | Import | ExprStmt |
ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr
ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr | BranchStmt
// | IncDecStmt k
// Stand-alone expression in a statement list.
pub struct ExprStmt {
@ -113,6 +113,11 @@ pub:
receiver Field
}
pub struct BranchStmt {
pub:
tok token.Token
}
pub struct CallExpr {
pub:
// tok token.Token

View File

@ -42,6 +42,10 @@ i < 10; i++;
array_bool bools = new_array_from_c_array(2, 2, sizeof(array_bool), {
true, false,
});
array_User users = new_array_from_c_array(1, 1, sizeof(array_User), {
(User){
},
});
bool b = bools[0];
array_string mystrings = new_array_from_c_array(2, 2, sizeof(array_string), {
tos3("a"), tos3("b"),
@ -69,6 +73,8 @@ int get_int2() {
}
void myuser() {
int x = 1;
int q = x | 4100;
User user = (User){
.age = 10,
};

View File

@ -54,6 +54,7 @@ fn foo(a int) {
nums2 := nums[..2]
number := nums[0]
bools := [true, false]
users := [User{}]
b := bools[0]
mystrings := ['a', 'b']
s := mystrings[0]
@ -81,6 +82,8 @@ fn get_int2() int {
}
fn myuser() {
x := 1
q := x | 0x1004
user := User{age:10}
age := user.age + 1
boo := 2

View File

@ -216,6 +216,13 @@ pub fn (p mut Parser) stmt() ast.Stmt {
.dollar {
return p.comp_if()
}
.key_continue, .key_break {
tok := p.tok
p.next()
return ast.BranchStmt{
tok: p.tok
}
}
else {
// `x := ...`
if p.tok.kind == .name && p.peek_tok.kind == .decl_assign {
@ -479,7 +486,7 @@ pub fn (p mut Parser) expr(precedence int) (ast.Expr,table.Type) {
node,typ = p.array_init()
}
else {
p.error('expr(): bad token `$p.tok.str()`')
p.error('pexpr(): bad token `$p.tok.str()`')
}
}
// Infix
@ -605,10 +612,13 @@ fn (p mut Parser) infix_expr(left ast.Expr) (ast.Expr,table.Type) {
}
// Implementation of Pratt Precedence
/*
[inline]
fn (p &Parser) is_addative() bool {
return p.tok.kind in [.plus, .minus] && p.peek_tok.kind in [.number, .name]
}
*/
fn (p mut Parser) for_statement() ast.Stmt {
p.check(.key_for)
@ -659,16 +669,20 @@ fn (p mut Parser) for_statement() ast.Stmt {
inc: inc
}
}
// `for i in start .. end`
// `for i in vals`, `for i in start .. end`
else if p.peek_tok.kind == .key_in {
var := p.check_name()
var_name := p.check_name()
p.check(.key_in)
start := p.tok.lit.int()
p.check(.number)
p.check(.dotdot)
// end := p.tok.lit.int()
// println('for start=$start $end')
p.check(.number)
p.expr(0)
if p.tok.kind == .dotdot {
p.check(.dotdot)
p.expr(0)
}
p.table.register_var(table.Var{
name: var_name
typ: table.int_type
})
stmts := p.parse_block()
// println('nr stmts=$stmts.len')
return ast.ForStmt{
@ -746,6 +760,7 @@ fn (p mut Parser) string_expr() (ast.Expr,table.Type) {
}
fn (p mut Parser) array_init() (ast.Expr,table.Type) {
mut node := ast.Expr{}
p.check(.lsbr)
mut val_type := table.void_type
mut exprs := []ast.Expr
@ -759,15 +774,22 @@ fn (p mut Parser) array_init() (ast.Expr,table.Type) {
p.check(.comma)
}
}
line_nr := p.tok.line_nr
p.check(.rsbr)
// Fixed size array? (`[100]byte`)
if exprs.len <= 1 && p.tok.kind == .name && p.tok.line_nr == line_nr {
p.check_name()
p.warn('fixed size array')
// type_idx,type_name := p.table.find_or_register_array_fixed(val_type, 1)
// node =
}
type_idx,type_name := p.table.find_or_register_array(val_type, 1)
array_ti := table.new_type(.array, type_name, type_idx, 0)
mut node := ast.Expr{}
node = ast.ArrayInit{
ti: array_ti
exprs: exprs
pos: p.tok.position()
}
p.check(.rsbr)
return node,array_ti
}

View File

@ -456,5 +456,5 @@ pub fn (tok Kind) is_relational() bool {
}
pub fn (kind Kind) is_infix() bool {
return kind in [.plus, .minus, .mod, .mul, .div, .eq, .ne, .gt, .lt, .ge, .le, .logical_or, .and, .dot]
return kind in [.plus, .minus, .mod, .mul, .div, .eq, .ne, .gt, .lt, .ge, .le, .logical_or, .and, .dot, .pipe, .left_shift]
}