diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index 36fc7a34..e943b21d 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -76,66 +76,66 @@ E_TypeKindTable: {LensSpec "lens_spec" 0 } } -@table(name op_kind precedence op_pre op_sep op_pos) +@table(name op_kind precedence op_pre op_sep op_pos op_chain) E_ExprKindTable: { - { Nil Null 0 "" "" "" } - { Ref Null 0 "" "" "" } + { Nil Null 0 "" "" "" "" } + { Ref Null 0 "" "" "" "" } - { ArrayIndex Null 0 "" "[" "]"} - { MemberAccess Null 0 "" "." "" } - { Deref UnaryPrefix 2 "*" "" "" } - { Address UnaryPrefix 2 "&" "" "" } + { ArrayIndex Null 0 "" "[" "]" "" } + { MemberAccess Null 0 "" "." "" "" } + { Deref UnaryPrefix 2 "*" "" "" "" } + { Address UnaryPrefix 2 "&" "" "" "" } - { Cast Null 1 "(" ")" "" } - { Sizeof UnaryPrefix 1 "sizeof" "(" ")"} - { Typeof UnaryPrefix 1 "typeof" "(" ")"} - { ByteSwap UnaryPrefix 1 "bswap" "(" ")"} + { Cast Null 1 "(" ")" "" "" } + { Sizeof UnaryPrefix 1 "sizeof" "(" ")" "" } + { Typeof UnaryPrefix 1 "typeof" "(" ")" "" } + { ByteSwap UnaryPrefix 1 "bswap" "(" ")" "" } - { Pos UnaryPrefix 2 "+" "" "" } - { Neg UnaryPrefix 2 "-" "" "" } - { LogNot UnaryPrefix 2 "!" "" "" } - { BitNot UnaryPrefix 2 "~" "" "" } - { Mul Binary 3 "" "*" "" } - { Div Binary 3 "" "/" "" } - { Mod Binary 3 "" "%" "" } - { Add Binary 4 "" "+" "" } - { Sub Binary 4 "" "-" "" } - { LShift Binary 5 "" "<<" "" } - { RShift Binary 5 "" ">>" "" } - { Less Binary 6 "" "<" "" } - { LsEq Binary 6 "" "<=" "" } - { Grtr Binary 6 "" ">" "" } - { GrEq Binary 6 "" ">=" "" } - { EqEq Binary 7 "" "==" "" } - { NtEq Binary 7 "" "!=" "" } + { Pos UnaryPrefix 2 "+" "" "" "" } + { Neg UnaryPrefix 2 "-" "" "" "" } + { LogNot UnaryPrefix 2 "!" "" "" "" } + { BitNot UnaryPrefix 2 "~" "" "" "" } + { Mul Binary 3 "" " * " "" "" } + { Div Binary 3 "" " / " "" "" } + { Mod Binary 3 "" " % " "" "" } + { Add Binary 4 "" " + " "" "" } + { Sub Binary 4 "" " - " "" "" } + { LShift Binary 5 "" " << " "" "" } + { RShift Binary 5 "" " >> " "" "" } + { Less Binary 6 "" " < " "" "" } + { LsEq Binary 6 "" " <= " "" "" } + { Grtr Binary 6 "" " > " "" "" } + { GrEq Binary 6 "" " >= " "" "" } + { EqEq Binary 7 "" " == " "" "" } + { NtEq Binary 7 "" " != " "" "" } - { BitAnd Binary 8 "" "&" "" } - { BitXor Binary 9 "" "^" "" } - { BitOr Binary 10 "" "|" "" } - { LogAnd Binary 11 "" "&&" "" } - { LogOr Binary 12 "" "||" "" } + { BitAnd Binary 8 "" " & " "" "" } + { BitXor Binary 9 "" " ^ " "" "" } + { BitOr Binary 10 "" " | " "" "" } + { LogAnd Binary 11 "" " && " "" "" } + { LogOr Binary 12 "" " || " "" "" } - { Ternary Null 0 "" "?" ":"} + { Ternary Null 0 "" " ? " " : " "" } - { Call Null 0 "(" "," ")"} + { Call Null 15 "" "(" ")" ", "} - { LeafBytecode Null 0 "" "" "" } - { LeafStringLiteral Null 0 "" "" "" } - { LeafU64 Null 0 "" "" "" } - { LeafF64 Null 0 "" "" "" } - { LeafF32 Null 0 "" "" "" } - { LeafIdentifier Null 0 "" "" "" } - { LeafOffset Null 0 "" "" "" } - { LeafValue Null 0 "" "" "" } - { LeafFilePath Null 0 "" "" "" } + { LeafBytecode Null 0 "" "" "" "" } + { LeafStringLiteral Null 0 "" "" "" "" } + { LeafU64 Null 0 "" "" "" "" } + { LeafF64 Null 0 "" "" "" "" } + { LeafF32 Null 0 "" "" "" "" } + { LeafIdentifier Null 0 "" "" "" "" } + { LeafOffset Null 0 "" "" "" "" } + { LeafValue Null 0 "" "" "" "" } + { LeafFilePath Null 0 "" "" "" "" } - { TypeIdent Null 0 "" "" "" } - { Ptr Null 0 "" "" "" } - { Array Null 0 "" "" "" } - { Func Null 0 "" "" "" } + { TypeIdent Null 0 "" "" "" "" } + { Ptr Null 0 "" "" "" "" } + { Array Null 0 "" "" "" "" } + { Func Null 0 "" "" "" "" } - { Define Binary 13 "" "=" "" } + { Define Binary 13 "" " = " "" "" } } @table(name display_string) @@ -206,7 +206,7 @@ e_expr_kind_strings: @data(E_OpInfo) e_expr_kind_op_info_table: { - @expand(E_ExprKindTable a) `{ E_OpKind_$(a.op_kind), $(a.precedence), str8_lit_comp("$(a.op_pre)"), str8_lit_comp("$(a.op_sep)"), str8_lit_comp("$(a.op_pos)") }` + @expand(E_ExprKindTable a) `{ E_OpKind_$(a.op_kind), $(a.precedence), str8_lit_comp("$(a.op_pre)"), str8_lit_comp("$(a.op_sep)"), str8_lit_comp("$(a.op_pos)"), str8_lit_comp("$(a.op_chain)") }` } @enum E_InterpretationCode: diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 869f02c7..483a9409 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -74,6 +74,7 @@ struct E_OpInfo String8 pre; String8 sep; String8 post; + String8 chain; }; //////////////////////////////// diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 9296befb..675c5cbe 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -485,16 +485,13 @@ e_append_strings_from_expr(Arena *arena, E_Expr *expr, String8List *out) U64 sep_idx = 0; for(E_Expr *child = expr->first;; child = child->next) { - if(seps[sep_idx].size != 0) + if(sep_idx == ArrayCount(seps)-1 && child != &e_expr_nil) { - if(sep_idx == 1 && child == &e_expr_nil) - { - sep_idx += 1; - } - str8_list_push(arena, out, seps[sep_idx]); + str8_list_push(arena, out, op_info->chain); } - if(sep_idx == 0) + else { + str8_list_push(arena, out, seps[sep_idx]); sep_idx += 1; } if(child == &e_expr_nil) @@ -914,7 +911,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok for EachNonZeroEnumVal(E_ExprKind, k) { E_OpInfo *op_info = &e_expr_kind_op_info_table[k]; - if(op_info->kind == E_OpKind_UnaryPrefix && str8_match(op_info->pre, token_string, 0)) + if(op_info->kind == E_OpKind_UnaryPrefix && str8_match(str8_skip_chop_whitespace(op_info->pre), token_string, 0)) { prefix_unary_precedence = op_info->precedence; prefix_unary_kind = k; @@ -1376,7 +1373,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok for EachNonZeroEnumVal(E_ExprKind, k) { E_OpInfo *op_info = &e_expr_kind_op_info_table[k]; - if(op_info->kind == E_OpKind_Binary && str8_match(op_info->sep, token_string, 0)) + if(op_info->kind == E_OpKind_Binary && str8_match(str8_skip_chop_whitespace(op_info->sep), token_string, 0)) { binary_precedence = op_info->precedence; binary_kind = k; diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index 1973dbf0..6febd96e 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -192,54 +192,54 @@ str8_lit_comp("Define"), E_OpInfo e_expr_kind_op_info_table[48] = { -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("["), str8_lit_comp("]") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("."), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 1, str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("sizeof"), str8_lit_comp("("), str8_lit_comp(")") }, -{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("typeof"), str8_lit_comp("("), str8_lit_comp(")") }, -{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("bswap"), str8_lit_comp("("), str8_lit_comp(")") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("+"), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("!"), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("~"), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("*"), str8_lit_comp("") }, -{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("/"), str8_lit_comp("") }, -{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("%"), str8_lit_comp("") }, -{ E_OpKind_Binary, 4, str8_lit_comp(""), str8_lit_comp("+"), str8_lit_comp("") }, -{ E_OpKind_Binary, 4, str8_lit_comp(""), str8_lit_comp("-"), str8_lit_comp("") }, -{ E_OpKind_Binary, 5, str8_lit_comp(""), str8_lit_comp("<<"), str8_lit_comp("") }, -{ E_OpKind_Binary, 5, str8_lit_comp(""), str8_lit_comp(">>"), str8_lit_comp("") }, -{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp("<"), str8_lit_comp("") }, -{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp("<="), str8_lit_comp("") }, -{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(">"), str8_lit_comp("") }, -{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(">="), str8_lit_comp("") }, -{ E_OpKind_Binary, 7, str8_lit_comp(""), str8_lit_comp("=="), str8_lit_comp("") }, -{ E_OpKind_Binary, 7, str8_lit_comp(""), str8_lit_comp("!="), str8_lit_comp("") }, -{ E_OpKind_Binary, 8, str8_lit_comp(""), str8_lit_comp("&"), str8_lit_comp("") }, -{ E_OpKind_Binary, 9, str8_lit_comp(""), str8_lit_comp("^"), str8_lit_comp("") }, -{ E_OpKind_Binary, 10, str8_lit_comp(""), str8_lit_comp("|"), str8_lit_comp("") }, -{ E_OpKind_Binary, 11, str8_lit_comp(""), str8_lit_comp("&&"), str8_lit_comp("") }, -{ E_OpKind_Binary, 12, str8_lit_comp(""), str8_lit_comp("||"), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("?"), str8_lit_comp(":") }, -{ E_OpKind_Null, 0, str8_lit_comp("("), str8_lit_comp(","), str8_lit_comp(")") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("["), str8_lit_comp("]"), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("."), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 1, str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("sizeof"), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("typeof"), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("bswap"), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("+"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("!"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("~"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp(" * "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp(" / "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp(" % "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 4, str8_lit_comp(""), str8_lit_comp(" + "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 4, str8_lit_comp(""), str8_lit_comp(" - "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 5, str8_lit_comp(""), str8_lit_comp(" << "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 5, str8_lit_comp(""), str8_lit_comp(" >> "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" < "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" <= "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" > "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" >= "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 7, str8_lit_comp(""), str8_lit_comp(" == "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 7, str8_lit_comp(""), str8_lit_comp(" != "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 8, str8_lit_comp(""), str8_lit_comp(" & "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 9, str8_lit_comp(""), str8_lit_comp(" ^ "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 10, str8_lit_comp(""), str8_lit_comp(" | "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 11, str8_lit_comp(""), str8_lit_comp(" && "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 12, str8_lit_comp(""), str8_lit_comp(" || "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(" ? "), str8_lit_comp(" : "), str8_lit_comp("") }, +{ E_OpKind_Null, 15, str8_lit_comp(""), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp(", ") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp(" = "), str8_lit_comp(""), str8_lit_comp("") }, }; String8 e_interpretation_code_display_strings[11] =