From ca787916893fd2124a4dd72d326e3435fad5b9c8 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 12 Oct 2015 21:14:56 +0200 Subject: [PATCH] flush --- .gitignore | 3 + idl/Makefile | 46 +++++++--- idl/compiler.c | 18 ++++ idl/lexer.h | 234 +++++++++++++++++++++++++++++++++++++++++++----- idl/lexer.re | 16 +++- idl/main.c | 5 +- idl/main.h | 196 ++++++++++++++++++++++++++++++++++++++++ idl/parser.y | 3 +- idl/types.h | 47 +++++++--- idl/validator.c | 15 +++- idl/validator.h | 185 ++++++++++++++++++++++++++++++++++++-- 11 files changed, 707 insertions(+), 61 deletions(-) create mode 100644 idl/compiler.c create mode 100644 idl/main.h diff --git a/.gitignore b/.gitignore index 6a24edf..492bf33 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ /idl/parser.c /idl/parser.out /idl/makeheaders* +/idl/lemon.c +/idl/lempar.c +/idl/lemon diff --git a/idl/Makefile b/idl/Makefile index 84860c9..ccc4bf6 100644 --- a/idl/Makefile +++ b/idl/Makefile @@ -1,29 +1,51 @@ CFLAGS += -g -D$(shell uname | tr a-z A-Z) +SOURCES := parser.c lexer.c validator.c compiler.c main.c +HEADERS := $(addsuffix .[ch], $(basename $(SOURCES))) + +GENERATED_FILES := $(addsuffix .h, $(basename $(SOURCES))) + .PHONY: all -all: main +all: headers main + +.PHONY: headers +headers: makeheaders $(SOURCES) + ./makeheaders $(HEADERS) types.h + +GENERATED_FILES += lempar.c +lempar.c: + curl -sSo $@ "http://www.sqlite.org/src/raw/tool/lempar.c?name=3617143ddb9b176c3605defe6a9c798793280120" + +GENERATED_FILES += lemon.c +lemon.c: + curl -sSo $@ "http://www.sqlite.org/src/raw/tool/lemon.c?name=039f813b520b9395740c52f9cbf36c90b5d8df03" + +GENERATED_FILES += lemon +lemon: lemon.c | lempar.c +GENERATED_FILES += makeheaders.c makeheaders.c: - curl -sSO http://www.hwaci.com/sw/mkhdr/makeheaders.c + curl -sSo makeheaders.c "https://www.fossil-scm.org/xfer/raw/src/makeheaders.c?name=c42268ec69aae42b8dd10471fd73377d789873ca" +#http://www.hwaci.com/sw/mkhdr/makeheaders.c GENERATED_FILES += makeheaders makeheaders: makeheaders.c GENERATED_FILES += main -main: main.c parser.c lexer.c validator.c - -GENERATED_FILES += parser.h -parser.h: parser.c makeheaders - ./makeheaders $<:$@ - touch $@ +main: $(SOURCES) GENERATED_FILES += parser.c -parser.c: parser.y types.h - lemon -c -m $< +parser.c: parser.y lemon + ./lemon -c -m $< GENERATED_FILES += lexer.c -lexer.c: lexer.re parser.h +lexer.c: lexer.re re2c -o $@ $< +%.h: headers + +%.c: %.h + touch $@ + .PHONY: clean clean: - -rm -f $(GENERATED_FILES) + -echo rm -f $(GENERATED_FILES) diff --git a/idl/compiler.c b/idl/compiler.c new file mode 100644 index 0000000..7250836 --- /dev/null +++ b/idl/compiler.c @@ -0,0 +1,18 @@ +#include + +#include "compiler.h" + +#if INTERFACE +typedef struct PSI_Compiler { + decl_typedefs *defs; + decls *decls; + impls *impls; + char *lib; + char *fn; +} PSI_Compiler; +#endif + +PSI_Compiler *PSI_CompilerInit(PSI_Compiler *C, PSI_Validator *V) +{ + +} diff --git a/idl/lexer.h b/idl/lexer.h index be1ee57..3f74a28 100644 --- a/idl/lexer.h +++ b/idl/lexer.h @@ -1,19 +1,206 @@ -#define BSIZE 256 - +/* This file was automatically generated. Do not edit! */ +#undef INTERFACE +#define PSI_T_COMMENT 1 +#define PSI_T_NULL 27 +#define PSI_T_MIXED 42 +#define PSI_T_VOID 10 +#define PSI_T_BOOLVAL 35 +#define PSI_T_BOOL 43 +#define PSI_T_INTVAL 33 +#define PSI_T_INT 11 +#define PSI_T_FLOATVAL 34 +#define PSI_T_FLOAT 12 +#define PSI_T_FUNCTION 24 +#define PSI_T_DOUBLE 13 +#define PSI_T_SET 36 +#define PSI_T_SINT16 16 +#define PSI_T_SINT32 18 +#define PSI_T_SINT64 20 +#define PSI_T_SINT8 14 +#define PSI_T_STRING 44 +#define PSI_T_STRVAL 32 +#define PSI_T_UINT16 17 +#define PSI_T_UINT32 19 +#define PSI_T_UINT64 21 +#define PSI_T_UINT8 15 +#define PSI_T_ARRAY 45 +#define PSI_T_TO_BOOL 40 +#define PSI_T_TO_FLOAT 39 +#define PSI_T_TO_INT 38 +#define PSI_T_TO_STRING 37 +#define PSI_T_TYPEDEF 5 +#define PSI_T_LET 31 +#define PSI_T_LIB 2 +#define PSI_T_RET 41 +#define PSI_T_NSNAME 25 +#define PSI_T_QUOTED_STRING 3 +#define PSI_T_DIGIT 46 +#define PSI_T_NAME 6 +#define PSI_T_REFERENCE 29 +#define PSI_T_POINTER 50 +#define PSI_T_DOLLAR 28 +#define PSI_T_EQUALS 30 +#define PSI_T_DOT 47 +#define PSI_T_RBRACE 23 +#define PSI_T_LBRACE 22 +#define PSI_T_COLON 26 +#define PSI_T_COMMA 9 +#define PSI_T_EOS 4 +#define PSI_T_RPAREN 8 +#define PSI_T_LPAREN 7 typedef int token_t; - -typedef struct PSI_Token { +typedef struct PSI_Lexer PSI_Lexer; +typedef struct decl_typedefs decl_typedefs; +typedef struct decl_typedef decl_typedef; +typedef struct decl_type decl_type; +struct decl_type { + char *name; token_t type; - unsigned line; - size_t size; - char text[1]; -} PSI_Token; - -typedef struct impls impls; + struct decl_type *real; +}; +struct decl_typedef { + char *alias; + decl_type *type; +}; +struct decl_typedefs { + size_t count; + decl_typedef **list; +}; typedef struct decls decls; -typedef struct decl_typedefs decl_typedefs; - -typedef struct PSI_Lexer { +typedef struct decl decl; +typedef struct decl_abi decl_abi; +struct decl_abi { + char *convention; +}; +typedef struct decl_arg decl_arg; +typedef struct decl_var decl_var; +struct decl_var { + char *name; + unsigned pointer_level; +}; +struct decl_arg { + decl_type *type; + decl_var *var; +}; +typedef struct decl_args decl_args; +struct decl_args { + decl_arg **args; + size_t count; +}; +struct decl { + decl_abi *abi; + decl_arg *func; + decl_args *args; + void *dlptr; +}; +struct decls { + size_t count; + decl **list; +}; +typedef struct impls impls; +typedef struct impl impl; +typedef struct impl_func impl_func; +typedef struct impl_args impl_args; +typedef struct impl_arg impl_arg; +typedef struct impl_type impl_type; +struct impl_type { + char *name; + token_t type; +}; +typedef struct impl_var impl_var; +struct impl_var { + char *name; + unsigned reference:1; +}; +typedef struct impl_def_val impl_def_val; +struct impl_def_val { + token_t type; + union { + int64_t digits; + double decimals; + } v; + unsigned is_null:1; +}; +struct impl_arg { + impl_type *type; + impl_var *var; + impl_def_val *def; +}; +struct impl_args { + impl_arg **args; + size_t count; +}; +struct impl_func { + char *name; + impl_args *args; + impl_type *return_type; +}; +typedef struct impl_stmts impl_stmts; +typedef struct impl_stmt impl_stmt; +typedef struct let_stmt let_stmt; +typedef struct let_value let_value; +typedef struct let_func let_func; +struct let_func { + token_t type; + char *name; +}; +struct let_value { + let_func *func; + impl_var *var; + unsigned null_pointer_ref:1; +}; +struct let_stmt { + decl_var *var; + let_value *val; +}; +typedef struct set_stmt set_stmt; +typedef struct set_value set_value; +typedef struct set_func set_func; +struct set_func { + token_t type; + char *name; +}; +typedef struct decl_vars decl_vars; +struct decl_vars { + decl_var **vars; + size_t count; +}; +struct set_value { + set_func *func; + decl_vars *vars; +}; +struct set_stmt { + impl_var *var; + set_value *val; +}; +typedef struct ret_stmt ret_stmt; +struct ret_stmt { + set_func *func; + decl_var *decl; +}; +struct impl_stmt { + token_t type; + union { + let_stmt *let; + set_stmt *set; + ret_stmt *ret; + void *ptr; + } s; +}; +struct impl_stmts { + impl_stmt **stmts; + size_t count; +}; +struct impl { + impl_func *func; + impl_stmts *stmts; +}; +struct impls { + size_t count; + impl **list; +}; +#define BSIZE 256 +struct PSI_Lexer { decl_typedefs *defs; decls *decls; impls *impls; @@ -22,12 +209,19 @@ typedef struct PSI_Lexer { FILE *fp; size_t line; char *cur, *tok, *lim, *eof, *ctx, *mrk, buf[BSIZE]; -} PSI_Lexer; - -PSI_Lexer *PSI_LexerInit(PSI_Lexer *L, const char *filename); -size_t PSI_LexerFill(PSI_Lexer *L, size_t n); +}; token_t PSI_LexerScan(PSI_Lexer *L); -void PSI_LexerDtor(PSI_Lexer *L); +PSI_Lexer *PSI_LexerInit(PSI_Lexer *L,const char *filename); void PSI_LexerFree(PSI_Lexer **L); - -PSI_Token *PSI_TokenAlloc(PSI_Lexer *L, token_t t); +void PSI_LexerDtor(PSI_Lexer *L); +size_t PSI_LexerFill(PSI_Lexer *L,size_t n); +typedef struct PSI_Token PSI_Token; +struct PSI_Token { + token_t type; + unsigned line; + size_t size; + char text[1]; +}; +PSI_Token *PSI_TokenAlloc(PSI_Lexer *L,token_t t); +#define YYMAXFILL 10 +#define INTERFACE 0 diff --git a/idl/lexer.re b/idl/lexer.re index d52436a..4c9e0fe 100644 --- a/idl/lexer.re +++ b/idl/lexer.re @@ -5,13 +5,23 @@ #include #include "lexer.h" -#include "parser.h" -#include "types.h" -#ifndef BSIZE +#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 diff --git a/idl/main.c b/idl/main.c index f802958..c4664be 100644 --- a/idl/main.c +++ b/idl/main.c @@ -1,9 +1,8 @@ #include #include #include -#include "lexer.h" -#include "parser.h" -#include "validator.h" + +#include "main.h" static int TRACE; diff --git a/idl/main.h b/idl/main.h new file mode 100644 index 0000000..bb8b14a --- /dev/null +++ b/idl/main.h @@ -0,0 +1,196 @@ +/* This file was automatically generated. Do not edit! */ +#undef INTERFACE +typedef struct PSI_Validator PSI_Validator; +typedef struct decl_typedefs decl_typedefs; +typedef struct decl_typedef decl_typedef; +typedef struct decl_type decl_type; +typedef int token_t; +struct decl_type { + char *name; + token_t type; + struct decl_type *real; +}; +struct decl_typedef { + char *alias; + decl_type *type; +}; +struct decl_typedefs { + size_t count; + decl_typedef **list; +}; +typedef struct decls decls; +typedef struct decl decl; +typedef struct decl_abi decl_abi; +struct decl_abi { + char *convention; +}; +typedef struct decl_arg decl_arg; +typedef struct decl_var decl_var; +struct decl_var { + char *name; + unsigned pointer_level; +}; +struct decl_arg { + decl_type *type; + decl_var *var; +}; +typedef struct decl_args decl_args; +struct decl_args { + decl_arg **args; + size_t count; +}; +struct decl { + decl_abi *abi; + decl_arg *func; + decl_args *args; + void *dlptr; +}; +struct decls { + size_t count; + decl **list; +}; +typedef struct impls impls; +typedef struct impl impl; +typedef struct impl_func impl_func; +typedef struct impl_args impl_args; +typedef struct impl_arg impl_arg; +typedef struct impl_type impl_type; +struct impl_type { + char *name; + token_t type; +}; +typedef struct impl_var impl_var; +struct impl_var { + char *name; + unsigned reference:1; +}; +typedef struct impl_def_val impl_def_val; +struct impl_def_val { + token_t type; + union { + int64_t digits; + double decimals; + } v; + unsigned is_null:1; +}; +struct impl_arg { + impl_type *type; + impl_var *var; + impl_def_val *def; +}; +struct impl_args { + impl_arg **args; + size_t count; +}; +struct impl_func { + char *name; + impl_args *args; + impl_type *return_type; +}; +typedef struct impl_stmts impl_stmts; +typedef struct impl_stmt impl_stmt; +typedef struct let_stmt let_stmt; +typedef struct let_value let_value; +typedef struct let_func let_func; +struct let_func { + token_t type; + char *name; +}; +struct let_value { + let_func *func; + impl_var *var; + unsigned null_pointer_ref:1; +}; +struct let_stmt { + decl_var *var; + let_value *val; +}; +typedef struct set_stmt set_stmt; +typedef struct set_value set_value; +typedef struct set_func set_func; +struct set_func { + token_t type; + char *name; +}; +typedef struct decl_vars decl_vars; +struct decl_vars { + decl_var **vars; + size_t count; +}; +struct set_value { + set_func *func; + decl_vars *vars; +}; +struct set_stmt { + impl_var *var; + set_value *val; +}; +typedef struct ret_stmt ret_stmt; +struct ret_stmt { + set_func *func; + decl_var *decl; +}; +struct impl_stmt { + token_t type; + union { + let_stmt *let; + set_stmt *set; + ret_stmt *ret; + void *ptr; + } s; +}; +struct impl_stmts { + impl_stmt **stmts; + size_t count; +}; +struct impl { + impl_func *func; + impl_stmts *stmts; +}; +struct impls { + size_t count; + impl **list; +}; +struct PSI_Validator { + decl_typedefs *defs; + decls *decls; + impls *impls; + char *lib; + char *fn; + void *dlopened; +}; +void PSI_ValidatorDtor(PSI_Validator *V); +int PSI_ValidatorValidate(PSI_Validator *V); +typedef struct PSI_Lexer PSI_Lexer; +#define BSIZE 256 +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]; +}; +void PSI_LexerDtor(PSI_Lexer *L); +PSI_Validator *PSI_ValidatorInit(PSI_Validator *V,PSI_Lexer *L); +void PSI_ParserFree(void *p,void(*freeProc)(void *)); +PSI_Lexer *PSI_LexerInit(PSI_Lexer *L,const char *filename); +void *PSI_ParserAlloc(void *(*mallocProc)(size_t)); +int main(int argc,char *argv[]); +typedef struct PSI_Token PSI_Token; +struct PSI_Token { + token_t type; + unsigned line; + size_t size; + char text[1]; +}; +#define PSI_ParserTOKENTYPE PSI_Token * +#define PSI_ParserARG_PDECL ,PSI_Lexer *L +void PSI_Parser(void *yyp,int yymajor,PSI_ParserTOKENTYPE yyminor PSI_ParserARG_PDECL); +PSI_Token *PSI_TokenAlloc(PSI_Lexer *L,token_t t); +token_t PSI_LexerScan(PSI_Lexer *L); +#if !defined(NDEBUG) +void PSI_ParserTrace(FILE *TraceFILE,char *zTracePrompt); +#endif diff --git a/idl/parser.y b/idl/parser.y index 0515332..de0de4a 100644 --- a/idl/parser.y +++ b/idl/parser.y @@ -3,9 +3,8 @@ #include #include #include -#include "lexer.h" + #include "parser.h" -#include "types.h" static void syntax_error(const char *fn, size_t ln, const char *msg, ...) { fprintf(stderr, "WARNING: Syntax error on line %zu in '%s'%s", ln, fn, msg ? ": ": "\n"); diff --git a/idl/types.h b/idl/types.h index 7225b5d..e3a0ead 100644 --- a/idl/types.h +++ b/idl/types.h @@ -1,17 +1,12 @@ -typedef struct PSI_Data { - decl_typedefs *defs; - decls *decls; - impls *impls; - char *lib; - char *fn; -} PSI_Data; -static inline void PSI_DataExchange(PSI_Data *dest, PSI_Data *src) { - memcpy(dest, src, sizeof(*dest)); - memset(src, 0, sizeof(*src)); -} +typedef int token_t; -struct decl_typedef; +typedef struct PSI_Token { + token_t type; + unsigned line; + size_t size; + char text[1]; +} PSI_Token; typedef struct decl_type { char *name; @@ -592,3 +587,31 @@ static void free_impls(impls *impls) { free(impls->list); free(impls); } + +typedef struct PSI_Data { + decl_typedefs *defs; + decls *decls; + impls *impls; + char *lib; + char *fn; +} PSI_Data; + +EXPORT static inline void PSI_DataExchange(PSI_Data *dest, PSI_Data *src) { + memcpy(dest, src, sizeof(*dest)); + memset(src, 0, sizeof(*src)); +} + +EXPORT static inline void PSI_DataDtor(PSI_Data *data) { + if (data->defs) { + free_decl_typedefs(data->defs); + } + if (data->decls) { + free_decls(data->decls); + } + if (data->impls) { + free_impls(data->impls); + } + if (data->fn) { + free(data->fn); + } +} diff --git a/idl/validator.c b/idl/validator.c index d2b7cfe..e81d923 100644 --- a/idl/validator.c +++ b/idl/validator.c @@ -3,11 +3,20 @@ #include #include #include -#include "lexer.h" -#include "parser.h" -#include "types.h" + #include "validator.h" +#if INTERFACE +typedef struct PSI_Validator { + decl_typedefs *defs; + decls *decls; + impls *impls; + char *lib; + char *fn; + void *dlopened; +} PSI_Validator; +#endif + PSI_Validator *PSI_ValidatorInit(PSI_Validator *V, PSI_Lexer *L) { if (!V) { diff --git a/idl/validator.h b/idl/validator.h index c7e8264..51828f8 100644 --- a/idl/validator.h +++ b/idl/validator.h @@ -1,14 +1,187 @@ - -typedef struct PSI_Validator { +/* This file was automatically generated. Do not edit! */ +#undef INTERFACE +typedef struct PSI_Validator PSI_Validator; +typedef struct decl_typedefs decl_typedefs; +typedef struct decl_typedef decl_typedef; +typedef struct decl_type decl_type; +typedef int token_t; +struct decl_type { + char *name; + token_t type; + struct decl_type *real; +}; +struct decl_typedef { + char *alias; + decl_type *type; +}; +struct decl_typedefs { + size_t count; + decl_typedef **list; +}; +typedef struct decls decls; +typedef struct decl decl; +typedef struct decl_abi decl_abi; +struct decl_abi { + char *convention; +}; +typedef struct decl_arg decl_arg; +typedef struct decl_var decl_var; +struct decl_var { + char *name; + unsigned pointer_level; +}; +struct decl_arg { + decl_type *type; + decl_var *var; +}; +typedef struct decl_args decl_args; +struct decl_args { + decl_arg **args; + size_t count; +}; +struct decl { + decl_abi *abi; + decl_arg *func; + decl_args *args; + void *dlptr; +}; +struct decls { + size_t count; + decl **list; +}; +typedef struct impls impls; +typedef struct impl impl; +typedef struct impl_func impl_func; +typedef struct impl_args impl_args; +typedef struct impl_arg impl_arg; +typedef struct impl_type impl_type; +struct impl_type { + char *name; + token_t type; +}; +typedef struct impl_var impl_var; +struct impl_var { + char *name; + unsigned reference:1; +}; +typedef struct impl_def_val impl_def_val; +struct impl_def_val { + token_t type; + union { + int64_t digits; + double decimals; + } v; + unsigned is_null:1; +}; +struct impl_arg { + impl_type *type; + impl_var *var; + impl_def_val *def; +}; +struct impl_args { + impl_arg **args; + size_t count; +}; +struct impl_func { + char *name; + impl_args *args; + impl_type *return_type; +}; +typedef struct impl_stmts impl_stmts; +typedef struct impl_stmt impl_stmt; +typedef struct let_stmt let_stmt; +typedef struct let_value let_value; +typedef struct let_func let_func; +struct let_func { + token_t type; + char *name; +}; +struct let_value { + let_func *func; + impl_var *var; + unsigned null_pointer_ref:1; +}; +struct let_stmt { + decl_var *var; + let_value *val; +}; +typedef struct set_stmt set_stmt; +typedef struct set_value set_value; +typedef struct set_func set_func; +struct set_func { + token_t type; + char *name; +}; +typedef struct decl_vars decl_vars; +struct decl_vars { + decl_var **vars; + size_t count; +}; +struct set_value { + set_func *func; + decl_vars *vars; +}; +struct set_stmt { + impl_var *var; + set_value *val; +}; +typedef struct ret_stmt ret_stmt; +struct ret_stmt { + set_func *func; + decl_var *decl; +}; +struct impl_stmt { + token_t type; + union { + let_stmt *let; + set_stmt *set; + ret_stmt *ret; + void *ptr; + } s; +}; +struct impl_stmts { + impl_stmt **stmts; + size_t count; +}; +struct impl { + impl_func *func; + impl_stmts *stmts; +}; +struct impls { + size_t count; + impl **list; +}; +struct PSI_Validator { decl_typedefs *defs; decls *decls; impls *impls; char *lib; char *fn; void *dlopened; -} PSI_Validator; - -PSI_Validator *PSI_ValidatorInit(PSI_Validator *V, PSI_Lexer *L); +}; int PSI_ValidatorValidate(PSI_Validator *V); -void PSI_ValidatorDtor(PSI_Validator *V); +#define PSI_T_NAME 6 void PSI_ValidatorFree(PSI_Validator **V); +void PSI_ValidatorDtor(PSI_Validator *V); +typedef struct PSI_Data PSI_Data; +struct PSI_Data { + decl_typedefs *defs; + decls *decls; + impls *impls; + char *lib; + char *fn; +}; +typedef struct PSI_Lexer PSI_Lexer; +#define BSIZE 256 +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_Validator *PSI_ValidatorInit(PSI_Validator *V,PSI_Lexer *L); +#define INTERFACE 0 -- 2.30.2