189 lines
6.6 KiB
C
189 lines
6.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#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;
|
|
} FieldState;
|
|
|
|
int parseRoot(Parser* p)
|
|
{
|
|
p->nodes.tags[p->nodes.len++] = AST_NODE_TAG_ROOT;
|
|
p->nodes.main_tokens[p->nodes.len] = 0;
|
|
|
|
// members root_members = parseContainerMembers(p);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static AstTokenIndex nextToken(Parser* p) { return p->tok_i++; }
|
|
|
|
static AstTokenIndex eatToken(Parser* p, TokenizerTag tag)
|
|
{
|
|
return (p->token_tags[p->tok_i] == tag) ? nextToken(p) : -1;
|
|
}
|
|
|
|
static Members parseContainerMembers(Parser* p)
|
|
{
|
|
const uint32_t scratch_top = p->scratch.len;
|
|
Members res = (Members) {};
|
|
// ast_token_index last_field;
|
|
while (eatToken(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);
|
|
exit(1);
|
|
case TOKENIZER_TAG_KEYWORD_PUB:
|
|
p->tok_i++;
|
|
// AstNodeIndex top_level_decl = expectTopLevelDecl(*p);
|
|
break;
|
|
// TODO do work
|
|
}
|
|
}
|
|
|
|
p->scratch.len = scratch_top;
|
|
return res;
|
|
}
|