os

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

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:
Mcc0.c | 565++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mcc3.om | 274+++++++++++++++++++++++++++++++++++++++----------------------------------------
Mpeg.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; }