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:
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);