ref/hare/ ships only ast/lex/parse/module/unparse — no checker. Every bail-fix landing in A.6.2.1 (helper bail audit, N_IDENT bail audit, enum fold) needs a `ref/harec/...` cite anchor so divergence rationale isn't claimed against memory. PLAN.md L16, L35. Snapshot of upstream commit ee640c6b2c17f57e8014d277a3028b262ffb7952 (`rt/+openbsd/start.ha: remove outdated comment about crt0`). 20 files: 5 src (check.c, eval.c, scope.c, types.c, type_store.c), 14 transitive include/ headers (no parser/codegen surface), and COPYING. License GPLv3 (COPYING included). Vendored as read-only reference per CLAUDE.md rule 6 — no redistribution as binary, no edits.
191 lines
2.4 KiB
C
191 lines
2.4 KiB
C
#ifndef HAREC_LEX_H
|
|
#define HAREC_LEX_H
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include "types.h"
|
|
#include "utf8.h"
|
|
|
|
#define C_EOF UTF8_INVALID
|
|
|
|
// Keep sorted
|
|
enum lexical_token {
|
|
T_ATTR_FINI,
|
|
T_ATTR_INIT,
|
|
T_ATTR_PACKED,
|
|
T_ATTR_SYMBOL,
|
|
T_ATTR_TEST,
|
|
T_ATTR_THREADLOCAL,
|
|
T_ATTR_UNDEFINED,
|
|
T_UNDERSCORE,
|
|
T_ABORT,
|
|
T_ALIGN,
|
|
T_ALLOC,
|
|
T_APPEND,
|
|
T_AS,
|
|
T_ASSERT,
|
|
T_BOOL,
|
|
T_BREAK,
|
|
T_CASE,
|
|
T_CONST,
|
|
T_CONTINUE,
|
|
T_DEF,
|
|
T_DEFER,
|
|
T_DELETE,
|
|
T_DONE,
|
|
T_ELSE,
|
|
T_ENUM,
|
|
T_EXPORT,
|
|
T_F32,
|
|
T_F64,
|
|
T_FALSE,
|
|
T_FN,
|
|
T_FOR,
|
|
T_FREE,
|
|
T_I16,
|
|
T_I32,
|
|
T_I64,
|
|
T_I8,
|
|
T_IF,
|
|
T_INSERT,
|
|
T_INT,
|
|
T_IS,
|
|
T_LEN,
|
|
T_LET,
|
|
T_MATCH,
|
|
T_NEVER,
|
|
T_NOMEM,
|
|
T_NULL,
|
|
T_NULLABLE,
|
|
T_OFFSET,
|
|
T_OPAQUE,
|
|
T_RETURN,
|
|
T_RUNE,
|
|
T_SIZE,
|
|
T_STATIC,
|
|
T_STR,
|
|
T_STRUCT,
|
|
T_SWITCH,
|
|
T_TRUE,
|
|
T_TYPE,
|
|
T_U16,
|
|
T_U32,
|
|
T_U64,
|
|
T_U8,
|
|
T_UINT,
|
|
T_UINTPTR,
|
|
T_UNION,
|
|
T_USE,
|
|
T_VAARG,
|
|
T_VAEND,
|
|
T_VALIST,
|
|
T_VASTART,
|
|
T_VOID,
|
|
T_YIELD,
|
|
T_LAST_KEYWORD = T_YIELD,
|
|
|
|
// Operators
|
|
T_ARROW,
|
|
T_BANDEQ,
|
|
T_BAND,
|
|
T_BNOT,
|
|
T_BOR,
|
|
T_COLON,
|
|
T_COMMA,
|
|
T_DIV,
|
|
T_DIVEQ,
|
|
T_DOT,
|
|
T_DOUBLE_COLON,
|
|
T_DOUBLE_DOT,
|
|
T_ELLIPSIS,
|
|
T_EQUAL,
|
|
T_GREATER,
|
|
T_GREATEREQ,
|
|
T_LAND,
|
|
T_LANDEQ,
|
|
T_LBRACE,
|
|
T_LBRACKET,
|
|
T_LEQUAL,
|
|
T_LESS,
|
|
T_LESSEQ,
|
|
T_LNOT,
|
|
T_LOR,
|
|
T_LOREQ,
|
|
T_LPAREN,
|
|
T_LSHIFT,
|
|
T_LSHIFTEQ,
|
|
T_LXOR,
|
|
T_LXOREQ,
|
|
T_MINUS,
|
|
T_MINUSEQ,
|
|
T_MODEQ,
|
|
T_MODULO,
|
|
T_NEQUAL,
|
|
T_BOREQ,
|
|
T_PLUS,
|
|
T_PLUSEQ,
|
|
T_QUESTION,
|
|
T_RBRACE,
|
|
T_RBRACKET,
|
|
T_RPAREN,
|
|
T_RSHIFT,
|
|
T_RSHIFTEQ,
|
|
T_SEMICOLON,
|
|
T_TIMES,
|
|
T_TIMESEQ,
|
|
T_BXOR,
|
|
T_BXOREQ,
|
|
T_LAST_OPERATOR = T_BXOREQ,
|
|
|
|
// Tokens with additional information
|
|
T_NAME,
|
|
T_LITERAL,
|
|
|
|
// Magic tokens
|
|
T_EOF,
|
|
T_NONE,
|
|
};
|
|
|
|
struct location {
|
|
int file;
|
|
int lineno, colno;
|
|
};
|
|
|
|
struct token {
|
|
struct location loc;
|
|
enum lexical_token token;
|
|
enum type_storage storage;
|
|
union {
|
|
const char *name;
|
|
uint32_t rune;
|
|
int64_t ival;
|
|
uint64_t uval;
|
|
double fval;
|
|
struct {
|
|
size_t len;
|
|
const char *value;
|
|
} string;
|
|
};
|
|
};
|
|
|
|
struct lexer {
|
|
FILE *in;
|
|
char *buf;
|
|
size_t bufsz, buflen;
|
|
uint32_t c[2];
|
|
struct token un;
|
|
struct location loc;
|
|
bool require_int;
|
|
bool in_annotation;
|
|
struct intern_table *itbl;
|
|
};
|
|
|
|
void lex_init(struct lexer *lexer, FILE *f, int fileid, struct intern_table *itbl);
|
|
void lex_finish(struct lexer *lexer);
|
|
enum lexical_token lex(struct lexer *lexer, struct token *out);
|
|
void unlex(struct lexer *lexer, const struct token *in);
|
|
|
|
const char *token_str(const struct token *tok);
|
|
const char *lexical_token_str(enum lexical_token tok);
|
|
|
|
#endif
|