Untagged (unsafe) unions and unambiguous in|postfix notation.

This commit is contained in:
Ginger Bill
2016-08-24 15:06:36 +01:00
parent 975705f1fc
commit 6bd898e552
11 changed files with 516 additions and 364 deletions

View File

@@ -31,8 +31,8 @@ TOKEN_KIND(Token__OperatorBegin, "_OperatorBegin"), \
TOKEN_KIND(Token_as, "as"), \
TOKEN_KIND(Token_transmute, "transmute"), \
\
TOKEN_KIND(Token_CustomUnaryOp, "custom unary op"), \
TOKEN_KIND(Token_CustomBinaryOp, "custom binary op"), \
TOKEN_KIND(Token_Prime, "'"), \
TOKEN_KIND(Token_DoublePrime, "''"), \
\
TOKEN_KIND(Token__AssignOpBegin, "_AssignOpBegin"), \
TOKEN_KIND(Token_AddEq, "+="), \
@@ -96,6 +96,7 @@ TOKEN_KIND(Token__KeywordBegin, "_KeywordBegin"), \
TOKEN_KIND(Token_struct, "struct"), \
TOKEN_KIND(Token_union, "union"), \
TOKEN_KIND(Token_enum, "enum"), \
TOKEN_KIND(Token_using, "using"), \
TOKEN_KIND(Token__KeywordEnd, "_KeywordEnd"), \
TOKEN_KIND(Token_Count, "")
@@ -202,7 +203,7 @@ i32 token_precedence(Token t) {
case Token_Shl:
case Token_Shr:
return 5;
case Token_CustomBinaryOp:
case Token_DoublePrime:
return 6;
case Token_as:
case Token_transmute:
@@ -647,26 +648,13 @@ Token tokenizer_get_token(Tokenizer *t) {
token.kind = Token_EOF;
break;
case '\'': {
token.kind = Token_CustomUnaryOp;
while (rune_is_whitespace(t->curr_rune))
advance_to_next_rune(t);
token.string.text = t->curr;
while (rune_is_letter(t->curr_rune) || rune_is_digit(t->curr_rune)) {
advance_to_next_rune(t);
}
token.string.len = t->curr - token.string.text;
while (rune_is_whitespace(t->curr_rune))
advance_to_next_rune(t);
case '\'':
token.kind = Token_Prime;
if (t->curr_rune == '\'') {
advance_to_next_rune(t);
token.kind = Token_CustomBinaryOp;
token.kind = Token_DoublePrime;
}
return token;
} break;
break;
case '`': // Raw String Literal
case '"': // String Literal