commit 449a045f05e9089c7aa1aded5b5bbf39355bd646
parent 3aa804c090616287b208133741dcc5713d23f0ac
Author: erai <erai@omiltem.net>
Date: Mon, 24 Mar 2025 14:48:27 +0000
Make the grammar sublanguage fit better
Diffstat:
M | cc0.c | | | 565 | ++++++++++++++++++++++++++++++++++++++++++++----------------------------------- |
M | cc3.om | | | 274 | +++++++++++++++++++++++++++++++++++++++---------------------------------------- |
M | peg.om | | | 34 | +++++++++++++++++++++++++++------- |
3 files changed, 480 insertions(+), 393 deletions(-)
diff --git a/cc0.c b/cc0.c
@@ -233,7 +233,9 @@ u zpeg_P_if_stmt();
u zpeg_P_index_expr();
u zpeg_P_int();
u zpeg_P_label_stmt();
+u zpeg_P_lalr();
u zpeg_P_le_op();
+u zpeg_P_lex();
u zpeg_P_loop();
u zpeg_P_loop_stmt();
u zpeg_P_lsh_op();
@@ -248,6 +250,7 @@ u zpeg_P_neg_op();
u zpeg_P_nil();
u zpeg_P_not_op();
u zpeg_P_or_op();
+u zpeg_P_peg();
u zpeg_P_peg_alternative();
u zpeg_P_peg_any();
u zpeg_P_peg_call();
@@ -259,7 +262,6 @@ u zpeg_P_peg_literal();
u zpeg_P_peg_lookahead();
u zpeg_P_peg_lookop();
u zpeg_P_peg_pattern();
-u zpeg_P_peg_prefix();
u zpeg_P_peg_primary();
u zpeg_P_peg_rule();
u zpeg_P_peg_suffix();
@@ -553,40 +555,44 @@ b172: if (vtag != 86UL) goto b174;
b174: if (vtag != 87UL) goto b176;
return (u)"P_nil";
b176: if (vtag != 88UL) goto b178;
- return (u)"P_ident";
+ return (u)"P_peg";
b178: if (vtag != 89UL) goto b180;
- return (u)"P_sp";
+ return (u)"P_lex";
b180: if (vtag != 90UL) goto b182;
- return (u)"P_peg_grammar";
+ return (u)"P_lalr";
b182: if (vtag != 91UL) goto b184;
- return (u)"P_peg_rule";
+ return (u)"P_ident";
b184: if (vtag != 92UL) goto b186;
- return (u)"P_peg_prefix";
+ return (u)"P_sp";
b186: if (vtag != 93UL) goto b188;
- return (u)"P_peg_pattern";
+ return (u)"P_peg_grammar";
b188: if (vtag != 94UL) goto b190;
- return (u)"P_peg_alternative";
+ return (u)"P_peg_rule";
b190: if (vtag != 95UL) goto b192;
- return (u)"P_peg_lookop";
+ return (u)"P_peg_pattern";
b192: if (vtag != 96UL) goto b194;
- return (u)"P_peg_lookahead";
+ return (u)"P_peg_alternative";
b194: if (vtag != 97UL) goto b196;
- return (u)"P_peg_countop";
+ return (u)"P_peg_lookop";
b196: if (vtag != 98UL) goto b198;
- return (u)"P_peg_suffix";
+ return (u)"P_peg_lookahead";
b198: if (vtag != 99UL) goto b200;
- return (u)"P_peg_primary";
+ return (u)"P_peg_countop";
b200: if (vtag != 100UL) goto b202;
- return (u)"P_peg_any";
+ return (u)"P_peg_suffix";
b202: if (vtag != 101UL) goto b204;
- return (u)"P_peg_literal";
+ return (u)"P_peg_primary";
b204: if (vtag != 102UL) goto b206;
- return (u)"P_peg_class";
+ return (u)"P_peg_any";
b206: if (vtag != 103UL) goto b208;
- return (u)"P_peg_call";
+ return (u)"P_peg_literal";
b208: if (vtag != 104UL) goto b210;
+ return (u)"P_peg_class";
+b210: if (vtag != 105UL) goto b212;
+ return (u)"P_peg_call";
+b212: if (vtag != 106UL) goto b214;
return (u)"P_peg_identifier";
-b210: return 0UL;
+b214: return 0UL;
}
u z_start(u vargc, u vargv, u venvp) {
u v3 = 0;
@@ -3460,7 +3466,7 @@ b1: if (!vn) goto b7;
v2 = 0UL;
b8: if (!v2) goto b5;
return vret;
-b5: if (*(u*)(vn + 0UL) != 97UL) goto b11;
+b5: if (*(u*)(vn + 0UL) != 99UL) goto b11;
if ((u)*(b*)(*(u*)(vn + 24UL) + 0UL * 1UL) != 63UL) goto b14;
if (vret != 1UL) goto b17;
vret = 0UL;
@@ -3496,7 +3502,7 @@ b7: v2 = 1UL;
u zdecode_look(u vn) {
u vret = 0;
vret = 0UL;
- if (*(u*)(*(u*)(vn + 16UL) + 0UL) != 95UL) goto b3;
+ if (*(u*)(*(u*)(vn + 16UL) + 0UL) != 97UL) goto b3;
if ((u)*(b*)(*(u*)(*(u*)(vn + 16UL) + 24UL) + 0UL * 1UL) != 33UL) goto b6;
vret = 1UL;
b4:b1: return vret;
@@ -27236,7 +27242,7 @@ b2: v28 = (u)zfopen;
v44;
v45 = (u)zpeg_parse;
v46 = *(u*)(vc + 8UL);
- v47 = 89UL;
+ v47 = 92UL;
v48 = verr;
v49 = ((u(*)())v45)(v46, v47, v48);
vpn = v49;
@@ -27666,7 +27672,7 @@ u zpeg_P_char(u vc) {
u v9 = 0;
u v10 = 0;
zenter(vc, 68UL);
- v1 = zcharset(vc, (u)"'");
+ v1 = zliteral(vc, (u)"'");
if (v1 == 0UL) goto b1;
zchoice(vc);
v2 = zcharset(vc, (u)"\134");
@@ -27685,12 +27691,12 @@ b29: zcommit(vc);
goto b25;
b30: zchoice(vc);
zchoice(vc);
- v8 = zcharset(vc, (u)"'");
+ v8 = zliteral(vc, (u)"'");
if (v8 == 0UL) goto b38;
zfail(vc);
zfail(vc);
b36: zfail(vc);
- v10 = zcharset(vc, (u)"'");
+ v10 = zliteral(vc, (u)"'");
if (v10 == 0UL) goto b1;
zleave(vc, 68UL);
return 1UL;
@@ -27701,7 +27707,7 @@ b38: v9 = zany(vc);
goto b29;
b7: zchoice(vc);
zchoice(vc);
- v4 = zcharset(vc, (u)"'");
+ v4 = zliteral(vc, (u)"'");
if (v4 == 0UL) goto b15;
zfail(vc);
zfail(vc);
@@ -28314,7 +28320,7 @@ u zpeg_P_ident(u vc) {
u v1 = 0;
u v2 = 0;
u v3 = 0;
- zenter(vc, 88UL);
+ zenter(vc, 91UL);
zchoice(vc);
v1 = zpeg_P_reserved(vc);
if (v1 == 0UL) goto b3;
@@ -28329,7 +28335,7 @@ b11: zchoice(vc);
if (v3 == 0UL) goto b12;
zcommit(vc);
goto b11;
-b12: zleave(vc, 88UL);
+b12: zleave(vc, 91UL);
return 1UL;
}
u zpeg_P_if(u vc) {
@@ -28435,6 +28441,22 @@ u zpeg_P_label_stmt(u vc) {
b1: zfail(vc);
return 0UL;
}
+u zpeg_P_lalr(u vc) {
+ u v1 = 0;
+ u v2 = 0;
+ zenter(vc, 90UL);
+ v1 = zliteral(vc, (u)"lalr_grammar");
+ if (v1 == 0UL) goto b1;
+ zchoice(vc);
+ v2 = zcharset(vc, (u)"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz");
+ if (v2 == 0UL) goto b5;
+ zfail(vc);
+ zfail(vc);
+b1: zfail(vc);
+ return 0UL;
+b5: zleave(vc, 90UL);
+ return 1UL;
+}
u zpeg_P_le_op(u vc) {
u v1 = 0;
zenter(vc, 31UL);
@@ -28445,6 +28467,22 @@ u zpeg_P_le_op(u vc) {
b1: zfail(vc);
return 0UL;
}
+u zpeg_P_lex(u vc) {
+ u v1 = 0;
+ u v2 = 0;
+ zenter(vc, 89UL);
+ v1 = zliteral(vc, (u)"lexer");
+ if (v1 == 0UL) goto b1;
+ zchoice(vc);
+ v2 = zcharset(vc, (u)"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz");
+ if (v2 == 0UL) goto b5;
+ zfail(vc);
+ zfail(vc);
+b1: zfail(vc);
+ return 0UL;
+b5: zleave(vc, 89UL);
+ return 1UL;
+}
u zpeg_P_loop(u vc) {
u v1 = 0;
u v2 = 0;
@@ -28683,10 +28721,26 @@ b1: zfail(vc);
b5: zleave(vc, 40UL);
return 1UL;
}
+u zpeg_P_peg(u vc) {
+ u v1 = 0;
+ u v2 = 0;
+ zenter(vc, 88UL);
+ v1 = zliteral(vc, (u)"peg_grammar");
+ if (v1 == 0UL) goto b1;
+ zchoice(vc);
+ v2 = zcharset(vc, (u)"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz");
+ if (v2 == 0UL) goto b5;
+ zfail(vc);
+ zfail(vc);
+b1: zfail(vc);
+ return 0UL;
+b5: zleave(vc, 88UL);
+ return 1UL;
+}
u zpeg_P_peg_alternative(u vc) {
u v1 = 0;
u v2 = 0;
- zenter(vc, 94UL);
+ zenter(vc, 96UL);
v1 = zpeg_P_peg_lookahead(vc);
if (v1 == 0UL) goto b1;
b5: zchoice(vc);
@@ -28694,17 +28748,17 @@ b5: zchoice(vc);
if (v2 == 0UL) goto b6;
zcommit(vc);
goto b5;
-b6: zleave(vc, 94UL);
+b6: zleave(vc, 96UL);
return 1UL;
b1: zfail(vc);
return 0UL;
}
u zpeg_P_peg_any(u vc) {
u v1 = 0;
- zenter(vc, 100UL);
+ zenter(vc, 102UL);
v1 = zliteral(vc, (u)".");
if (v1 == 0UL) goto b1;
- zleave(vc, 100UL);
+ zleave(vc, 102UL);
return 1UL;
b1: zfail(vc);
return 0UL;
@@ -28713,19 +28767,19 @@ u zpeg_P_peg_call(u vc) {
u v1 = 0;
u v2 = 0;
u v3 = 0;
- zenter(vc, 103UL);
+ zenter(vc, 105UL);
v1 = zpeg_P_peg_identifier(vc);
if (v1 == 0UL) goto b1;
zchoice(vc);
v2 = zpeg_P_sp(vc);
if (v2 == 0UL) goto b5;
- v3 = zliteral(vc, (u)"<-");
+ v3 = zliteral(vc, (u)"=");
if (v3 == 0UL) goto b5;
zfail(vc);
zfail(vc);
b1: zfail(vc);
return 0UL;
-b5: zleave(vc, 103UL);
+b5: zleave(vc, 105UL);
return 1UL;
}
u zpeg_P_peg_class(u vc) {
@@ -28736,7 +28790,7 @@ u zpeg_P_peg_class(u vc) {
u v5 = 0;
u v6 = 0;
u v7 = 0;
- zenter(vc, 102UL);
+ zenter(vc, 104UL);
v1 = zliteral(vc, (u)"[");
if (v1 == 0UL) goto b1;
b5: zchoice(vc);
@@ -28747,7 +28801,7 @@ b5: zchoice(vc);
zfail(vc);
b6: v7 = zliteral(vc, (u)"]");
if (v7 == 0UL) goto b1;
- zleave(vc, 102UL);
+ zleave(vc, 104UL);
return 1UL;
b1: zfail(vc);
return 0UL;
@@ -28770,10 +28824,10 @@ b24: zfail(vc);
}
u zpeg_P_peg_countop(u vc) {
u v1 = 0;
- zenter(vc, 97UL);
+ zenter(vc, 99UL);
v1 = zcharset(vc, (u)"*+?");
if (v1 == 0UL) goto b1;
- zleave(vc, 97UL);
+ zleave(vc, 99UL);
return 1UL;
b1: zfail(vc);
return 0UL;
@@ -28787,46 +28841,35 @@ u zpeg_P_peg_grammar(u vc) {
u v6 = 0;
u v7 = 0;
u v8 = 0;
- zenter(vc, 90UL);
- v1 = zliteral(vc, (u)"%{");
+ zenter(vc, 93UL);
+ v1 = zliteral(vc, (u)"peg_grammar");
if (v1 == 0UL) goto b1;
v2 = zpeg_P_sp(vc);
if (v2 == 0UL) goto b1;
- zchoice(vc);
- v3 = zpeg_P_peg_rule(vc);
- if (v3 == 0UL) goto b9;
-b8: zcommit(vc);
-b19: zchoice(vc);
- zchoice(vc);
+ v3 = zliteral(vc, (u)"{");
+ if (v3 == 0UL) goto b1;
+ v4 = zpeg_P_sp(vc);
+ if (v4 == 0UL) goto b1;
v5 = zpeg_P_peg_rule(vc);
- if (v5 == 0UL) goto b24;
-b23: zcommit(vc);
+ if (v5 == 0UL) goto b1;
+b13: zchoice(vc);
+ v6 = zpeg_P_peg_rule(vc);
+ if (v6 == 0UL) goto b14;
zcommit(vc);
- goto b19;
-b24: zchoice(vc);
- v6 = zpeg_P_peg_prefix(vc);
- if (v6 == 0UL) goto b28;
- goto b23;
-b28: zfail(vc);
- v7 = zliteral(vc, (u)"%}");
+ goto b13;
+b14: v7 = zliteral(vc, (u)"}");
if (v7 == 0UL) goto b1;
v8 = zpeg_P_sp(vc);
if (v8 == 0UL) goto b1;
- zleave(vc, 90UL);
+ zleave(vc, 93UL);
return 1UL;
b1: zfail(vc);
return 0UL;
-b9: zchoice(vc);
- v4 = zpeg_P_peg_prefix(vc);
- if (v4 == 0UL) goto b13;
- goto b8;
-b13: zfail(vc);
- goto b1;
}
u zpeg_P_peg_identifier(u vc) {
u v1 = 0;
u v2 = 0;
- zenter(vc, 104UL);
+ zenter(vc, 106UL);
v1 = zcharset(vc, (u)"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz");
if (v1 == 0UL) goto b1;
b5: zchoice(vc);
@@ -28834,7 +28877,7 @@ b5: zchoice(vc);
if (v2 == 0UL) goto b6;
zcommit(vc);
goto b5;
-b6: zleave(vc, 104UL);
+b6: zleave(vc, 106UL);
return 1UL;
b1: zfail(vc);
return 0UL;
@@ -28844,31 +28887,42 @@ u zpeg_P_peg_literal(u vc) {
u v2 = 0;
u v3 = 0;
u v4 = 0;
- zenter(vc, 101UL);
- v1 = zcharset(vc, (u)"'");
+ u v5 = 0;
+ u v6 = 0;
+ zenter(vc, 103UL);
+ v1 = zliteral(vc, (u)"\042");
if (v1 == 0UL) goto b1;
b5: zchoice(vc);
zchoice(vc);
- v2 = zcharset(vc, (u)"'");
- if (v2 == 0UL) goto b8;
+ v2 = zcharset(vc, (u)"\134");
+ if (v2 == 0UL) goto b10;
+ v3 = zany(vc);
+ if (v3 == 0UL) goto b10;
+b9: zcommit(vc);
+ zcommit(vc);
+ goto b5;
+b10: zchoice(vc);
+ zchoice(vc);
+ v4 = zliteral(vc, (u)"\042");
+ if (v4 == 0UL) goto b18;
zfail(vc);
zfail(vc);
-b6: v4 = zcharset(vc, (u)"'");
- if (v4 == 0UL) goto b1;
- zleave(vc, 101UL);
+b16: zfail(vc);
+ v6 = zliteral(vc, (u)"\042");
+ if (v6 == 0UL) goto b1;
+ zleave(vc, 103UL);
return 1UL;
b1: zfail(vc);
return 0UL;
-b8: v3 = zany(vc);
- if (v3 == 0UL) goto b6;
- zcommit(vc);
- goto b5;
+b18: v5 = zany(vc);
+ if (v5 == 0UL) goto b16;
+ goto b9;
}
u zpeg_P_peg_lookahead(u vc) {
u v1 = 0;
u v2 = 0;
u v3 = 0;
- zenter(vc, 96UL);
+ zenter(vc, 98UL);
zchoice(vc);
v1 = zpeg_P_peg_lookop(vc);
if (v1 == 0UL) goto b4;
@@ -28877,17 +28931,17 @@ u zpeg_P_peg_lookahead(u vc) {
zcommit(vc);
b4: v3 = zpeg_P_peg_suffix(vc);
if (v3 == 0UL) goto b1;
- zleave(vc, 96UL);
+ zleave(vc, 98UL);
return 1UL;
b1: zfail(vc);
return 0UL;
}
u zpeg_P_peg_lookop(u vc) {
u v1 = 0;
- zenter(vc, 95UL);
+ zenter(vc, 97UL);
v1 = zcharset(vc, (u)"!&");
if (v1 == 0UL) goto b1;
- zleave(vc, 95UL);
+ zleave(vc, 97UL);
return 1UL;
b1: zfail(vc);
return 0UL;
@@ -28898,7 +28952,7 @@ u zpeg_P_peg_pattern(u vc) {
u v3 = 0;
u v4 = 0;
u v5 = 0;
- zenter(vc, 93UL);
+ zenter(vc, 95UL);
v1 = zpeg_P_peg_alternative(vc);
if (v1 == 0UL) goto b1;
b5: zchoice(vc);
@@ -28909,7 +28963,7 @@ b5: zchoice(vc);
if (v3 == 0UL) goto b10;
zfail(vc);
zfail(vc);
-b6: zleave(vc, 93UL);
+b6: zleave(vc, 95UL);
return 1UL;
b10: v4 = zpeg_P_sp(vc);
if (v4 == 0UL) goto b6;
@@ -28920,25 +28974,6 @@ b10: v4 = zpeg_P_sp(vc);
b1: zfail(vc);
return 0UL;
}
-u zpeg_P_peg_prefix(u vc) {
- u v1 = 0;
- u v2 = 0;
- u v3 = 0;
- u v4 = 0;
- zenter(vc, 92UL);
- v1 = zliteral(vc, (u)"%prefix");
- if (v1 == 0UL) goto b1;
- v2 = zpeg_P_sp(vc);
- if (v2 == 0UL) goto b1;
- v3 = zpeg_P_peg_identifier(vc);
- if (v3 == 0UL) goto b1;
- v4 = zpeg_P_sp(vc);
- if (v4 == 0UL) goto b1;
- zleave(vc, 92UL);
- return 1UL;
-b1: zfail(vc);
- return 0UL;
-}
u zpeg_P_peg_primary(u vc) {
u v1 = 0;
u v2 = 0;
@@ -28949,7 +28984,7 @@ u zpeg_P_peg_primary(u vc) {
u v7 = 0;
u v8 = 0;
u v9 = 0;
- zenter(vc, 99UL);
+ zenter(vc, 101UL);
zchoice(vc);
v1 = zliteral(vc, (u)"(");
if (v1 == 0UL) goto b5;
@@ -28962,7 +28997,7 @@ u zpeg_P_peg_primary(u vc) {
b4: zcommit(vc);
v9 = zpeg_P_sp(vc);
if (v9 == 0UL) goto b1;
- zleave(vc, 99UL);
+ zleave(vc, 101UL);
return 1UL;
b1: zfail(vc);
return 0UL;
@@ -28991,18 +29026,24 @@ u zpeg_P_peg_rule(u vc) {
u v3 = 0;
u v4 = 0;
u v5 = 0;
- zenter(vc, 91UL);
+ u v6 = 0;
+ u v7 = 0;
+ zenter(vc, 94UL);
v1 = zpeg_P_peg_identifier(vc);
if (v1 == 0UL) goto b1;
v2 = zpeg_P_sp(vc);
if (v2 == 0UL) goto b1;
- v3 = zliteral(vc, (u)"<-");
+ v3 = zliteral(vc, (u)"=");
if (v3 == 0UL) goto b1;
v4 = zpeg_P_sp(vc);
if (v4 == 0UL) goto b1;
v5 = zpeg_P_peg_pattern(vc);
if (v5 == 0UL) goto b1;
- zleave(vc, 91UL);
+ v6 = zliteral(vc, (u)";");
+ if (v6 == 0UL) goto b1;
+ v7 = zpeg_P_sp(vc);
+ if (v7 == 0UL) goto b1;
+ zleave(vc, 94UL);
return 1UL;
b1: zfail(vc);
return 0UL;
@@ -29011,7 +29052,7 @@ u zpeg_P_peg_suffix(u vc) {
u v1 = 0;
u v2 = 0;
u v3 = 0;
- zenter(vc, 98UL);
+ zenter(vc, 100UL);
v1 = zpeg_P_peg_primary(vc);
if (v1 == 0UL) goto b1;
b5: zchoice(vc);
@@ -29021,7 +29062,7 @@ b5: zchoice(vc);
if (v3 == 0UL) goto b6;
zcommit(vc);
goto b5;
-b6: zleave(vc, 98UL);
+b6: zleave(vc, 100UL);
return 1UL;
b1: zfail(vc);
return 0UL;
@@ -29199,6 +29240,9 @@ u zpeg_P_reserved(u vc) {
u v16 = 0;
u v17 = 0;
u v18 = 0;
+ u v19 = 0;
+ u v20 = 0;
+ u v21 = 0;
zenter(vc, 69UL);
zchoice(vc);
v1 = zpeg_P_return(vc);
@@ -29274,7 +29318,19 @@ b69: zchoice(vc);
v18 = zpeg_P_nil(vc);
if (v18 == 0UL) goto b73;
goto b4;
-b73: zfail(vc);
+b73: zchoice(vc);
+ v19 = zpeg_P_peg(vc);
+ if (v19 == 0UL) goto b77;
+ goto b4;
+b77: zchoice(vc);
+ v20 = zpeg_P_lex(vc);
+ if (v20 == 0UL) goto b81;
+ goto b4;
+b81: zchoice(vc);
+ v21 = zpeg_P_lalr(vc);
+ if (v21 == 0UL) goto b85;
+ goto b4;
+b85: zfail(vc);
zfail(vc);
return 0UL;
}
@@ -29411,7 +29467,7 @@ u zpeg_P_sp(u vc) {
u v2 = 0;
u v3 = 0;
u v4 = 0;
- zenter(vc, 89UL);
+ zenter(vc, 92UL);
b3: zchoice(vc);
zchoice(vc);
v1 = zcharset(vc, (u)"\011\012\015 ");
@@ -29434,7 +29490,7 @@ b19: v4 = zany(vc);
zcommit(vc);
goto b16;
b12: zfail(vc);
- zleave(vc, 89UL);
+ zleave(vc, 92UL);
return 1UL;
}
u zpeg_P_stmt(u vc) {
@@ -29513,7 +29569,7 @@ u zpeg_P_str(u vc) {
u v5 = 0;
u v6 = 0;
zenter(vc, 67UL);
- v1 = zcharset(vc, (u)"\042");
+ v1 = zliteral(vc, (u)"\042");
if (v1 == 0UL) goto b1;
b5: zchoice(vc);
zchoice(vc);
@@ -29526,12 +29582,12 @@ b9: zcommit(vc);
goto b5;
b10: zchoice(vc);
zchoice(vc);
- v4 = zcharset(vc, (u)"\042");
+ v4 = zliteral(vc, (u)"\042");
if (v4 == 0UL) goto b18;
zfail(vc);
zfail(vc);
b16: zfail(vc);
- v6 = zcharset(vc, (u)"\042");
+ v6 = zliteral(vc, (u)"\042");
if (v6 == 0UL) goto b1;
zleave(vc, 67UL);
return 1UL;
@@ -30845,7 +30901,7 @@ b18: if (*(u*)(vpn + 0UL) != 6UL) goto b21;
v26 = ((u(*)())v23)(v24, v25);
vn = v26;
goto b10;
-b21: if (*(u*)(vpn + 0UL) != 90UL) goto b24;
+b21: if (*(u*)(vpn + 0UL) != 93UL) goto b24;
v27 = (u)zpeg_compile;
v28 = *(u*)(vc + 16UL);
v29 = vpn;
@@ -32031,7 +32087,7 @@ u zreconstruct_ident(u vc, u vpn) {
u v10 = 0;
u v11 = 0;
v2 = (u)zassert;
- v3 = (u)(*(u*)(vpn + 0UL) == 88UL);
+ v3 = (u)(*(u*)(vpn + 0UL) == 91UL);
v4 = (u)"ident";
v5 = ((u(*)())v2)(v3, v4);
v5;
@@ -32816,7 +32872,7 @@ u zreconstruct_primary(u vc, u vpn) {
v5 = ((u(*)())v2)(v3, v4);
v5;
vpn = *(u*)(vpn + 16UL);
- if (*(u*)(vpn + 0UL) != 88UL) goto b4;
+ if (*(u*)(vpn + 0UL) != 91UL) goto b4;
v6 = (u)zreconstruct_ident;
v7 = vc;
v8 = vpn;
@@ -33373,7 +33429,7 @@ u zreconstruct_type(u vc, u vpn) {
v6 = ((u(*)())v3)(v4, v5);
v6;
vpn = *(u*)(vpn + 16UL);
- if (*(u*)(vpn + 0UL) != 88UL) goto b4;
+ if (*(u*)(vpn + 0UL) != 91UL) goto b4;
v7 = (u)zreconstruct_ident;
v8 = vc;
v9 = vpn;
@@ -34434,11 +34490,17 @@ u ztranslate(u vc, u vn) {
u v41 = 0;
u v42 = 0;
u v43 = 0;
+ v8 = (u)zsetprefix;
+ v9 = vc;
+ v10 = (u)"P_";
+ v11 = 2UL;
+ v12 = ((u(*)())v8)(v9, v10, v11);
+ v12;
vv = *(u*)(vn + 16UL);
vnum_rules = 0UL;
-b1: if (!vv) goto b7;
- v8 = 0UL;
-b8: if (!v8) goto b5;
+b2: if (!vv) goto b8;
+ v13 = 0UL;
+b9: if (!v13) goto b6;
v14 = (u)zalloc;
v15 = *(u*)(vc + 0UL);
v16 = vnum_rules * 8UL;
@@ -34451,9 +34513,9 @@ b8: if (!v8) goto b5;
vnodes = v21;
vi = 0UL;
vv = *(u*)(vn + 16UL);
-b18: if (!vv) goto b24;
+b15: if (!vv) goto b21;
v22 = 0UL;
-b25: if (!v22) goto b22;
+b22: if (!v22) goto b19;
v33 = (u)ztranslate_tag_to_str;
v34 = vc;
v35 = vtags;
@@ -34468,7 +34530,7 @@ b25: if (!v22) goto b22;
v43 = ((u(*)())v38)(v39, v40, v41, v42);
v43;
return 0UL;
-b22: if (*(u*)(vv + 0UL) != 91UL) goto b28;
+b19: if (*(u*)(vv + 0UL) != 94UL) goto b25;
v23 = (u)zmake_tag;
v24 = vc;
v25 = *(u*)(*(u*)(vv + 16UL) + 24UL);
@@ -34484,26 +34546,18 @@ b22: if (*(u*)(vv + 0UL) != 91UL) goto b28;
*(u*)(vtags + vi * 8UL) = vtag;
*(u*)(vnodes + vi * 8UL) = vv;
vi = vi + 1UL;
-b26: vv = *(u*)(vv + 8UL);
- goto b18;
-b28: goto b26;
-b24: v22 = 1UL;
- goto b25;
-b5: if (*(u*)(vv + 0UL) != 92UL) goto b11;
- v9 = (u)zsetprefix;
- v10 = vc;
- v11 = *(u*)(*(u*)(vv + 16UL) + 24UL);
- v12 = *(u*)(*(u*)(vv + 16UL) + 32UL);
- v13 = ((u(*)())v9)(v10, v11, v12);
- v13;
-b9: if (*(u*)(vv + 0UL) != 91UL) goto b15;
+b23: vv = *(u*)(vv + 8UL);
+ goto b15;
+b25: goto b23;
+b21: v22 = 1UL;
+ goto b22;
+b6: if (*(u*)(vv + 0UL) != 94UL) goto b12;
vnum_rules = vnum_rules + 1UL;
-b13: vv = *(u*)(vv + 8UL);
- goto b1;
-b15: goto b13;
-b11: goto b9;
-b7: v8 = 1UL;
- goto b8;
+b10: vv = *(u*)(vv + 8UL);
+ goto b2;
+b12: goto b10;
+b8: v13 = 1UL;
+ goto b9;
}
u ztranslate_call(u vc, u vic, u vfail, u vn) {
u vprefix = 0;
@@ -34995,10 +35049,10 @@ u ztranslate_literal(u vc, u vic, u vfail, u vn) {
u vt = 0;
u vnext = 0;
u vs = 0;
- u v11 = 0;
- u v12 = 0;
- u v13 = 0;
- u v14 = 0;
+ u vi = 0;
+ u vj = 0;
+ u vlen = 0;
+ u vch = 0;
u v15 = 0;
u v16 = 0;
u v17 = 0;
@@ -35076,108 +35130,123 @@ u ztranslate_literal(u vc, u vic, u vfail, u vn) {
u v89 = 0;
u v90 = 0;
u v91 = 0;
- v11 = (u)zalloc;
- v12 = *(u*)(vc + 0UL);
- v13 = *(u*)(vn + 32UL) - 1UL;
- v14 = ((u(*)())v11)(v12, v13);
- vs = v14;
- v15 = (u)zmemcpy;
- v16 = vs;
- v17 = *(u*)(vn + 24UL) + 1UL * 1UL;
- v18 = *(u*)(vn + 32UL) - 2UL;
- v19 = ((u(*)())v15)(v16, v17, v18);
- v19;
- *(b*)(vs + (*(u*)(vn + 32UL) - 1UL) * 1UL) = 0UL;
- v20 = (u)zmktype0;
- v21 = *(u*)(vc + 16UL);
- v22 = 2UL;
- v23 = ((u(*)())v20)(v21, v22);
- vt = v23;
- v24 = (u)zmkirblock;
- v25 = vic;
- v26 = ((u(*)())v24)(v25);
- vnext = v26;
- v27 = (u)zmkirtmp;
- v28 = vic;
- v29 = vt;
- v30 = ((u(*)())v27)(v28, v29);
- vret = v30;
- v31 = (u)zmkirretval;
+ u v92 = 0;
+ u v93 = 0;
+ u v94 = 0;
+ u v95 = 0;
+ vlen = *(u*)(vn + 32UL) - 1UL;
+ v15 = (u)zalloc;
+ v16 = *(u*)(vc + 0UL);
+ v17 = *(u*)(vn + 32UL) - 1UL;
+ v18 = ((u(*)())v15)(v16, v17);
+ vs = v18;
+ vi = 1UL;
+ vj = 0UL;
+b2: if (vi != vlen) goto b6;
+ *(b*)(vs + vj * 1UL) = 0UL;
+ v24 = (u)zmktype0;
+ v25 = *(u*)(vc + 16UL);
+ v26 = 2UL;
+ v27 = ((u(*)())v24)(v25, v26);
+ vt = v27;
+ v28 = (u)zmkirblock;
+ v29 = vic;
+ v30 = ((u(*)())v28)(v29);
+ vnext = v30;
+ v31 = (u)zmkirtmp;
v32 = vic;
- v33 = vret;
- v34 = vt;
- v35 = ((u(*)())v31)(v32, v33, v34);
- vo = v35;
- v36 = (u)ziraddop;
- v37 = vic;
- v38 = vo;
- v39 = ((u(*)())v36)(v37, v38);
- v39;
- v40 = (u)zmkirvarop;
+ v33 = vt;
+ v34 = ((u(*)())v31)(v32, v33);
+ vret = v34;
+ v35 = (u)zmkirretval;
+ v36 = vic;
+ v37 = vret;
+ v38 = vt;
+ v39 = ((u(*)())v35)(v36, v37, v38);
+ vo = v39;
+ v40 = (u)ziraddop;
v41 = vic;
- v42 = (u)"c";
+ v42 = vo;
v43 = ((u(*)())v40)(v41, v42);
- va = v43;
- v44 = (u)zmkirarg;
+ v43;
+ v44 = (u)zmkirvarop;
v45 = vic;
- v46 = 0UL;
- v47 = va;
- v48 = ((u(*)())v44)(v45, v46, v47);
- vo = v48;
- v49 = (u)ziraddop;
- v50 = vic;
- v51 = vo;
- v52 = ((u(*)())v49)(v50, v51);
- v52;
- v53 = (u)zmkirstr;
+ v46 = (u)"c";
+ v47 = ((u(*)())v44)(v45, v46);
+ va = v47;
+ v48 = (u)zmkirarg;
+ v49 = vic;
+ v50 = 0UL;
+ v51 = va;
+ v52 = ((u(*)())v48)(v49, v50, v51);
+ vo = v52;
+ v53 = (u)ziraddop;
v54 = vic;
- v55 = vs;
- v56 = *(u*)(vn + 32UL) - 2UL;
- v57 = ((u(*)())v53)(v54, v55, v56);
- va = v57;
- v58 = (u)zmkirarg;
- v59 = vic;
- v60 = 1UL;
- v61 = va;
- v62 = ((u(*)())v58)(v59, v60, v61);
- vo = v62;
- v63 = (u)ziraddop;
- v64 = vic;
- v65 = vo;
- v66 = ((u(*)())v63)(v64, v65);
- v66;
- v67 = (u)zmkirfuncref;
+ v55 = vo;
+ v56 = ((u(*)())v53)(v54, v55);
+ v56;
+ v57 = (u)zmkirstr;
+ v58 = vic;
+ v59 = vs;
+ v60 = vj;
+ v61 = ((u(*)())v57)(v58, v59, v60);
+ va = v61;
+ v62 = (u)zmkirarg;
+ v63 = vic;
+ v64 = 1UL;
+ v65 = va;
+ v66 = ((u(*)())v62)(v63, v64, v65);
+ vo = v66;
+ v67 = (u)ziraddop;
v68 = vic;
- v69 = (u)"literal";
+ v69 = vo;
v70 = ((u(*)())v67)(v68, v69);
- va = v70;
- v71 = (u)zircall;
+ v70;
+ v71 = (u)zmkirfuncref;
v72 = vic;
- v73 = va;
- v74 = 2UL;
- v75 = ((u(*)())v71)(v72, v73, v74);
- v75;
+ v73 = (u)"literal";
+ v74 = ((u(*)())v71)(v72, v73);
+ va = v74;
+ v75 = (u)zircall;
+ v76 = vic;
+ v77 = va;
+ v78 = 2UL;
+ v79 = ((u(*)())v75)(v76, v77, v78);
+ v79;
va = vret;
- v76 = (u)zmkirconst;
- v77 = vic;
- v78 = 0UL;
- v79 = ((u(*)())v76)(v77, v78);
- vb = v79;
- v80 = (u)zmkirop;
+ v80 = (u)zmkirconst;
v81 = vic;
- v82 = 22UL;
- v83 = va;
- v84 = vb;
- v85 = ((u(*)())v80)(v81, v82, v83, v84);
- vo = v85;
- v86 = (u)zirbranch;
- v87 = vic;
- v88 = vo;
- v89 = vfail;
- v90 = vnext;
- v91 = ((u(*)())v86)(v87, v88, v89, v90);
- v91;
+ v82 = 0UL;
+ v83 = ((u(*)())v80)(v81, v82);
+ vb = v83;
+ v84 = (u)zmkirop;
+ v85 = vic;
+ v86 = 22UL;
+ v87 = va;
+ v88 = vb;
+ v89 = ((u(*)())v84)(v85, v86, v87, v88);
+ vo = v89;
+ v90 = (u)zirbranch;
+ v91 = vic;
+ v92 = vo;
+ v93 = vfail;
+ v94 = vnext;
+ v95 = ((u(*)())v90)(v91, v92, v93, v94);
+ v95;
return 0UL;
+b6: vch = (u)*(b*)(*(u*)(vn + 24UL) + vi * 1UL);
+ vi = vi + 1UL;
+ if (vch != 92UL) goto b9;
+ v19 = (u)zparse_escape;
+ v20 = *(u*)(vn + 24UL);
+ v21 = (u)&vi;
+ v22 = vlen;
+ v23 = ((u(*)())v19)(v20, v21, v22);
+ vch = v23;
+b7: *(b*)(vs + vj * 1UL) = vch;
+ vj = vj + 1UL;
+ goto b2;
+b9: goto b7;
}
u ztranslate_pattern(u vc, u vic, u vfail, u vn) {
u vcount = 0;
@@ -35714,7 +35783,7 @@ u ztranslate_pattern(u vc, u vic, u vfail, u vn) {
u v535 = 0;
u v536 = 0;
u v537 = 0;
-b2: if (*(u*)(vn + 0UL) != 93UL) goto b6;
+b2: if (*(u*)(vn + 0UL) != 95UL) goto b6;
vd = *(u*)(vn + 16UL);
if (!*(u*)(vd + 8UL)) goto b11;
v14 = 0UL;
@@ -35855,7 +35924,7 @@ b23: v32 = 1UL;
goto b24;
b11: v14 = 1UL;
goto b12;
-b6: if (*(u*)(vn + 0UL) != 94UL) goto b45;
+b6: if (*(u*)(vn + 0UL) != 96UL) goto b45;
vd = *(u*)(vn + 16UL);
v118 = (u)ztranslate_pattern;
v119 = vc;
@@ -35880,13 +35949,13 @@ b51: v125 = (u)ztranslate_pattern;
goto b47;
b53: v124 = 1UL;
goto b54;
-b45: if (*(u*)(vn + 0UL) != 96UL) goto b57;
+b45: if (*(u*)(vn + 0UL) != 98UL) goto b57;
v131 = (u)zdecode_look;
v132 = vn;
v133 = ((u(*)())v131)(v132);
vlook = v133;
vd = *(u*)(vn + 16UL);
- if (*(u*)(vd + 0UL) != 95UL) goto b61;
+ if (*(u*)(vd + 0UL) != 97UL) goto b61;
vd = *(u*)(vd + 8UL);
b59: if (vlook != 2UL) goto b64;
v134 = (u)zmkirblock;
@@ -36113,7 +36182,7 @@ b106: v308 = (u)zdie;
v310;
goto b62;
b61: goto b59;
-b57: if (*(u*)(vn + 0UL) != 98UL) goto b110;
+b57: if (*(u*)(vn + 0UL) != 100UL) goto b110;
v311 = (u)zdecode_count;
v312 = vn;
v313 = ((u(*)())v311)(v312);
@@ -36297,7 +36366,7 @@ b149: v450 = (u)zdie;
v452 = ((u(*)())v450)(v451);
v452;
goto b112;
-b110: if (*(u*)(vn + 0UL) != 99UL) goto b153;
+b110: if (*(u*)(vn + 0UL) != 101UL) goto b153;
v453 = (u)ztranslate_pattern;
v454 = vc;
v455 = vic;
@@ -36306,7 +36375,7 @@ b110: if (*(u*)(vn + 0UL) != 99UL) goto b153;
v458 = ((u(*)())v453)(v454, v455, v456, v457);
v458;
goto b4;
-b153: if (*(u*)(vn + 0UL) != 100UL) goto b156;
+b153: if (*(u*)(vn + 0UL) != 102UL) goto b156;
v459 = (u)zmkirblock;
v460 = vic;
v461 = ((u(*)())v459)(v460);
@@ -36380,7 +36449,7 @@ b153: if (*(u*)(vn + 0UL) != 100UL) goto b156;
v516 = ((u(*)())v511)(v512, v513, v514, v515);
v516;
goto b4;
-b156: if (*(u*)(vn + 0UL) != 101UL) goto b171;
+b156: if (*(u*)(vn + 0UL) != 103UL) goto b171;
v517 = (u)ztranslate_literal;
v518 = vc;
v519 = vic;
@@ -36389,7 +36458,7 @@ b156: if (*(u*)(vn + 0UL) != 101UL) goto b171;
v522 = ((u(*)())v517)(v518, v519, v520, v521);
v522;
goto b4;
-b171: if (*(u*)(vn + 0UL) != 102UL) goto b174;
+b171: if (*(u*)(vn + 0UL) != 104UL) goto b174;
v523 = (u)ztranslate_charset;
v524 = vc;
v525 = vic;
@@ -36398,7 +36467,7 @@ b171: if (*(u*)(vn + 0UL) != 102UL) goto b174;
v528 = ((u(*)())v523)(v524, v525, v526, v527);
v528;
goto b4;
-b174: if (*(u*)(vn + 0UL) != 103UL) goto b177;
+b174: if (*(u*)(vn + 0UL) != 105UL) goto b177;
v529 = (u)ztranslate_call;
v530 = vc;
v531 = vic;
@@ -36407,7 +36476,7 @@ b174: if (*(u*)(vn + 0UL) != 103UL) goto b177;
v534 = ((u(*)())v529)(v530, v531, v532, v533);
v534;
goto b4;
-b177: if (*(u*)(vn + 0UL) != 89UL) goto b180;
+b177: if (*(u*)(vn + 0UL) != 92UL) goto b180;
vn = *(u*)(vn + 8UL);
goto b2;
b180: v535 = (u)zdie;
diff --git a/cc3.om b/cc3.om
@@ -1,155 +1,153 @@
-%{
+peg_grammar {
+ grammar = sp (enum_decl / struct_decl / union_decl / func_decl / peg_grammar)* !.;
-%prefix P_
+ enum_item = ident sp ("=" sp expr)?;
+ enum_decl = enum sp "{" sp (enum_item ("," sp enum_item)*)? ("," sp)? "}" sp;
-grammar <- sp (enum_decl / struct_decl / union_decl / func_decl / peg_grammar)* !.
+ member_decl = ident sp ":" sp type ";" sp;
+ struct_decl = struct sp ident sp "{" sp member_decl* "}" sp;
+ union_decl = union sp ident sp "{" sp member_decl* "}" sp;
-enum_item <- ident sp ('=' sp expr)?
-enum_decl <- enum sp '{' sp (enum_item (',' sp enum_item)*)? (',' sp)? '}' sp
+ func_decl = "func" sp ident sp func_type (";" sp / compound_stmt);
-member_decl <- ident sp ':' sp type ';' sp
-struct_decl <- struct sp ident sp '{' sp member_decl* '}' sp
-union_decl <- union sp ident sp '{' sp member_decl* '}' sp
+ type = ident sp / byte sp / int sp / void sp
+ / func sp func_type / ptr_type / "(" sp type ")" sp;
-func_decl <- 'func' sp ident sp func_type (';' sp / compound_stmt)
+ ptr_type = "*" sp type;
-type <- ident sp / byte sp / int sp / void sp
- / func sp func_type / ptr_type / '(' sp type ')' sp
+ gen_decl = ident sp ":" sp "type" sp;
+ arg_decl = ident sp ":" sp type;
+ func_type = "(" sp ( arg_decl ("," sp arg_decl)* )? ( "," sp )? ")" sp
+ (":" sp type)?;
-ptr_type <- '*' sp type
+ stmt = if_stmt / loop_stmt / break_stmt / continue_stmt
+ / return_stmt / var_stmt / label_stmt / goto_stmt
+ / assign_stmt / expr_stmt / empty_stmt / compound_stmt;
-gen_decl <- ident sp ':' sp 'type' sp
-arg_decl <- ident sp ':' sp type
-func_type <- '(' sp ( arg_decl (',' sp arg_decl)* )? ( ',' sp )? ')' sp
- (':' sp type)?
+ elif_stmt = else sp if sp expr compound_stmt;
+ else_stmt = else sp compound_stmt;
+ if_stmt = if sp expr compound_stmt elif_stmt* else_stmt?;
-stmt <- if_stmt / loop_stmt / break_stmt / continue_stmt
- / return_stmt / var_stmt / label_stmt / goto_stmt
- / assign_stmt / expr_stmt / empty_stmt / compound_stmt
+ loop_stmt = loop sp compound_stmt sp;
-elif_stmt <- else sp if sp expr compound_stmt
-else_stmt <- else sp compound_stmt
-if_stmt <- if sp expr compound_stmt elif_stmt* else_stmt?
+ break_stmt = break sp ";" sp;
-loop_stmt <- loop sp compound_stmt sp
+ continue_stmt = continue sp ";" sp;
-break_stmt <- break sp ';' sp
+ return_stmt = return sp expr? sp ";" sp;
-continue_stmt <- continue sp ';' sp
+ var_stmt = var sp ident sp ":" sp type ";" sp;
-return_stmt <- return sp expr? sp ';' sp
+ label_stmt = ident sp ":" sp;
-var_stmt <- var sp ident sp ':' sp type ';' sp
+ goto_stmt = goto sp ident sp ";" sp;
-label_stmt <- ident sp ':' sp
+ assign_stmt = unary_expr "=" sp expr ";" sp;
-goto_stmt <- goto sp ident sp ';' sp
-
-assign_stmt <- unary_expr '=' sp expr ';' sp
-
-expr_stmt <- expr ';' sp
-
-empty_stmt <- ';' sp
-
-compound_stmt <- '{' sp stmt* '}' sp
-
-expr <- bool_expr
-
-band_op <- '&&'
-bor_op <- '||'
-bool_expr <- comp_expr ((band_op / bor_op) sp comp_expr)*
-
-le_op <- '<='
-ge_op <- '>='
-lt_op <- '<' !'=' !'<'
-gt_op <- '>' !'=' !'>'
-eq_op <- '=='
-ne_op <- '!='
-comp_expr <- add_expr ((le_op / ge_op / lt_op / gt_op / eq_op / ne_op) sp add_expr)?
-
-add_op <- '+'
-sub_op <- '-'
-or_op <- '|' !'|'
-xor_op <- '^'
-add_expr <- mul_expr ((add_op / sub_op / or_op / xor_op) sp mul_expr)*
-
-mul_op <- '*'
-div_op <- '/' !'/'
-mod_op <- '%'
-and_op <- '&' !'&'
-mul_expr <- shift_expr ((mul_op / div_op / mod_op / and_op) sp shift_expr)*
-
-lsh_op <- '<<'
-rsh_op <- '>>'
-shift_expr <- unary_expr ((lsh_op / rsh_op) sp unary_expr)*
-
-ref_op <- '&' !'&'
-deref_op <- '*'
-pos_op <- '+'
-neg_op <- '-'
-not_op <- '~'
-bnot_op <- '!' !'='
-unary_expr <- ((ref_op / deref_op / pos_op / neg_op / not_op / bnot_op) sp)* post_expr
-
-index_expr <- '[' sp expr ']' sp
-call_expr <- '(' sp ( expr (',' sp expr)* )? (',' sp)? ')' sp
-member_expr <- '.' sp ident sp
-cast_expr <- 'as' sp type
-post_expr <- primary (index_expr / call_expr / member_expr / cast_expr)*
-
-primary <- ident sp / hex sp / dec sp / str sp / char sp
- / sizeof_expr / nil sp / '(' sp expr ')' sp
-
-sizeof_expr <- sizeof sp '(' sp expr ')' sp
-
-hex <- '0x'[0-9a-fA-F_]+
-dec <- !'_' [0-9_]+
-str <- ["] ([\\] . / !["] .)* ["]
-char <- ['] ([\\] . / !['] .)+ [']
-
-reserved <- return / break / sizeof / if / else / loop / continue / goto
- / var / enum / struct / union / byte / int / void / func / as / nil
-
-return <- 'return' ![a-zA-Z0-9_]
-break <- 'break' ![a-zA-Z0-9_]
-sizeof <- 'sizeof' ![a-zA-Z0-9_]
-if <- 'if' ![a-zA-Z0-9_]
-else <- 'else' ![a-zA-Z0-9_]
-loop <- 'loop' ![a-zA-Z0-9_]
-continue <- 'continue' ![a-zA-Z0-9_]
-goto <- 'goto' ![a-zA-Z0-9_]
-var <- 'var' ![a-zA-Z0-9_]
-enum <- 'enum' ![a-zA-Z0-9_]
-struct <- 'struct' ![a-zA-Z0-9_]
-union <- 'union' ![a-zA-Z0-9_]
-byte <- 'byte' ![a-zA-Z0-9_]
-int <- 'int' ![a-zA-Z0-9_]
-void <- 'void' ![a-zA-Z0-9_]
-func <- 'func' ![a-zA-Z0-9_]
-as <- 'as' ![a-zA-Z0-9_]
-nil <- 'nil' ![a-zA-Z0-9_]
-
-ident <- !reserved [a-zA-Z_][a-zA-Z0-9_]*
-
-sp <- ( [ \r\n\t] / '//' (![\r\n] .)* )*
-
-// NOTE: This makes the language context sensitive by use of [ and ' <-
-// But, we can fix this by tweaking the peg grammar.
-
-peg_grammar <- '%{' sp (peg_rule / peg_prefix)+ '%}' sp
-peg_rule <- peg_identifier sp '<-' sp peg_pattern
-peg_prefix <- '%prefix' sp peg_identifier sp
-peg_pattern <- peg_alternative ( '/' !'/' sp peg_alternative )*
-peg_alternative <- peg_lookahead+
-peg_lookop <- [!&]
-peg_lookahead <- (peg_lookop sp)? peg_suffix
-peg_countop <- [*+?]
-peg_suffix <- peg_primary (peg_countop sp)*
-peg_primary <- ( '(' sp peg_pattern ')' / peg_any / peg_literal / peg_class / peg_call ) sp
-peg_any <- '.'
-peg_literal <- ['] ( !['] . )* [']
-peg_class <- '[' ( !']' ( . '-' . / . ) )* ']'
-peg_call <- peg_identifier !(sp '<-')
-peg_identifier <- [a-zA-Z0-9_]+
-
-%}
+ expr_stmt = expr ";" sp;
+
+ empty_stmt = ";" sp;
+
+ compound_stmt = "{" sp stmt* "}" sp;
+
+ expr = bool_expr;
+
+ band_op = "&&";
+ bor_op = "||";
+ bool_expr = comp_expr ((band_op / bor_op) sp comp_expr)*;
+
+ le_op = "<=";
+ ge_op = ">=";
+ lt_op = "<" !"=" !"<";
+ gt_op = ">" !"=" !">";
+ eq_op = "==";
+ ne_op = "!=";
+ comp_expr = add_expr ((le_op / ge_op / lt_op / gt_op / eq_op / ne_op) sp add_expr)?;
+
+ add_op = "+";
+ sub_op = "-";
+ or_op = "|" !"|";
+ xor_op = "^";
+ add_expr = mul_expr ((add_op / sub_op / or_op / xor_op) sp mul_expr)*;
+
+ mul_op = "*";
+ div_op = "/" !"/";
+ mod_op = "%";
+ and_op = "&" !"&";
+ mul_expr = shift_expr ((mul_op / div_op / mod_op / and_op) sp shift_expr)*;
+
+ lsh_op = "<<";
+ rsh_op = ">>";
+ shift_expr = unary_expr ((lsh_op / rsh_op) sp unary_expr)*;
+
+ ref_op = "&" !"&";
+ deref_op = "*";
+ pos_op = "+";
+ neg_op = "-";
+ not_op = "~";
+ bnot_op = "!" !"=";
+ unary_expr = ((ref_op / deref_op / pos_op / neg_op / not_op / bnot_op) sp)* post_expr;
+
+ index_expr = "[" sp expr "]" sp;
+ call_expr = "(" sp ( expr ("," sp expr)* )? ("," sp)? ")" sp;
+ member_expr = "." sp ident sp;
+ cast_expr = "as" sp type;
+ post_expr = primary (index_expr / call_expr / member_expr / cast_expr)*;
+
+ primary = ident sp / hex sp / dec sp / str sp / char sp
+ / sizeof_expr / nil sp / "(" sp expr ")" sp;
+
+ sizeof_expr = sizeof sp "(" sp expr ")" sp;
+
+ hex = "0x" [0-9a-fA-F_]+;
+ dec = !"_" [0-9_]+;
+ str = "\"" ([\\] . / !"\"" .)* "\"";
+ char = "'" ([\\] . / !"'" .)+ "'";
+
+ reserved = return / break / sizeof / if / else / loop / continue / goto
+ / var / enum / struct / union / byte / int / void / func / as / nil
+ / peg / lex / lalr;
+
+ return = "return" ![a-zA-Z0-9_];
+ break = "break" ![a-zA-Z0-9_];
+ sizeof = "sizeof" ![a-zA-Z0-9_];
+ if = "if" ![a-zA-Z0-9_];
+ else = "else" ![a-zA-Z0-9_];
+ loop = "loop" ![a-zA-Z0-9_];
+ continue = "continue" ![a-zA-Z0-9_];
+ goto = "goto" ![a-zA-Z0-9_];
+ var = "var" ![a-zA-Z0-9_];
+ enum = "enum" ![a-zA-Z0-9_];
+ struct = "struct" ![a-zA-Z0-9_];
+ union = "union" ![a-zA-Z0-9_];
+ byte = "byte" ![a-zA-Z0-9_];
+ int = "int" ![a-zA-Z0-9_];
+ void = "void" ![a-zA-Z0-9_];
+ func = "func" ![a-zA-Z0-9_];
+ as = "as" ![a-zA-Z0-9_];
+ nil = "nil" ![a-zA-Z0-9_];
+ peg = "peg_grammar" ![a-zA-Z0-9_];
+ lex = "lexer" ![a-zA-Z0-9_];
+ lalr = "lalr_grammar" ![a-zA-Z0-9_];
+
+ ident = !reserved [a-zA-Z_][a-zA-Z0-9_]*;
+
+ sp = ( [ \r\n\t] / "//" (![\r\n] .)* )*;
+
+ // NOTE: This makes the language context sensitive by use of [
+
+ peg_grammar = "peg_grammar" sp "{" sp peg_rule+ "}" sp;
+ peg_rule = peg_identifier sp "=" sp peg_pattern ";" sp;
+ peg_pattern = peg_alternative ( "/" !"/" sp peg_alternative )*;
+ peg_alternative = peg_lookahead+;
+ peg_lookop = [!&];
+ peg_lookahead = (peg_lookop sp)? peg_suffix;
+ peg_countop = [*+?];
+ peg_suffix = peg_primary (peg_countop sp)*;
+ peg_primary = ( "(" sp peg_pattern ")" / peg_any / peg_literal / peg_class / peg_call ) sp;
+ peg_any = ".";
+ peg_literal = "\"" ([\\] . / !"\"" .)* "\"";
+ peg_class = "[" ( !"]" ( . "-" . / . ) )* "]";
+ peg_call = peg_identifier !(sp "=");
+ peg_identifier = [a-zA-Z0-9_]+;
+}
diff --git a/peg.om b/peg.om
@@ -81,10 +81,32 @@ func translate_literal(c: *peg_compiler, ic: *irfunc, fail: *irblock, n: *peg_no
var t: *type;
var next: *irblock;
var s: *byte;
+ var i: int;
+ var j: int;
+ var len: int;
+ var ch: int;
+ len = n.len - 1;
s = alloc(c.a, n.len - 1);
- memcpy(s, &n.str[1], n.len - 2);
- s[n.len - 1] = 0 as byte;
+ i = 1;
+ j = 0;
+ loop {
+ if i == len {
+ break;
+ }
+
+ ch = n.str[i] as int;
+ i = i + 1;
+
+ if ch == '\\' {
+ ch = parse_escape(n.str, &i, len);
+ }
+
+ s[j] = ch as byte;
+
+ j = j + 1;
+ }
+ s[j] = 0 as byte;
t = mktype0(c.cc, TY_INT);
@@ -97,7 +119,7 @@ func translate_literal(c: *peg_compiler, ic: *irfunc, fail: *irblock, n: *peg_no
a = mkirvarop(ic, "c");
o = mkirarg(ic, 0, a);
iraddop(ic, o);
- a = mkirstr(ic, s, n.len - 2);
+ a = mkirstr(ic, s, j);
o = mkirarg(ic, 1, a);
iraddop(ic, o);
a = mkirfuncref(ic, "literal");
@@ -775,6 +797,8 @@ func translate(c: *peg_compiler, n: *peg_node) {
var nodes: **peg_node;
var tag: *byte;
+ setprefix(c, "P_", 2);
+
// Find the prefix
v = n.child;
num_rules = 0;
@@ -783,10 +807,6 @@ func translate(c: *peg_compiler, n: *peg_node) {
break;
}
- if v.tag == P_peg_prefix {
- setprefix(c, v.child.str, v.child.len);
- }
-
if v.tag == P_peg_rule {
num_rules = num_rules + 1;
}