making parser
This commit is contained in:
190
parser.c
Normal file
190
parser.c
Normal file
@@ -0,0 +1,190 @@
|
||||
#include <stdio.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;
|
||||
} 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;
|
||||
}
|
||||
Reference in New Issue
Block a user