#include #include "parser.h" typedef struct { uint32_t len; astNodeIndex lhs, rhs; bool trailing; } members; typedef struct { enum { FIELD_STATE_NONE, FIELD_STATE_SEEN, FIELD_STATE_END // sets "end" } tag; union { uint32_t end; } payload; } field_state; static astTokenIndex next_token(parser* p) { return ++p->tok_i; } static astTokenIndex eat_token(parser* p, tokenizerTag tag) { return (p->token_tags[p->tok_i] == tag) ? next_token(p) : -1; } static members parse_container_members(parser* p) { const uint32_t scratch_top = p->scratch.len; members res = (members) {}; // ast_token_index last_field; while (eat_token(p, TOKENIZER_TAG_CONTAINER_DOC_COMMENT) != -1) ; // bool trailing = false; while (1) { // SKIP eat doc comments switch (p->token_tags[p->tok_i]) { case TOKENIZER_TAG_INVALID: case TOKENIZER_TAG_INVALID_PERIODASTERISKS: case TOKENIZER_TAG_IDENTIFIER: case TOKENIZER_TAG_STRING_LITERAL: case TOKENIZER_TAG_MULTILINE_STRING_LITERAL_LINE: case TOKENIZER_TAG_CHAR_LITERAL: case TOKENIZER_TAG_EOF: case TOKENIZER_TAG_BUILTIN: case TOKENIZER_TAG_BANG: case TOKENIZER_TAG_PIPE: case TOKENIZER_TAG_PIPE_PIPE: case TOKENIZER_TAG_PIPE_EQUAL: case TOKENIZER_TAG_EQUAL: case TOKENIZER_TAG_EQUAL_EQUAL: case TOKENIZER_TAG_EQUAL_ANGLE_BRACKET_RIGHT: case TOKENIZER_TAG_BANG_EQUAL: case TOKENIZER_TAG_L_PAREN: case TOKENIZER_TAG_R_PAREN: case TOKENIZER_TAG_SEMICOLON: case TOKENIZER_TAG_PERCENT: case TOKENIZER_TAG_PERCENT_EQUAL: case TOKENIZER_TAG_L_BRACE: case TOKENIZER_TAG_R_BRACE: case TOKENIZER_TAG_L_BRACKET: case TOKENIZER_TAG_R_BRACKET: case TOKENIZER_TAG_PERIOD: case TOKENIZER_TAG_PERIOD_ASTERISK: case TOKENIZER_TAG_ELLIPSIS2: case TOKENIZER_TAG_ELLIPSIS3: case TOKENIZER_TAG_CARET: case TOKENIZER_TAG_CARET_EQUAL: case TOKENIZER_TAG_PLUS: case TOKENIZER_TAG_PLUS_PLUS: case TOKENIZER_TAG_PLUS_EQUAL: case TOKENIZER_TAG_PLUS_PERCENT: case TOKENIZER_TAG_PLUS_PERCENT_EQUAL: case TOKENIZER_TAG_PLUS_PIPE: case TOKENIZER_TAG_PLUS_PIPE_EQUAL: case TOKENIZER_TAG_MINUS: case TOKENIZER_TAG_MINUS_EQUAL: case TOKENIZER_TAG_MINUS_PERCENT: case TOKENIZER_TAG_MINUS_PERCENT_EQUAL: case TOKENIZER_TAG_MINUS_PIPE: case TOKENIZER_TAG_MINUS_PIPE_EQUAL: case TOKENIZER_TAG_ASTERISK: case TOKENIZER_TAG_ASTERISK_EQUAL: case TOKENIZER_TAG_ASTERISK_ASTERISK: case TOKENIZER_TAG_ASTERISK_PERCENT: case TOKENIZER_TAG_ASTERISK_PERCENT_EQUAL: case TOKENIZER_TAG_ASTERISK_PIPE: case TOKENIZER_TAG_ASTERISK_PIPE_EQUAL: case TOKENIZER_TAG_ARROW: case TOKENIZER_TAG_COLON: case TOKENIZER_TAG_SLASH: case TOKENIZER_TAG_SLASH_EQUAL: case TOKENIZER_TAG_COMMA: case TOKENIZER_TAG_AMPERSAND: case TOKENIZER_TAG_AMPERSAND_EQUAL: case TOKENIZER_TAG_QUESTION_MARK: case TOKENIZER_TAG_ANGLE_BRACKET_LEFT: case TOKENIZER_TAG_ANGLE_BRACKET_LEFT_EQUAL: case TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT: case TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT_EQUAL: case TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT_PIPE: case TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT_PIPE_EQUAL: case TOKENIZER_TAG_ANGLE_BRACKET_RIGHT: case TOKENIZER_TAG_ANGLE_BRACKET_RIGHT_EQUAL: case TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_RIGHT: case TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_RIGHT_EQUAL: case TOKENIZER_TAG_TILDE: case TOKENIZER_TAG_NUMBER_LITERAL: case TOKENIZER_TAG_DOC_COMMENT: case TOKENIZER_TAG_CONTAINER_DOC_COMMENT: case TOKENIZER_TAG_KEYWORD_ADDRSPACE: case TOKENIZER_TAG_KEYWORD_ALIGN: case TOKENIZER_TAG_KEYWORD_ALLOWZERO: case TOKENIZER_TAG_KEYWORD_AND: case TOKENIZER_TAG_KEYWORD_ANYFRAME: case TOKENIZER_TAG_KEYWORD_ANYTYPE: case TOKENIZER_TAG_KEYWORD_ASM: case TOKENIZER_TAG_KEYWORD_ASYNC: case TOKENIZER_TAG_KEYWORD_AWAIT: case TOKENIZER_TAG_KEYWORD_BREAK: case TOKENIZER_TAG_KEYWORD_CALLCONV: case TOKENIZER_TAG_KEYWORD_CATCH: case TOKENIZER_TAG_KEYWORD_COMPTIME: case TOKENIZER_TAG_KEYWORD_CONST: case TOKENIZER_TAG_KEYWORD_CONTINUE: case TOKENIZER_TAG_KEYWORD_DEFER: case TOKENIZER_TAG_KEYWORD_ELSE: case TOKENIZER_TAG_KEYWORD_ENUM: case TOKENIZER_TAG_KEYWORD_ERRDEFER: case TOKENIZER_TAG_KEYWORD_ERROR: case TOKENIZER_TAG_KEYWORD_EXPORT: case TOKENIZER_TAG_KEYWORD_EXTERN: case TOKENIZER_TAG_KEYWORD_FN: case TOKENIZER_TAG_KEYWORD_FOR: case TOKENIZER_TAG_KEYWORD_IF: case TOKENIZER_TAG_KEYWORD_INLINE: case TOKENIZER_TAG_KEYWORD_NOALIAS: case TOKENIZER_TAG_KEYWORD_NOINLINE: case TOKENIZER_TAG_KEYWORD_NOSUSPEND: case TOKENIZER_TAG_KEYWORD_OPAQUE: case TOKENIZER_TAG_KEYWORD_OR: case TOKENIZER_TAG_KEYWORD_ORELSE: case TOKENIZER_TAG_KEYWORD_PACKED: case TOKENIZER_TAG_KEYWORD_RESUME: case TOKENIZER_TAG_KEYWORD_RETURN: case TOKENIZER_TAG_KEYWORD_LINKSECTION: case TOKENIZER_TAG_KEYWORD_STRUCT: case TOKENIZER_TAG_KEYWORD_SUSPEND: case TOKENIZER_TAG_KEYWORD_SWITCH: case TOKENIZER_TAG_KEYWORD_TEST: case TOKENIZER_TAG_KEYWORD_THREADLOCAL: case TOKENIZER_TAG_KEYWORD_TRY: case TOKENIZER_TAG_KEYWORD_UNION: case TOKENIZER_TAG_KEYWORD_UNREACHABLE: case TOKENIZER_TAG_KEYWORD_USINGNAMESPACE: case TOKENIZER_TAG_KEYWORD_VAR: case TOKENIZER_TAG_KEYWORD_VOLATILE: case TOKENIZER_TAG_KEYWORD_WHILE:; const char* str = tokenizerTagString[p->token_tags[p->tok_i]]; fprintf(stderr, "keyword %s not implemented\n", str); goto cleanup; case TOKENIZER_TAG_KEYWORD_PUB: p->tok_i++; break; // TODO do work } } cleanup: p->scratch.len = scratch_top; return res; } int parse_root(parser* p) { p->nodes.tags[p->nodes.len++] = AST_NODE_TAG_ROOT; p->nodes.main_tokens[p->nodes.len] = 0; // members root_members = parse_container_members(p); return 0; }