X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=idl%2Flexer.re;h=91c044a58dfa30ada3e4c290670bc60552cbff3a;hp=4c9e0fea282726115b70d93dfcc0c0dc1d33168b;hb=69008ba2a7733358974c8985caa2e5bcb1182fe1;hpb=ca787916893fd2124a4dd72d326e3435fad5b9c8 diff --git a/idl/lexer.re b/idl/lexer.re index 4c9e0fe..91c044a 100644 --- a/idl/lexer.re +++ b/idl/lexer.re @@ -1,244 +1,2 @@ -#include -#include -#include -#include -#include #include "lexer.h" - -#if INTERFACE -/*!max:re2c*/ -#define BSIZE 256 - -typedef struct PSI_Lexer { - decl_typedefs *defs; - decls *decls; - impls *impls; - char *lib; - char *fn; - FILE *fp; - size_t line; - char *cur, *tok, *lim, *eof, *ctx, *mrk, buf[BSIZE]; -} PSI_Lexer; -#endif - -#if BSIZE < YYMAXFILL -# error BSIZE must be greater than YYMAXFILL -#endif - -PSI_Token *PSI_TokenAlloc(PSI_Lexer *L, token_t t) -{ - PSI_Token *T; - size_t token_len; - - if (L->cur <= L->tok) { - return NULL; - } - - token_len = L->cur - L->tok; - - T = malloc(sizeof(*T) + token_len); - T->type = t; - T->line = L->line; - T->size = token_len; - T->text[token_len] = 0; - memcpy(T->text, L->tok, token_len); - - return T; -} - -size_t PSI_LexerFill(PSI_Lexer *L, size_t n) -{ - // printf("+ Fill: n=%zu\n", n); - if (!n) { - L->cur = L->tok = L->lim = L->mrk = L->buf; - L->eof = NULL; - } - - if (!L->eof) { - size_t consumed = L->tok - L->buf; - size_t reserved = L->lim - L->tok; - size_t available = BSIZE - reserved; - size_t didread; - - if (consumed) { - memmove(L->buf, L->tok, reserved); - L->tok -= consumed; - L->cur -= consumed; - L->lim -= consumed; - L->mrk -= consumed; - } - - didread = fread(L->lim, 1, available, L->fp); - L->lim += didread; - if (didread < available) { - L->eof = L->lim; - } - - // printf("+ Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n", - // consumed, reserved, available, didread); - } - // printf("+ Fill: avail=%zu\n", L->lim - L->cur); - return L->lim - L->cur; -} - -void PSI_LexerDtor(PSI_Lexer *L) -{ - if (L->fp) { - fclose(L->fp); - } - if (L->fn) { - free(L->fn); - } - if (L->lib) { - free(L->lib); - } - if (L->defs) { - free_decl_typedefs(L->defs); - } - if (L->decls) { - free_decls(L->decls); - } - if (L->impls) { - free_impls(L->impls); - } - memset(L, 0, sizeof(*L)); -} - -void PSI_LexerFree(PSI_Lexer **L) -{ - if (*L) { - PSI_LexerDtor(*L); - free(*L); - *L = NULL; - } -} - -PSI_Lexer *PSI_LexerInit(PSI_Lexer *L, const char *filename) -{ - FILE *fp = fopen(filename, "r"); - - if (!fp) { - perror(filename); - return NULL; - } - - if (!L) { - L = malloc(sizeof(*L)); - } - memset(L, 0, sizeof(*L)); - - L->fp = fp; - L->fn = strdup(filename); - L->line = 1; - - PSI_LexerFill(L, 0); - - return L; -} - - -token_t PSI_LexerScan(PSI_Lexer *L) -{ - for (;;) { - L->tok = L->cur; - /*!re2c - re2c:indent:top = 2; - re2c:define:YYCTYPE = "unsigned char"; - re2c:define:YYCURSOR = L->cur; - re2c:define:YYLIMIT = L->lim; - re2c:define:YYMARKER = L->mrk; - re2c:define:YYFILL = "{ if (!PSI_LexerFill(L,@@)) return -1; }"; - re2c:yyfill:parameter = 0; - - B = [^a-zA-Z0-9_]; - W = [a-zA-Z0-9_]; - NAME = W+; - NSNAME = (NAME)? ("\\" NAME)+; - QUOTED_STRING = "\"" ([^\"])+ "\""; - NULL = 'NULL'; - MIXED = 'mixed'; - VOID = 'void'; - BOOL = 'bool'; - INT = 'int'; - FLOAT = 'float'; - DOUBLE = 'double'; - SINT8 = 'sint8'; - UINT8 = 'uint8'; - SINT16 = 'sint16'; - UINT16 = 'uint16'; - SINT32 = 'sint32'; - UINT32 = 'uint32'; - SINT64 = 'sint64'; - UINT64 = 'uint64'; - STRING = 'string'; - ARRAY = 'array'; - FUNCTION = 'function'; - TYPEDEF = 'typedef'; - LIB = 'lib'; - LET = 'let'; - SET = 'set'; - RET = 'ret'; - STRVAL = 'strval'; - INTVAL = 'intval'; - FLOATVAL = 'floatval'; - BOOLVAL = 'boolval'; - TO_STRING = 'to_string'; - TO_INT = 'to_int'; - TO_FLOAT = 'to_float'; - TO_BOOL = 'to_bool'; - - "#" .* "\n" { ++L->line; return PSI_T_COMMENT;} - "(" {return PSI_T_LPAREN;} - ")" {return PSI_T_RPAREN;} - ";" {return PSI_T_EOS;} - "," {return PSI_T_COMMA;} - ":" {return PSI_T_COLON;} - "{" {return PSI_T_LBRACE;} - "}" {return PSI_T_RBRACE;} - "." {return PSI_T_DOT;} - "=" {return PSI_T_EQUALS;} - "$" {return PSI_T_DOLLAR;} - "*" {return PSI_T_POINTER;} - "&" {return PSI_T_REFERENCE;} - [\r\n] { ++L->line; continue; } - [\t ]+ { continue; } - NULL {return PSI_T_NULL;} - MIXED {return PSI_T_MIXED;} - VOID {return PSI_T_VOID;} - BOOL {return PSI_T_BOOL;} - INT {return PSI_T_INT;} - FLOAT {return PSI_T_FLOAT;} - DOUBLE {return PSI_T_DOUBLE;} - SINT8 {return PSI_T_SINT8;} - UINT8 {return PSI_T_UINT8;} - SINT16 {return PSI_T_SINT16;} - UINT16 {return PSI_T_UINT16;} - SINT32 {return PSI_T_SINT32;} - UINT32 {return PSI_T_UINT32;} - SINT64 {return PSI_T_SINT64;} - UINT64 {return PSI_T_UINT64;} - STRING {return PSI_T_STRING;} - ARRAY {return PSI_T_ARRAY;} - FUNCTION {return PSI_T_FUNCTION;} - TYPEDEF {return PSI_T_TYPEDEF;} - LIB {return PSI_T_LIB;} - LET {return PSI_T_LET;} - SET {return PSI_T_SET;} - RET {return PSI_T_RET;} - STRVAL {return PSI_T_STRVAL;} - INTVAL {return PSI_T_INTVAL;} - FLOATVAL {return PSI_T_FLOATVAL;} - BOOLVAL {return PSI_T_BOOLVAL;} - TO_STRING {return PSI_T_TO_STRING;} - TO_INT {return PSI_T_TO_INT;} - TO_FLOAT {return PSI_T_TO_FLOAT;} - TO_BOOL {return PSI_T_TO_BOOL;} - [0-9] {return PSI_T_DIGIT;} - NAME {return PSI_T_NAME;} - NSNAME {return PSI_T_NSNAME;} - QUOTED_STRING {return PSI_T_QUOTED_STRING;} - */ - } - return -1; -}