ref: vendor harec checker sources (#20)
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.
This commit is contained in:
190
ref/harec/include/lex.h
Normal file
190
ref/harec/include/lex.h
Normal file
@@ -0,0 +1,190 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user