os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit cafabb31e681429f74e91f1a6df4d4e8ee2541b3
parent 3d87fb52a556029b741201414ed358f8f16ac45f
Author: erai <erai@omiltem.net>
Date:   Mon,  7 Oct 2024 18:33:27 -0400

move peg_parse grammar to peg_new

Diffstat:
Mcc0.c | 26+++++++++++++++-----------
Mparse2.c | 4++--
Mpeg.c | 4++--
Mpeglib.c | 14++++++++++----
4 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/cc0.c b/cc0.c @@ -136,6 +136,8 @@ struct my_parser { }; struct my_peg { struct my_alloc* my_a; + unsigned long(* my_grammar)(struct my_peg*); + unsigned char*(* my_tag_to_str)(unsigned long); unsigned char* my_filename; unsigned char* my_src; unsigned long my_size; @@ -795,9 +797,9 @@ unsigned long( my_peg_P_var_stmt)(struct my_peg* my_c); unsigned long( my_peg_P_void)(struct my_peg* my_c); unsigned long( my_peg_P_xor_op)(struct my_peg* my_c); void( my_peg_compile)(struct my_peg_compiler* my_c,unsigned char* my_filename); -struct my_peg*( my_peg_new)(unsigned char* my_filename,unsigned char* my_src,unsigned long my_len,struct my_alloc* my_a); +struct my_peg*( my_peg_new)(unsigned char* my_filename,unsigned char* my_src,unsigned long my_len,struct my_alloc* my_a,unsigned long(* my_grammar)(struct my_peg*),unsigned char*(* my_tag_to_str)(unsigned long)); void( my_peg_open_output)(struct my_peg_compiler* my_c,unsigned char* my_filename); -struct my_peg_node*( my_peg_parse)(struct my_peg* my_c,unsigned long my_sp,unsigned long(* my_grammar)(struct my_peg*)); +struct my_peg_node*( my_peg_parse)(struct my_peg* my_c,unsigned long my_sp); void( my_peg_reset)(struct my_peg* my_c,unsigned char* my_filename,unsigned char* my_src,unsigned long my_len); struct my_type*( my_prototype)(struct my_compiler* my_c,struct my_node* my_n); void( my_putchar)(struct my_assembler* my_c,unsigned long my_ch); @@ -5226,7 +5228,7 @@ struct my_node*( my_parse)(struct my_parser* my_c,unsigned char* my_filename){ (my_src)=((my_freadall)((my_f),(&(my_len)))); (my_fclose)((my_f)); (my_peg_reset)(((my_c)->my_p),(my_filename),(my_src),(my_len)); - (my_pn)=((my_peg_parse)(((my_c)->my_p),(my_P_sp),(my_peg_P_grammar))); + (my_pn)=((my_peg_parse)(((my_c)->my_p),(my_P_sp))); return (my_reconstruct)((my_c),(my_pn)); } unsigned long( my_parse_escape)(unsigned char* my_s,unsigned long* my_i,unsigned long my_n){ @@ -8121,15 +8123,17 @@ void( my_peg_compile)(struct my_peg_compiler* my_c,unsigned char* my_filename){ (my_f)=((my_fopen)((my_fd),((my_c)->my_a))); (my_src)=((my_freadall)((my_f),(&(my_len)))); (my_fclose)((my_f)); - ((my_c)->my_p)=((my_peg_new)((my_filename),(my_src),(my_len),((my_c)->my_a))); - (my_node)=((my_peg_parse)(((my_c)->my_p),(my_PEG_sp),(my_peg_PEG_grammar))); + ((my_c)->my_p)=((my_peg_new)((my_filename),(my_src),(my_len),((my_c)->my_a),(my_peg_PEG_grammar),(my_PEG_tag_to_str))); + (my_node)=((my_peg_parse)(((my_c)->my_p),(my_PEG_sp))); (my_translate)((my_c),(my_node)); (my_fflush)(((my_c)->my_out)); } -struct my_peg*( my_peg_new)(unsigned char* my_filename,unsigned char* my_src,unsigned long my_len,struct my_alloc* my_a){ +struct my_peg*( my_peg_new)(unsigned char* my_filename,unsigned char* my_src,unsigned long my_len,struct my_alloc* my_a,unsigned long(* my_grammar)(struct my_peg*),unsigned char*(* my_tag_to_str)(unsigned long)){ struct my_peg* my_c = 0; - (my_c)=((struct my_peg*)(my_alloc)((my_a),(184UL))); + (my_c)=((struct my_peg*)(my_alloc)((my_a),(200UL))); ((my_c)->my_a)=(my_a); + ((my_c)->my_grammar)=(my_grammar); + ((my_c)->my_tag_to_str)=(my_tag_to_str); ((my_c)->my_filename)=(my_filename); ((my_c)->my_src)=(my_src); ((my_c)->my_size)=(my_len); @@ -8166,9 +8170,9 @@ void( my_peg_open_output)(struct my_peg_compiler* my_c,unsigned char* my_filenam (my_f)=((my_fopen)((my_fd),((my_c)->my_a))); ((my_c)->my_out)=(my_f); } -struct my_peg_node*( my_peg_parse)(struct my_peg* my_c,unsigned long my_sp,unsigned long(* my_grammar)(struct my_peg*)){ +struct my_peg_node*( my_peg_parse)(struct my_peg* my_c,unsigned long my_sp){ (my_choice)((my_c)); - if ((unsigned long)(!((my_grammar)((my_c))))) { + if ((unsigned long)(!(((my_c)->my_grammar)((my_c))))) { (my_fdputs)((2UL),((unsigned char *)"syntax error at ")); (my_fdputs)((2UL),((my_c)->my_filename)); (my_fdputs)((2UL),((unsigned char *)":")); @@ -8176,7 +8180,7 @@ struct my_peg_node*( my_peg_parse)(struct my_peg* my_c,unsigned long my_sp,unsig (my_fdputs)((2UL),((unsigned char *)":")); (my_fdputd)((2UL),((my_c)->my_fail_col)); (my_fdputs)((2UL),((unsigned char *)" expected ")); - (my_fdputs)((2UL),((my_P_tag_to_str)(((my_c)->my_fail_tag)))); + (my_fdputs)((2UL),(((my_c)->my_tag_to_str)(((my_c)->my_fail_tag)))); if ((my_c)->my_fail_literal) { (my_fdputs)((2UL),((unsigned char *)" '")); (my_fdputs)((2UL),((my_c)->my_fail_literal)); @@ -9082,7 +9086,7 @@ struct my_parser*( my_setup_parser)(struct my_alloc* my_a){ struct my_parser* my_c = 0; (my_c)=((struct my_parser*)(my_alloc)((my_a),(16UL))); ((my_c)->my_a)=(my_a); - ((my_c)->my_p)=((my_peg_new)(((unsigned char *)""),((unsigned char *)""),(0UL),(my_a))); + ((my_c)->my_p)=((my_peg_new)(((unsigned char *)""),((unsigned char *)""),(0UL),(my_a),(my_peg_P_grammar),(my_P_tag_to_str))); return my_c; } struct my_peg_compiler*( my_setup_peg)(struct my_alloc* my_a,unsigned char* my_prefix){ diff --git a/parse2.c b/parse2.c @@ -10,7 +10,7 @@ setup_parser(a: *alloc): *parser { c.a = a; - c.p = peg_new("", "", 0, a); + c.p = peg_new("", "", 0, a, peg_P_grammar, P_tag_to_str); return c; } @@ -35,7 +35,7 @@ parse(c: *parser, filename: *byte): *node { fclose(f); peg_reset(c.p, filename, src, len); - pn = peg_parse(c.p, P_sp, peg_P_grammar); + pn = peg_parse(c.p, P_sp); return reconstruct(c, pn); } diff --git a/peg.c b/peg.c @@ -490,9 +490,9 @@ peg_compile(c: *peg_compiler, filename: *byte) { src = freadall(f, &len); fclose(f); - c.p = peg_new(filename, src, len, c.a); + c.p = peg_new(filename, src, len, c.a, peg_PEG_grammar, PEG_tag_to_str); - node = peg_parse(c.p, PEG_sp, peg_PEG_grammar); + node = peg_parse(c.p, PEG_sp); translate(c, node); fflush(c.out); diff --git a/peglib.c b/peglib.c @@ -19,6 +19,9 @@ struct peg_op { struct peg { a: *alloc; + grammar: (func(c:*peg):int); + tag_to_str: (func(t:int):*byte); + filename: *byte; src: *byte; @@ -288,13 +291,16 @@ construct(c: *peg, sp: int): *peg_node { } } -peg_new(filename: *byte, src: *byte, len: int, a: *alloc): *peg { +peg_new(filename: *byte, src: *byte, len: int, a: *alloc, grammar: (func(c:*peg):int), tag_to_str: (func(t:int):*byte)): *peg { var c: *peg; c = alloc(a, sizeof(*c)):*peg; c.a = a; + c.grammar = grammar; + c.tag_to_str = tag_to_str; + c.filename = filename; c.src = src; @@ -327,9 +333,9 @@ peg_new(filename: *byte, src: *byte, len: int, a: *alloc): *peg { return c; } -peg_parse(c: *peg, sp: int, grammar: (func(c:*peg):int)): *peg_node { +peg_parse(c: *peg, sp: int): *peg_node { choice(c); - if !grammar(c) { + if !c.grammar(c) { fdputs(2, "syntax error at "); fdputs(2, c.filename); fdputs(2, ":"); @@ -337,7 +343,7 @@ peg_parse(c: *peg, sp: int, grammar: (func(c:*peg):int)): *peg_node { fdputs(2, ":"); fdputd(2, c.fail_col); fdputs(2, " expected "); - fdputs(2, P_tag_to_str(c.fail_tag)); + fdputs(2, c.tag_to_str(c.fail_tag)); if c.fail_literal { fdputs(2, " '"); fdputs(2, c.fail_literal);