117 lines
4.6 KiB
C
117 lines
4.6 KiB
C
|
|
#ifndef _LANG_PARSE_CTX_H_
|
||
|
|
#define _LANG_PARSE_CTX_H_
|
||
|
|
|
||
|
|
#include <ivy/lang/lex.h>
|
||
|
|
#include <ivy/status.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
|
||
|
|
#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
|