| ... | ... | @@ -14,26 +14,38 @@ |
| 14 | 14 | |
| 15 | 15 | static const char *bin_op_str(BinOpType bin_op) { |
| 16 | 16 | switch (bin_op) { |
| 17 | | case BinOpTypeInvalid: return "(invalid)"; |
| 18 | | case BinOpTypeBoolOr: return "||"; |
| 19 | | case BinOpTypeBoolAnd: return "&&"; |
| 20 | | case BinOpTypeCmpEq: return "=="; |
| 21 | | case BinOpTypeCmpNotEq: return "!="; |
| 22 | | case BinOpTypeCmpLessThan: return "<"; |
| 23 | | case BinOpTypeCmpGreaterThan: return ">"; |
| 24 | | case BinOpTypeCmpLessOrEq: return "<="; |
| 25 | | case BinOpTypeCmpGreaterOrEq: return ">="; |
| 26 | | case BinOpTypeBinOr: return "|"; |
| 27 | | case BinOpTypeBinXor: return "^"; |
| 28 | | case BinOpTypeBinAnd: return "&"; |
| 29 | | case BinOpTypeBitShiftLeft: return "<<"; |
| 30 | | case BinOpTypeBitShiftRight: return ">>"; |
| 31 | | case BinOpTypeAdd: return "+"; |
| 32 | | case BinOpTypeSub: return "-"; |
| 33 | | case BinOpTypeMult: return "*"; |
| 34 | | case BinOpTypeDiv: return "/"; |
| 35 | | case BinOpTypeMod: return "%"; |
| 36 | | case BinOpTypeAssign: return "="; |
| 17 | case BinOpTypeInvalid: return "(invalid)"; |
| 18 | case BinOpTypeBoolOr: return "||"; |
| 19 | case BinOpTypeBoolAnd: return "&&"; |
| 20 | case BinOpTypeCmpEq: return "=="; |
| 21 | case BinOpTypeCmpNotEq: return "!="; |
| 22 | case BinOpTypeCmpLessThan: return "<"; |
| 23 | case BinOpTypeCmpGreaterThan: return ">"; |
| 24 | case BinOpTypeCmpLessOrEq: return "<="; |
| 25 | case BinOpTypeCmpGreaterOrEq: return ">="; |
| 26 | case BinOpTypeBinOr: return "|"; |
| 27 | case BinOpTypeBinXor: return "^"; |
| 28 | case BinOpTypeBinAnd: return "&"; |
| 29 | case BinOpTypeBitShiftLeft: return "<<"; |
| 30 | case BinOpTypeBitShiftRight: return ">>"; |
| 31 | case BinOpTypeAdd: return "+"; |
| 32 | case BinOpTypeSub: return "-"; |
| 33 | case BinOpTypeMult: return "*"; |
| 34 | case BinOpTypeDiv: return "/"; |
| 35 | case BinOpTypeMod: return "%"; |
| 36 | case BinOpTypeAssign: return "="; |
| 37 | case BinOpTypeAssignTimes: return "*="; |
| 38 | case BinOpTypeAssignDiv: return "/="; |
| 39 | case BinOpTypeAssignMod: return "%="; |
| 40 | case BinOpTypeAssignPlus: return "+="; |
| 41 | case BinOpTypeAssignMinus: return "-="; |
| 42 | case BinOpTypeAssignBitShiftLeft: return "<<="; |
| 43 | case BinOpTypeAssignBitShiftRight: return ">>="; |
| 44 | case BinOpTypeAssignBitAnd: return "&="; |
| 45 | case BinOpTypeAssignBitXor: return "^="; |
| 46 | case BinOpTypeAssignBitOr: return "|="; |
| 47 | case BinOpTypeAssignBoolAnd: return "&&="; |
| 48 | case BinOpTypeAssignBoolOr: return "||="; |
| 37 | 49 | } |
| 38 | 50 | zig_unreachable(); |
| 39 | 51 | } |
| ... | ... | @@ -103,7 +115,7 @@ const char *node_type_str(NodeType node_type) { |
| 103 | 115 | case NodeTypeLabel: |
| 104 | 116 | return "Label"; |
| 105 | 117 | case NodeTypeGoto: |
| 106 | | return "Label"; |
| 118 | return "Goto"; |
| 107 | 119 | case NodeTypeAsmExpr: |
| 108 | 120 | return "AsmExpr"; |
| 109 | 121 | case NodeTypeFieldAccessExpr: |
| ... | ... | @@ -1448,24 +1460,60 @@ static AstNode *ast_parse_block_expr(ParseContext *pc, int *token_index, bool ma |
| 1448 | 1460 | return nullptr; |
| 1449 | 1461 | } |
| 1450 | 1462 | |
| 1463 | static BinOpType tok_to_ass_op(Token *token) { |
| 1464 | switch (token->id) { |
| 1465 | case TokenIdEq: return BinOpTypeAssign; |
| 1466 | case TokenIdTimesEq: return BinOpTypeAssignTimes; |
| 1467 | case TokenIdDivEq: return BinOpTypeAssignDiv; |
| 1468 | case TokenIdModEq: return BinOpTypeAssignMod; |
| 1469 | case TokenIdPlusEq: return BinOpTypeAssignPlus; |
| 1470 | case TokenIdMinusEq: return BinOpTypeAssignMinus; |
| 1471 | case TokenIdBitShiftLeftEq: return BinOpTypeAssignBitShiftLeft; |
| 1472 | case TokenIdBitShiftRightEq: return BinOpTypeAssignBitShiftRight; |
| 1473 | case TokenIdBitAndEq: return BinOpTypeAssignBitAnd; |
| 1474 | case TokenIdBitXorEq: return BinOpTypeAssignBitXor; |
| 1475 | case TokenIdBitOrEq: return BinOpTypeAssignBitOr; |
| 1476 | case TokenIdBoolAndEq: return BinOpTypeAssignBoolAnd; |
| 1477 | case TokenIdBoolOrEq: return BinOpTypeAssignBoolOr; |
| 1478 | default: return BinOpTypeInvalid; |
| 1479 | } |
| 1480 | } |
| 1481 | |
| 1451 | 1482 | /* |
| 1452 | | AssignmentExpression : BoolOrExpression token(Equal) BoolOrExpression | BoolOrExpression |
| 1483 | AssignmentOperator : token(Eq) | token(TimesEq) | token(DivEq) | token(ModEq) | token(PlusEq) | token(MinusEq) | token(BitShiftLeftEq) | token(BitShiftRightEq) | token(BitAndEq) | token(BitXorEq) | token(BitOrEq) | token(BoolAndEq) | token(BoolOrEq) |
| 1484 | */ |
| 1485 | static BinOpType ast_parse_ass_op(ParseContext *pc, int *token_index, bool mandatory) { |
| 1486 | Token *token = &pc->tokens->at(*token_index); |
| 1487 | BinOpType result = tok_to_ass_op(token); |
| 1488 | if (result == BinOpTypeInvalid) { |
| 1489 | if (mandatory) { |
| 1490 | ast_invalid_token_error(pc, token); |
| 1491 | } else { |
| 1492 | return BinOpTypeInvalid; |
| 1493 | } |
| 1494 | } |
| 1495 | *token_index += 1; |
| 1496 | return result; |
| 1497 | } |
| 1498 | |
| 1499 | /* |
| 1500 | AssignmentExpression : BoolOrExpression AssignmentOperator BoolOrExpression | BoolOrExpression |
| 1453 | 1501 | */ |
| 1454 | 1502 | static AstNode *ast_parse_ass_expr(ParseContext *pc, int *token_index, bool mandatory) { |
| 1455 | 1503 | AstNode *lhs = ast_parse_bool_or_expr(pc, token_index, mandatory); |
| 1456 | 1504 | if (!lhs) |
| 1457 | | return lhs; |
| 1505 | return nullptr; |
| 1458 | 1506 | |
| 1459 | 1507 | Token *token = &pc->tokens->at(*token_index); |
| 1460 | | if (token->id != TokenIdEq) |
| 1508 | BinOpType ass_op = ast_parse_ass_op(pc, token_index, false); |
| 1509 | if (ass_op == BinOpTypeInvalid) |
| 1461 | 1510 | return lhs; |
| 1462 | | *token_index += 1; |
| 1463 | 1511 | |
| 1464 | 1512 | AstNode *rhs = ast_parse_bool_or_expr(pc, token_index, true); |
| 1465 | 1513 | |
| 1466 | 1514 | AstNode *node = ast_create_node(pc, NodeTypeBinOpExpr, token); |
| 1467 | 1515 | node->data.bin_op_expr.op1 = lhs; |
| 1468 | | node->data.bin_op_expr.bin_op = BinOpTypeAssign; |
| 1516 | node->data.bin_op_expr.bin_op = ass_op; |
| 1469 | 1517 | node->data.bin_op_expr.op2 = rhs; |
| 1470 | 1518 | |
| 1471 | 1519 | return node; |