From 6cdf57f4689906f1da3b0b926c5714ba6a6f600f Mon Sep 17 00:00:00 2001 From: anon Date: Sat, 7 Dec 2024 11:49:33 +0100 Subject: [PATCH] actually actually compile and run --- .gitignore | 1 + Makefile | 13 +++++++-- source/generator.c | 9 ++++-- source/jeger.h | 7 +++-- source/jeger.l | 71 ++++++++++++++++++++++++---------------------- 5 files changed, 58 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index d828a51..46a2b1b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +jeger regtest *.out *.so diff --git a/Makefile b/Makefile index 796ddee..30b526b 100644 --- a/Makefile +++ b/Makefile @@ -8,8 +8,15 @@ CPPFLAGS += ${CFLAGS} OUTPUT := jeger -main: object/main.o object/generator.o object/jeger.yy.o - ${LINK.cxx} +${OUTPUT}: object/main.o object/generator.o object/jeger.yy.o + ${LINK.cpp} -o ${OUTPUT} $? + +test: + ./${OUTPUT} source/jeger.l + +clean: + -rm ${OBJECT.d}/*.o + -rm ${OUTPUT} object/%.yy.cpp: source/%.l flex -o $@ $< @@ -18,4 +25,4 @@ object/%.o: source/%.c ${COMPILE.c} $< -o $@ object/%.o: source/%.cpp - ${COMPILE.cxx} $< -o $@ + ${COMPILE.cpp} $< -o $@ diff --git a/source/generator.c b/source/generator.c index 45ea6a3..372a8e3 100644 --- a/source/generator.c +++ b/source/generator.c @@ -6,9 +6,12 @@ #include "jeger.h" //#define AS_SYMBOL(c) (c-'a') -#define AS_SYMBOL(c) c +#define AS_SYMBOL(c) ((int)c) #define TOKEN_OFFSET 128 /* XXX */ +int alphabet_size = 128; +rule_t * patterns; + static inline void put_header(FILE * f, const int alphabet_size, const int n_states, const int no_match) { fputs( @@ -76,7 +79,7 @@ int get_most_common_prefix(const char * pattern, char * * prefixes, int current_ return r; } -int get_max_number_of_states(const pattern_t * patterns) { +int get_max_number_of_states(const rule_t * patterns) { int r = 0; int state_max_accumulator = -1; for (int i = 0; patterns[i].pattern != NULL; i++) { @@ -111,7 +114,7 @@ void generate(const char * filename) { patterns[pattern_index].pattern != NULL; pattern_index++ ) { - const pattern_t * pattern = &patterns[pattern_index]; + const rule_t * pattern = &patterns[pattern_index]; int current_state_start = states[pattern->state]; if (current_state_start == -1) { diff --git a/source/jeger.h b/source/jeger.h index 1088cc0..67569b4 100644 --- a/source/jeger.h +++ b/source/jeger.h @@ -3,10 +3,11 @@ typedef struct { int state; - const char * pattern; -} pattern_t; + char * pattern; + char * code; +} rule_t; -extern pattern_t * patterns; +extern rule_t * patterns; extern int alphabet_size; extern void generate(const char * filename); diff --git a/source/jeger.l b/source/jeger.l index 17bedf7..d05428b 100644 --- a/source/jeger.l +++ b/source/jeger.l @@ -38,13 +38,13 @@ typedef struct { char * pattern; char * code; - } rule_t; + } rule_t2; string definition_section_code_buffer; string code_section_code_buffer; - map> rules; - map>::iterator current_state; + map> rules; + map>::iterator current_state; string patter_buffer; string code_buffer; @@ -191,7 +191,7 @@ prefix={value} { \} { --nest_counter; if (nest_counter == -1) { - current_state->second.push_back((rule_t) { + current_state->second.push_back((rule_t2) { .pattern = strdup(patter_buffer.c_str()), .code = strdup(code_buffer.c_str()), }); @@ -217,7 +217,7 @@ prefix={value} { \\\\ { ; } \\\" { ; } \" { BEGIN IN_CODE; } -.|\n { ; } +.|\n { ; } /* XXX we are eating strings */ } { @@ -238,32 +238,8 @@ prefix={value} { %% -int parse(const char * filename) { - int r = 0; - FILE * f = fopen(filename, "r"); - if (!f) { return 2; } - - yyin = f; - - r = yylex(); - if (r) { return r; } - - /* XXX fill globals */ - - return r; -} - -#ifdef SCANNER_MAIN - -signed main(int argc, char * argv[]) { - if (argc < 2) { return 1; } - - FILE * f = fopen(argv[1], "r"); - if (!f) { return 2; } - - yyin = f; - yylex(); - +static +void dump_parse_results(void) { puts(definition_section_code_buffer.c_str()); puts("----------"); @@ -277,8 +253,35 @@ signed main(int argc, char * argv[]) { puts("----------"); puts(code_section_code_buffer.c_str()); - - return 0; } -#endif +extern "C" +int parse(const char * filename) { + int r = 0; + FILE * f = fopen(filename, "r"); + if (!f) { return 2; } + + yyin = f; + + r = yylex(); + if (r) { return r; } + + dump_parse_results(); + + patterns = (rule_t*)malloc(sizeof(rule_t)*(rules.size()+1)); + + int i = 0; + for (const auto &rule_it : rules) { + for (const auto &rule : rule_it.second) { + patterns[i++] = (rule_t) { + .state = i, + .pattern = rule.pattern, + .code = rule.code, + }; + } + } + patterns[rules.size()] = (rule_t) { 0, NULL, NULL }; + + + return r; +}