// file: tiny_interp.c #define _POSIX_C_SOURCE 200809L #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> /* ----- tiny arena ----- */ typedef struct { unsigned char *base; size_t cap, off; } Arena; static Arena *arena_new(size_t cap){ Arena*a=malloc(sizeof(*a)); if(!a)return NULL; a->base=malloc(cap); if(!a->base){free(a);return NULL;} a->cap=cap; a->off=0; return a;} static void *arena_alloc(Arena*a,size_t n,size_t al){ size_t p=(a->off+(al-1))&~(al-1); if(p+n>a->cap)return NULL; void*ptr=a->base+p; a->off=p+n; return ptr; } static void arena_free(Arena*a){ if(!a)return; free(a->base); free(a); } /* ----- tokens ----- */ typedef enum { TOK_INT, TOK_PLUS, TOK_MINUS, TOK_STAR, TOK_SLASH, TOK_LPAREN, TOK_RPAREN, TOK_IDENT, TOK_EQ, TOK_EOF, TOK_ERR } TokKind; typedef struct { TokKind kind; long ival; const char *s,*e; char *lexeme; } Token; typedef struct { const char *src,*cur; Token look; } Lexer; static void skip_ws(Lexer*L){ while(isspace((unsigned char)*L->cur)) L->cur++; } static Token make_tok(TokKind k,const char*s,const char*e,long v,char*lex){ return (Token){k,v,s,e,lex}; } static Token next_raw(Lexer*L){ skip_ws(L); const char*s=L->cur; if(*L->cur==0) return make_tok(TOK_EOF,s,s,0,NULL); char c=*L->cur++; if (c=='+') return make_tok(TOK_PLUS, s,L->cur,0,NULL); if (c=='-') return make_tok(TOK_MINUS,s,L->cur,0,NULL); if (c=='*') return make_tok(TOK_STAR, s,L->cur,0,NULL); if (c=='/') return make_tok(TOK_SLASH,s,L->cur,0,NULL); if (c=='(') return make_tok(TOK_LPAREN,s,L->cur,0,NULL); if (c==')') return make_tok(TOK_RPAREN,s,L->cur,0,NULL); if (c=='=') return make_tok(TOK_EQ, s,L->cur,0,NULL); if (isdigit((unsigned char)c)) { long v = c - '0'; const char*p=L->cur; while (isdigit((unsigned char)*p)) { v = v*10 + (*p - '0'); p++; } L->cur = p; return make_tok(TOK_INT, s,p,v,NULL); } if (isalpha((unsigned char)c) || c=='_') { const char*p=L->cur; while (isalnum((unsigned char)*p) || *p=='_') p++; size_t n = (size_t)(p - (L->cur-1)); // i...
First seen: 2026-03-26 21:16
Last seen: 2026-03-26 22:16