making parser

This commit is contained in:
2024-12-20 00:00:51 +02:00
parent 69e90b6b9f
commit 228b215259
7 changed files with 405 additions and 196 deletions

View File

@@ -4,130 +4,140 @@
#include <stdbool.h>
#include <stdint.h>
#define FOREACH_TOKENIZER_TAG_ENUM(TAG) \
TAG(TOKENIZER_TAG_INVALID) \
TAG(TOKENIZER_TAG_INVALID_PERIODASTERISKS) \
TAG(TOKENIZER_TAG_IDENTIFIER) \
TAG(TOKENIZER_TAG_STRING_LITERAL) \
TAG(TOKENIZER_TAG_MULTILINE_STRING_LITERAL_LINE) \
TAG(TOKENIZER_TAG_CHAR_LITERAL) \
TAG(TOKENIZER_TAG_EOF) \
TAG(TOKENIZER_TAG_BUILTIN) \
TAG(TOKENIZER_TAG_BANG) \
TAG(TOKENIZER_TAG_PIPE) \
TAG(TOKENIZER_TAG_PIPE_PIPE) \
TAG(TOKENIZER_TAG_PIPE_EQUAL) \
TAG(TOKENIZER_TAG_EQUAL) \
TAG(TOKENIZER_TAG_EQUAL_EQUAL) \
TAG(TOKENIZER_TAG_EQUAL_ANGLE_BRACKET_RIGHT) \
TAG(TOKENIZER_TAG_BANG_EQUAL) \
TAG(TOKENIZER_TAG_L_PAREN) \
TAG(TOKENIZER_TAG_R_PAREN) \
TAG(TOKENIZER_TAG_SEMICOLON) \
TAG(TOKENIZER_TAG_PERCENT) \
TAG(TOKENIZER_TAG_PERCENT_EQUAL) \
TAG(TOKENIZER_TAG_L_BRACE) \
TAG(TOKENIZER_TAG_R_BRACE) \
TAG(TOKENIZER_TAG_L_BRACKET) \
TAG(TOKENIZER_TAG_R_BRACKET) \
TAG(TOKENIZER_TAG_PERIOD) \
TAG(TOKENIZER_TAG_PERIOD_ASTERISK) \
TAG(TOKENIZER_TAG_ELLIPSIS2) \
TAG(TOKENIZER_TAG_ELLIPSIS3) \
TAG(TOKENIZER_TAG_CARET) \
TAG(TOKENIZER_TAG_CARET_EQUAL) \
TAG(TOKENIZER_TAG_PLUS) \
TAG(TOKENIZER_TAG_PLUS_PLUS) \
TAG(TOKENIZER_TAG_PLUS_EQUAL) \
TAG(TOKENIZER_TAG_PLUS_PERCENT) \
TAG(TOKENIZER_TAG_PLUS_PERCENT_EQUAL) \
TAG(TOKENIZER_TAG_PLUS_PIPE) \
TAG(TOKENIZER_TAG_PLUS_PIPE_EQUAL) \
TAG(TOKENIZER_TAG_MINUS) \
TAG(TOKENIZER_TAG_MINUS_EQUAL) \
TAG(TOKENIZER_TAG_MINUS_PERCENT) \
TAG(TOKENIZER_TAG_MINUS_PERCENT_EQUAL) \
TAG(TOKENIZER_TAG_MINUS_PIPE) \
TAG(TOKENIZER_TAG_MINUS_PIPE_EQUAL) \
TAG(TOKENIZER_TAG_ASTERISK) \
TAG(TOKENIZER_TAG_ASTERISK_EQUAL) \
TAG(TOKENIZER_TAG_ASTERISK_ASTERISK) \
TAG(TOKENIZER_TAG_ASTERISK_PERCENT) \
TAG(TOKENIZER_TAG_ASTERISK_PERCENT_EQUAL) \
TAG(TOKENIZER_TAG_ASTERISK_PIPE) \
TAG(TOKENIZER_TAG_ASTERISK_PIPE_EQUAL) \
TAG(TOKENIZER_TAG_ARROW) \
TAG(TOKENIZER_TAG_COLON) \
TAG(TOKENIZER_TAG_SLASH) \
TAG(TOKENIZER_TAG_SLASH_EQUAL) \
TAG(TOKENIZER_TAG_COMMA) \
TAG(TOKENIZER_TAG_AMPERSAND) \
TAG(TOKENIZER_TAG_AMPERSAND_EQUAL) \
TAG(TOKENIZER_TAG_QUESTION_MARK) \
TAG(TOKENIZER_TAG_ANGLE_BRACKET_LEFT) \
TAG(TOKENIZER_TAG_ANGLE_BRACKET_LEFT_EQUAL) \
TAG(TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT) \
TAG(TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT_EQUAL) \
TAG(TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT_PIPE) \
TAG(TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT_PIPE_EQUAL) \
TAG(TOKENIZER_TAG_ANGLE_BRACKET_RIGHT) \
TAG(TOKENIZER_TAG_ANGLE_BRACKET_RIGHT_EQUAL) \
TAG(TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_RIGHT) \
TAG(TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_RIGHT_EQUAL) \
TAG(TOKENIZER_TAG_TILDE) \
TAG(TOKENIZER_TAG_NUMBER_LITERAL) \
TAG(TOKENIZER_TAG_DOC_COMMENT) \
TAG(TOKENIZER_TAG_CONTAINER_DOC_COMMENT) \
TAG(TOKENIZER_TAG_KEYWORD_ADDRSPACE) \
TAG(TOKENIZER_TAG_KEYWORD_ALIGN) \
TAG(TOKENIZER_TAG_KEYWORD_ALLOWZERO) \
TAG(TOKENIZER_TAG_KEYWORD_AND) \
TAG(TOKENIZER_TAG_KEYWORD_ANYFRAME) \
TAG(TOKENIZER_TAG_KEYWORD_ANYTYPE) \
TAG(TOKENIZER_TAG_KEYWORD_ASM) \
TAG(TOKENIZER_TAG_KEYWORD_ASYNC) \
TAG(TOKENIZER_TAG_KEYWORD_AWAIT) \
TAG(TOKENIZER_TAG_KEYWORD_BREAK) \
TAG(TOKENIZER_TAG_KEYWORD_CALLCONV) \
TAG(TOKENIZER_TAG_KEYWORD_CATCH) \
TAG(TOKENIZER_TAG_KEYWORD_COMPTIME) \
TAG(TOKENIZER_TAG_KEYWORD_CONST) \
TAG(TOKENIZER_TAG_KEYWORD_CONTINUE) \
TAG(TOKENIZER_TAG_KEYWORD_DEFER) \
TAG(TOKENIZER_TAG_KEYWORD_ELSE) \
TAG(TOKENIZER_TAG_KEYWORD_ENUM) \
TAG(TOKENIZER_TAG_KEYWORD_ERRDEFER) \
TAG(TOKENIZER_TAG_KEYWORD_ERROR) \
TAG(TOKENIZER_TAG_KEYWORD_EXPORT) \
TAG(TOKENIZER_TAG_KEYWORD_EXTERN) \
TAG(TOKENIZER_TAG_KEYWORD_FN) \
TAG(TOKENIZER_TAG_KEYWORD_FOR) \
TAG(TOKENIZER_TAG_KEYWORD_IF) \
TAG(TOKENIZER_TAG_KEYWORD_INLINE) \
TAG(TOKENIZER_TAG_KEYWORD_NOALIAS) \
TAG(TOKENIZER_TAG_KEYWORD_NOINLINE) \
TAG(TOKENIZER_TAG_KEYWORD_NOSUSPEND) \
TAG(TOKENIZER_TAG_KEYWORD_OPAQUE) \
TAG(TOKENIZER_TAG_KEYWORD_OR) \
TAG(TOKENIZER_TAG_KEYWORD_ORELSE) \
TAG(TOKENIZER_TAG_KEYWORD_PACKED) \
TAG(TOKENIZER_TAG_KEYWORD_PUB) \
TAG(TOKENIZER_TAG_KEYWORD_RESUME) \
TAG(TOKENIZER_TAG_KEYWORD_RETURN) \
TAG(TOKENIZER_TAG_KEYWORD_LINKSECTION) \
TAG(TOKENIZER_TAG_KEYWORD_STRUCT) \
TAG(TOKENIZER_TAG_KEYWORD_SUSPEND) \
TAG(TOKENIZER_TAG_KEYWORD_SWITCH) \
TAG(TOKENIZER_TAG_KEYWORD_TEST) \
TAG(TOKENIZER_TAG_KEYWORD_THREADLOCAL) \
TAG(TOKENIZER_TAG_KEYWORD_TRY) \
TAG(TOKENIZER_TAG_KEYWORD_UNION) \
TAG(TOKENIZER_TAG_KEYWORD_UNREACHABLE) \
TAG(TOKENIZER_TAG_KEYWORD_USINGNAMESPACE) \
TAG(TOKENIZER_TAG_KEYWORD_VAR) \
TAG(TOKENIZER_TAG_KEYWORD_VOLATILE) \
TAG(TOKENIZER_TAG_KEYWORD_WHILE) \
#define GENERATE_ENUM(ENUM) ENUM,
#define GENERATE_STRING(STRING) #STRING,
typedef enum {
TOKENIZER_TAG_INVALID,
TOKENIZER_TAG_INVALID_PERIODASTERISKS,
TOKENIZER_TAG_IDENTIFIER,
TOKENIZER_TAG_STRING_LITERAL,
TOKENIZER_TAG_MULTILINE_STRING_LITERAL_LINE,
TOKENIZER_TAG_CHAR_LITERAL,
TOKENIZER_TAG_EOF,
TOKENIZER_TAG_BUILTIN,
TOKENIZER_TAG_BANG,
TOKENIZER_TAG_PIPE,
TOKENIZER_TAG_PIPE_PIPE,
TOKENIZER_TAG_PIPE_EQUAL,
TOKENIZER_TAG_EQUAL,
TOKENIZER_TAG_EQUAL_EQUAL,
TOKENIZER_TAG_EQUAL_ANGLE_BRACKET_RIGHT,
TOKENIZER_TAG_BANG_EQUAL,
TOKENIZER_TAG_L_PAREN,
TOKENIZER_TAG_R_PAREN,
TOKENIZER_TAG_SEMICOLON,
TOKENIZER_TAG_PERCENT,
TOKENIZER_TAG_PERCENT_EQUAL,
TOKENIZER_TAG_L_BRACE,
TOKENIZER_TAG_R_BRACE,
TOKENIZER_TAG_L_BRACKET,
TOKENIZER_TAG_R_BRACKET,
TOKENIZER_TAG_PERIOD,
TOKENIZER_TAG_PERIOD_ASTERISK,
TOKENIZER_TAG_ELLIPSIS2,
TOKENIZER_TAG_ELLIPSIS3,
TOKENIZER_TAG_CARET,
TOKENIZER_TAG_CARET_EQUAL,
TOKENIZER_TAG_PLUS,
TOKENIZER_TAG_PLUS_PLUS,
TOKENIZER_TAG_PLUS_EQUAL,
TOKENIZER_TAG_PLUS_PERCENT,
TOKENIZER_TAG_PLUS_PERCENT_EQUAL,
TOKENIZER_TAG_PLUS_PIPE,
TOKENIZER_TAG_PLUS_PIPE_EQUAL,
TOKENIZER_TAG_MINUS,
TOKENIZER_TAG_MINUS_EQUAL,
TOKENIZER_TAG_MINUS_PERCENT,
TOKENIZER_TAG_MINUS_PERCENT_EQUAL,
TOKENIZER_TAG_MINUS_PIPE,
TOKENIZER_TAG_MINUS_PIPE_EQUAL,
TOKENIZER_TAG_ASTERISK,
TOKENIZER_TAG_ASTERISK_EQUAL,
TOKENIZER_TAG_ASTERISK_ASTERISK,
TOKENIZER_TAG_ASTERISK_PERCENT,
TOKENIZER_TAG_ASTERISK_PERCENT_EQUAL,
TOKENIZER_TAG_ASTERISK_PIPE,
TOKENIZER_TAG_ASTERISK_PIPE_EQUAL,
TOKENIZER_TAG_ARROW,
TOKENIZER_TAG_COLON,
TOKENIZER_TAG_SLASH,
TOKENIZER_TAG_SLASH_EQUAL,
TOKENIZER_TAG_COMMA,
TOKENIZER_TAG_AMPERSAND,
TOKENIZER_TAG_AMPERSAND_EQUAL,
TOKENIZER_TAG_QUESTION_MARK,
TOKENIZER_TAG_ANGLE_BRACKET_LEFT,
TOKENIZER_TAG_ANGLE_BRACKET_LEFT_EQUAL,
TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT,
TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT_EQUAL,
TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT_PIPE,
TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_LEFT_PIPE_EQUAL,
TOKENIZER_TAG_ANGLE_BRACKET_RIGHT,
TOKENIZER_TAG_ANGLE_BRACKET_RIGHT_EQUAL,
TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_RIGHT,
TOKENIZER_TAG_ANGLE_BRACKET_ANGLE_BRACKET_RIGHT_EQUAL,
TOKENIZER_TAG_TILDE,
TOKENIZER_TAG_NUMBER_LITERAL,
TOKENIZER_TAG_DOC_COMMENT,
TOKENIZER_TAG_CONTAINER_DOC_COMMENT,
TOKENIZER_TAG_KEYWORD_ADDRSPACE,
TOKENIZER_TAG_KEYWORD_ALIGN,
TOKENIZER_TAG_KEYWORD_ALLOWZERO,
TOKENIZER_TAG_KEYWORD_AND,
TOKENIZER_TAG_KEYWORD_ANYFRAME,
TOKENIZER_TAG_KEYWORD_ANYTYPE,
TOKENIZER_TAG_KEYWORD_ASM,
TOKENIZER_TAG_KEYWORD_ASYNC,
TOKENIZER_TAG_KEYWORD_AWAIT,
TOKENIZER_TAG_KEYWORD_BREAK,
TOKENIZER_TAG_KEYWORD_CALLCONV,
TOKENIZER_TAG_KEYWORD_CATCH,
TOKENIZER_TAG_KEYWORD_COMPTIME,
TOKENIZER_TAG_KEYWORD_CONST,
TOKENIZER_TAG_KEYWORD_CONTINUE,
TOKENIZER_TAG_KEYWORD_DEFER,
TOKENIZER_TAG_KEYWORD_ELSE,
TOKENIZER_TAG_KEYWORD_ENUM,
TOKENIZER_TAG_KEYWORD_ERRDEFER,
TOKENIZER_TAG_KEYWORD_ERROR,
TOKENIZER_TAG_KEYWORD_EXPORT,
TOKENIZER_TAG_KEYWORD_EXTERN,
TOKENIZER_TAG_KEYWORD_FN,
TOKENIZER_TAG_KEYWORD_FOR,
TOKENIZER_TAG_KEYWORD_IF,
TOKENIZER_TAG_KEYWORD_INLINE,
TOKENIZER_TAG_KEYWORD_NOALIAS,
TOKENIZER_TAG_KEYWORD_NOINLINE,
TOKENIZER_TAG_KEYWORD_NOSUSPEND,
TOKENIZER_TAG_KEYWORD_OPAQUE,
TOKENIZER_TAG_KEYWORD_OR,
TOKENIZER_TAG_KEYWORD_ORELSE,
TOKENIZER_TAG_KEYWORD_PACKED,
TOKENIZER_TAG_KEYWORD_PUB,
TOKENIZER_TAG_KEYWORD_RESUME,
TOKENIZER_TAG_KEYWORD_RETURN,
TOKENIZER_TAG_KEYWORD_LINKSECTION,
TOKENIZER_TAG_KEYWORD_STRUCT,
TOKENIZER_TAG_KEYWORD_SUSPEND,
TOKENIZER_TAG_KEYWORD_SWITCH,
TOKENIZER_TAG_KEYWORD_TEST,
TOKENIZER_TAG_KEYWORD_THREADLOCAL,
TOKENIZER_TAG_KEYWORD_TRY,
TOKENIZER_TAG_KEYWORD_UNION,
TOKENIZER_TAG_KEYWORD_UNREACHABLE,
TOKENIZER_TAG_KEYWORD_USINGNAMESPACE,
TOKENIZER_TAG_KEYWORD_VAR,
TOKENIZER_TAG_KEYWORD_VOLATILE,
TOKENIZER_TAG_KEYWORD_WHILE,
} tokenizer_tag;
FOREACH_TOKENIZER_TAG_ENUM(GENERATE_ENUM)
} tokenizerTag;
static const char *tokenizerTagString[] = {
FOREACH_TOKENIZER_TAG_ENUM(GENERATE_STRING)
};
typedef enum {
TOKENIZER_STATE_START,
@@ -175,14 +185,14 @@ typedef enum {
TOKENIZER_STATE_PERIOD_ASTERISK,
TOKENIZER_STATE_SAW_AT_SIGN,
TOKENIZER_STATE_INVALID,
} tokenizer_state;
} tokenizerState;
typedef struct {
tokenizer_tag tag;
tokenizerTag tag;
struct {
uint32_t start, end;
} loc;
} tokenizer_token;
} tokenizerToken;
typedef struct {
const char* buffer;
@@ -191,6 +201,6 @@ typedef struct {
} tokenizer;
tokenizer tokenizer_init(const char* buffer, uint32_t len);
tokenizer_token tokenizer_next(tokenizer* self);
tokenizerToken tokenizer_next(tokenizer* self);
#endif