add c and jai

This commit is contained in:
2026-07-13 13:02:47 -04:00
parent cf8342f8d4
commit c5b14d7c41
33 changed files with 6306 additions and 0 deletions

98
c/lexer/lexer.h Normal file
View File

@@ -0,0 +1,98 @@
#pragma once
// lexer.h -- Token types, tokenizer interface, and color scheme
//
// Follows the Focus editor pattern: a universal Token_Type enum shared by all
// languages, a per-byte token-type array on each buffer, and language-specific
// tokenizer functions that fill that array.
#include "base/base_core.h"
////////////////////////////////
// Token types (universal across all languages)
//
// The enum value doubles as an index into the color map, so CODE_DEFAULT
// must be 0. Keep this list ordered -- rendering indexes directly.
typedef enum Token_Type {
TOK_DEFAULT = 0,
TOK_COMMENT,
TOK_MULTILINE_COMMENT,
TOK_STRING_LITERAL,
TOK_CHAR_LITERAL,
TOK_NUMBER,
TOK_IDENTIFIER,
TOK_FUNCTION,
TOK_KEYWORD,
TOK_TYPE,
TOK_VALUE, // true, false, NULL, nullptr
TOK_MODIFIER, // const, static, volatile, extern ...
TOK_DIRECTIVE, // #include, #define, ...
TOK_PUNCTUATION,
TOK_OPERATION,
TOK_INVALID,
TOK_COUNT
} Token_Type;
////////////////////////////////
// Language enum
typedef enum Lang {
LANG_PLAIN_TEXT = 0,
LANG_C,
LANG_GO,
LANG_JS,
LANG_LUA,
LANG_SQL,
LANG_COUNT
} Lang;
// Human-readable language names (indexed by Lang)
extern const char *g_lang_names[LANG_COUNT];
////////////////////////////////
// Tokenizer state (shared by all language tokenizers)
typedef struct Tokenizer {
const char *buf; // start of buffer data
const char *t; // current scan cursor
const char *max_t; // one past end
const char *start_t; // cursor at start of current token
} Tokenizer;
////////////////////////////////
// Token (returned by get_next_token functions)
typedef struct Token {
S32 start; // byte offset into buffer
S32 len; // byte length of token
Token_Type type;
} Token;
////////////////////////////////
// Language tokenizer function signature
//
// A tokenizer function takes a buffer's data + length, and writes token types
// into the `out_tokens` array (one byte per source byte, same length as data).
// This is the Focus "paint the token array" approach.
typedef void (*LexerTokenizeFn)(const char *data, S32 length, U8 *out_tokens);
// Get the tokenizer function for a language.
static LexerTokenizeFn lexer_get_tokenize_fn(Lang lang);
// Detect language from a file name / extension.
static Lang lexer_detect_lang(const char *filename);
////////////////////////////////
// Common tokenizer helpers (usable by all language tokenizers)
static void tokenizer_init(Tokenizer *tok, const char *data, S32 length);
static void tokenizer_eat_whitespace(Tokenizer *tok);
static void tokenizer_eat_until_newline(Tokenizer *tok);