Files
ivy/lang/parse/ctx.h
T

117 lines
4.6 KiB
C
Raw Normal View History

#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