parser: type expressions cannot be assignment
This commit is contained in:
parent
5f9ecb8566
commit
1645fa681f
@ -48,7 +48,7 @@ RootExportDecl : many(Directive) token(Export) token(Symbol) token(String) token
|
|||||||
|
|
||||||
ExternBlock : many(Directive) token(Extern) token(LBrace) many(FnDecl) token(RBrace)
|
ExternBlock : many(Directive) token(Extern) token(LBrace) many(FnDecl) token(RBrace)
|
||||||
|
|
||||||
FnProto : many(Directive) option(FnVisibleMod) token(Fn) token(Symbol) ParamDeclList option(Expression)
|
FnProto : many(Directive) option(FnVisibleMod) token(Fn) token(Symbol) ParamDeclList option(UnwrapMaybeExpression)
|
||||||
|
|
||||||
Directive : token(NumberSign) token(Symbol) token(LParen) token(String) token(RParen)
|
Directive : token(NumberSign) token(Symbol) token(LParen) token(String) token(RParen)
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ AsmOutput : token(Colon) list(AsmOutputItem, token(Comma)) option(AsmInput)
|
|||||||
|
|
||||||
AsmInput : token(Colon) list(AsmInputItem, token(Comma)) option(AsmClobbers)
|
AsmInput : token(Colon) list(AsmInputItem, token(Comma)) option(AsmClobbers)
|
||||||
|
|
||||||
AsmOutputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) (token(Symbol) | token(Arrow) Expression) token(RParen)
|
AsmOutputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) (token(Symbol) | token(Arrow) UnwrapMaybeExpression) token(RParen)
|
||||||
|
|
||||||
AsmInputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) Expression token(RParen)
|
AsmInputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) Expression token(RParen)
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ IfExpression : IfVarExpression | IfBoolExpression
|
|||||||
|
|
||||||
IfBoolExpression : token(If) token(LParen) Expression token(RParen) Expression option(Else)
|
IfBoolExpression : token(If) token(LParen) Expression token(RParen) Expression option(Else)
|
||||||
|
|
||||||
IfVarExpression : token(If) token(LParen) (token(Const) | token(Var)) token(Symbol) option(token(Colon) Expression) Token(MaybeAssign) Expression token(RParen) Expression Option(Else)
|
IfVarExpression : token(If) token(LParen) (token(Const) | token(Var)) token(Symbol) option(token(Colon) UnwrapMaybeExpression) Token(MaybeAssign) Expression token(RParen) Expression Option(Else)
|
||||||
|
|
||||||
Else : token(Else) Expression
|
Else : token(Else) Expression
|
||||||
|
|
||||||
@ -152,7 +152,7 @@ PrefixOp : token(Not) | token(Dash) | token(Tilde) | token(Star) | (token(Ampers
|
|||||||
|
|
||||||
PrimaryExpression : token(Number) | token(String) | token(CharLiteral) | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression | token(Symbol) | (token(AtSign) token(Symbol) FnCallExpression) | ArrayType | AsmExpression
|
PrimaryExpression : token(Number) | token(String) | token(CharLiteral) | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression | token(Symbol) | (token(AtSign) token(Symbol) FnCallExpression) | ArrayType | AsmExpression
|
||||||
|
|
||||||
ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) Expression
|
ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) UnwrapMaybeExpression
|
||||||
|
|
||||||
GotoExpression: token(Goto) token(Symbol)
|
GotoExpression: token(Goto) token(Symbol)
|
||||||
|
|
||||||
|
@ -1089,7 +1089,7 @@ static AstNode *ast_parse_grouped_expr(ParseContext *pc, int *token_index, bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) Expression
|
ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) UnwrapMaybeExpression
|
||||||
*/
|
*/
|
||||||
static AstNode *ast_parse_array_type_expr(ParseContext *pc, int *token_index, bool mandatory) {
|
static AstNode *ast_parse_array_type_expr(ParseContext *pc, int *token_index, bool mandatory) {
|
||||||
Token *l_bracket = &pc->tokens->at(*token_index);
|
Token *l_bracket = &pc->tokens->at(*token_index);
|
||||||
@ -1114,7 +1114,7 @@ static AstNode *ast_parse_array_type_expr(ParseContext *pc, int *token_index, bo
|
|||||||
node->data.array_type.is_const = true;
|
node->data.array_type.is_const = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
node->data.array_type.child_type = ast_parse_expression(pc, token_index, true);
|
node->data.array_type.child_type = ast_parse_unwrap_maybe_expr(pc, token_index, true);
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
@ -1141,7 +1141,7 @@ static void ast_parse_asm_input_item(ParseContext *pc, int *token_index, AstNode
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
AsmOutputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) (token(Symbol) | token(Arrow) Expression) token(RParen)
|
AsmOutputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) (token(Symbol) | token(Arrow) UnwrapMaybeExpression token(RParen)
|
||||||
*/
|
*/
|
||||||
static void ast_parse_asm_output_item(ParseContext *pc, int *token_index, AstNode *node) {
|
static void ast_parse_asm_output_item(ParseContext *pc, int *token_index, AstNode *node) {
|
||||||
ast_eat_token(pc, token_index, TokenIdLBracket);
|
ast_eat_token(pc, token_index, TokenIdLBracket);
|
||||||
@ -1159,7 +1159,7 @@ static void ast_parse_asm_output_item(ParseContext *pc, int *token_index, AstNod
|
|||||||
if (token->id == TokenIdSymbol) {
|
if (token->id == TokenIdSymbol) {
|
||||||
ast_buf_from_token(pc, token, &asm_output->variable_name);
|
ast_buf_from_token(pc, token, &asm_output->variable_name);
|
||||||
} else if (token->id == TokenIdArrow) {
|
} else if (token->id == TokenIdArrow) {
|
||||||
asm_output->return_type = ast_parse_expression(pc, token_index, true);
|
asm_output->return_type = ast_parse_unwrap_maybe_expr(pc, token_index, true);
|
||||||
} else {
|
} else {
|
||||||
ast_invalid_token_error(pc, token);
|
ast_invalid_token_error(pc, token);
|
||||||
}
|
}
|
||||||
@ -1948,7 +1948,7 @@ static AstNode *ast_parse_if_expr(ParseContext *pc, int *token_index, bool manda
|
|||||||
node->data.if_var_expr.var_decl.expr = ast_parse_expression(pc, token_index, true);
|
node->data.if_var_expr.var_decl.expr = ast_parse_expression(pc, token_index, true);
|
||||||
} else if (eq_or_colon->id == TokenIdColon) {
|
} else if (eq_or_colon->id == TokenIdColon) {
|
||||||
*token_index += 1;
|
*token_index += 1;
|
||||||
node->data.if_var_expr.var_decl.type = ast_parse_expression(pc, token_index, true);
|
node->data.if_var_expr.var_decl.type = ast_parse_unwrap_maybe_expr(pc, token_index, true);
|
||||||
|
|
||||||
ast_eat_token(pc, token_index, TokenIdMaybeAssign);
|
ast_eat_token(pc, token_index, TokenIdMaybeAssign);
|
||||||
node->data.if_var_expr.var_decl.expr = ast_parse_expression(pc, token_index, true);
|
node->data.if_var_expr.var_decl.expr = ast_parse_expression(pc, token_index, true);
|
||||||
@ -2342,7 +2342,7 @@ static AstNode *ast_parse_block(ParseContext *pc, int *token_index, bool mandato
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
FnProto : many(Directive) option(FnVisibleMod) token(Fn) token(Symbol) ParamDeclList option(Expression)
|
FnProto : many(Directive) option(FnVisibleMod) token(Fn) token(Symbol) ParamDeclList option(UnwrapMaybeExpression)
|
||||||
*/
|
*/
|
||||||
static AstNode *ast_parse_fn_proto(ParseContext *pc, int *token_index, bool mandatory) {
|
static AstNode *ast_parse_fn_proto(ParseContext *pc, int *token_index, bool mandatory) {
|
||||||
Token *first_token = &pc->tokens->at(*token_index);
|
Token *first_token = &pc->tokens->at(*token_index);
|
||||||
@ -2394,7 +2394,7 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc, int *token_index, bool mand
|
|||||||
ast_parse_param_decl_list(pc, token_index, &node->data.fn_proto.params, &node->data.fn_proto.is_var_args);
|
ast_parse_param_decl_list(pc, token_index, &node->data.fn_proto.params, &node->data.fn_proto.is_var_args);
|
||||||
|
|
||||||
Token *next_token = &pc->tokens->at(*token_index);
|
Token *next_token = &pc->tokens->at(*token_index);
|
||||||
node->data.fn_proto.return_type = ast_parse_expression(pc, token_index, false);
|
node->data.fn_proto.return_type = ast_parse_unwrap_maybe_expr(pc, token_index, false);
|
||||||
if (!node->data.fn_proto.return_type) {
|
if (!node->data.fn_proto.return_type) {
|
||||||
node->data.fn_proto.return_type = ast_create_void_type_node(pc, next_token);
|
node->data.fn_proto.return_type = ast_create_void_type_node(pc, next_token);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user