#ifndef _LANG_PARSE_CTX_H_ #define _LANG_PARSE_CTX_H_ #include #include #include #define parse_trace(p, ...) \ __parse_trace(p, __FUNCTION__, __LINE__, __VA_ARGS__) struct ivy_lexer; struct ivy_diag_ctx; struct ivy_ast_node; struct ivy_parser { struct ivy_lexer *p_src; struct ivy_diag_ctx *p_diag; enum ivy_status p_status; fx_queue p_tokens; }; #define create_node(type) ((void *)ivy_ast_node_create(type)) #define destroy_node(p) ivy_ast_node_destroy((struct ivy_ast_node *)(p)) #define generic_node(p) ((struct ivy_ast_node *)(p)) enum expr_parse_flags { EXPR_PARSE_NORMAL = 0, EXPR_PARSE_CONSUME_TERMINATOR = 0x01u, EXPR_PARSE_STOP_KW_CONTROL = 0x02u, EXPR_PARSE_STOP_KW_IN = 0x04u, EXPR_PARSE_STOP_COMMA = 0x08u, EXPR_PARSE_STOP_LABEL = 0x10u, EXPR_PARSE_STOP_LEFT_BRACKET = 0x20u, EXPR_PARSE_STOP_TUPLE_TERMINATOR = 0x40u, EXPR_PARSE_STOP_SEMICOLON = 0x80u, }; extern bool is_tuple_terminator(struct ivy_token *tok); extern const struct ivy_operator *get_operator_from_token(struct ivy_token *tok); extern struct ivy_ast_node *create_operator_node_from_token(struct ivy_token *tok); extern const struct ivy_operator *get_operator_from_node(struct ivy_ast_node *n); extern struct ivy_token *peek_token(struct ivy_parser *parser); extern struct ivy_token *peek_next_token(struct ivy_parser *parser); extern struct ivy_token *parse_token(struct ivy_parser *parser); extern void discard_token(struct ivy_parser *parser); extern bool peek_word(struct ivy_parser *parser); extern bool peek_keyword(struct ivy_parser *parser, enum ivy_keyword kw); extern bool peek_symbol(struct ivy_parser *parser, enum ivy_symbol sym); extern bool peek_linefeed(struct ivy_parser *parser); extern bool parse_eof(struct ivy_parser *parser); extern bool parse_keyword(struct ivy_parser *parser, enum ivy_keyword kw); extern bool parse_symbol(struct ivy_parser *parser, enum ivy_symbol sym); extern bool parse_word(struct ivy_parser *parser, struct ivy_token **out); extern bool parse_string(struct ivy_parser *parser, struct ivy_token **out); extern bool parse_label(struct ivy_parser *parser, struct ivy_token **out); extern bool parse_str_start(struct ivy_parser *parser); extern bool parse_str_end(struct ivy_parser *parser); extern bool parse_linefeed(struct ivy_parser *parser); extern bool peek_expr_start(struct ivy_parser *parser); extern bool parse_tuple( struct ivy_parser *parser, struct ivy_ast_node *first_item, struct ivy_ast_node **out); extern bool parse_cascade( struct ivy_parser *parser, struct ivy_ast_node *first_msg, struct ivy_ast_node **out); extern bool parse_unary_msg( struct ivy_parser *parser, struct ivy_ast_node *recipient, struct ivy_ast_node **out); extern bool parse_keyword_msg( struct ivy_parser *parser, struct ivy_ast_node *recipient, enum expr_parse_flags flags, struct ivy_ast_node **out); extern bool parse_complex_msg( struct ivy_parser *parser, struct ivy_ast_node *unary_msg, struct ivy_ast_node **out); extern bool parse_fstring(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_index( struct ivy_parser *parser, struct ivy_ast_node *container, struct ivy_ast_node **out); extern bool parse_unit(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_block(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_class(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_package(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_match(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_for(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_for_inline( struct ivy_parser *parser, struct ivy_ast_node *body, struct ivy_ast_node **out); extern bool parse_while(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_while_inline( struct ivy_parser *parser, struct ivy_ast_node *body, struct ivy_ast_node **out); extern bool parse_if(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_if_inline( struct ivy_parser *parser, struct ivy_ast_node *body, struct ivy_ast_node **out); extern bool parse_try(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_package_id(struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_package_import( struct ivy_parser *parser, struct ivy_ast_node **out); extern bool parse_expr( struct ivy_parser *parser, enum expr_parse_flags flags, struct ivy_ast_node **out); extern void __parse_trace( struct ivy_parser *parser, const char *func, int line, const char *format, ...); #endif