commit faa784e971aba23ab59bf3aba9e860fc4a7fbd54
parent 3a5cc4da6dc41a5513e48792a63dafc26dfa654b
Author: erai <erai@omiltem.net>
Date: Sat, 12 Apr 2025 10:25:19 -0400
translate lalr peg to productions
Diffstat:
M | cc0.c | | | 798 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
M | lalr.om | | | 362 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- |
2 files changed, 1159 insertions(+), 1 deletion(-)
diff --git a/cc0.c b/cc0.c
@@ -146,7 +146,18 @@ u zirreset();
u zirreturn();
u ziruseop();
u zlabels_to_ir();
+u zlalr_alt();
+u zlalr_alt_nonterminal();
+u zlalr_alt_terminal();
u zlalr_compiler();
+u zlalr_items();
+u zlalr_lookup();
+u zlalr_mkalt();
+u zlalr_mkprod();
+u zlalr_pattern();
+u zlalr_primary();
+u zlalr_rules();
+u zlalr_suffix();
u zlayout_struct();
u zlayout_union();
u zleave();
@@ -190,6 +201,7 @@ u zmklabel();
u zmknode();
u zmknode0();
u zmknode1();
+u zmkstr();
u zmktype();
u zmktype0();
u zmktype1();
@@ -26183,8 +26195,769 @@ b34: goto b7;
b5: v4 = 1UL;
goto b6;
}
+u zlalr_alt(u vlc, u va, u vpn) {
+ u v3 = 0;
+ u v4 = 0;
+ u v5 = 0;
+ u v6 = 0;
+ u v7 = 0;
+ u v8 = 0;
+ vpn = *(u*)(vpn + 16UL);
+b1: if (!vpn) goto b7;
+ v3 = 0UL;
+b8: if (!v3) goto b5;
+ return 0UL;
+b5: v4 = (u)zlalr_suffix;
+ v5 = vlc;
+ v6 = va;
+ v7 = vpn;
+ v8 = ((u(*)())v4)(v5, v6, v7);
+ v8;
+ vpn = *(u*)(vpn + 8UL);
+ goto b1;
+b7: v3 = 1UL;
+ goto b8;
+}
+u zlalr_alt_nonterminal(u vlc, u va, u vs) {
+ u vi = 0;
+ u v4 = 0;
+ u v5 = 0;
+ u v6 = 0;
+ u v7 = 0;
+ u v8 = 0;
+ u v9 = 0;
+ u v10 = 0;
+ v4 = (u)zensure_arr;
+ v5 = *(u*)(vlc + 0UL);
+ v6 = va + 0UL;
+ v7 = va + 16UL;
+ v8 = *(u*)(va + 8UL) + 1UL;
+ v9 = 24UL;
+ v10 = ((u(*)())v4)(v5, v6, v7, v8, v9);
+ v10;
+ vi = *(u*)(va + 8UL);
+ *(u*)(va + 8UL) = *(u*)(va + 8UL) + 1UL;
+ *(u*)(*(u*)(va + 0UL) + vi * 24UL + 0UL) = 1UL;
+ *(u*)(*(u*)(va + 0UL) + vi * 24UL + 8UL) = *(u*)(vs + 32UL);
+ *(u*)(*(u*)(va + 0UL) + vi * 24UL + 16UL) = *(u*)(vs + 40UL);
+ return 0UL;
+}
+u zlalr_alt_terminal(u vlc, u va, u vname, u vid) {
+ u vi = 0;
+ u v5 = 0;
+ u v6 = 0;
+ u v7 = 0;
+ u v8 = 0;
+ u v9 = 0;
+ u v10 = 0;
+ u v11 = 0;
+ v5 = (u)zensure_arr;
+ v6 = *(u*)(vlc + 0UL);
+ v7 = va + 0UL;
+ v8 = va + 16UL;
+ v9 = *(u*)(va + 8UL) + 1UL;
+ v10 = 24UL;
+ v11 = ((u(*)())v5)(v6, v7, v8, v9, v10);
+ v11;
+ vi = *(u*)(va + 8UL);
+ *(u*)(va + 8UL) = *(u*)(va + 8UL) + 1UL;
+ *(u*)(*(u*)(va + 0UL) + vi * 24UL + 0UL) = 1UL;
+ *(u*)(*(u*)(va + 0UL) + vi * 24UL + 8UL) = vid;
+ *(u*)(*(u*)(va + 0UL) + vi * 24UL + 16UL) = vname;
+ return 0UL;
+}
u zlalr_compiler(u vc, u vpn, u verr) {
+ u v_lc[7] = {0};
+ u vlc = 0;
+ u v5 = 0;
+ u v6 = 0;
+ u v7 = 0;
+ u v8 = 0;
+ u v9 = 0;
+ u v10 = 0;
+ u v11 = 0;
+ vlc = (u)v_lc;
+ *(u*)(vlc + 0UL) = *(u*)(vc + 0UL);
+ *(u*)(vlc + 8UL) = vc;
+ *(u*)(vlc + 16UL) = verr;
+ v5 = (u)zlalr_rules;
+ v6 = vlc;
+ v7 = vpn;
+ v8 = ((u(*)())v5)(v6, v7);
+ v8;
+ v9 = (u)zlalr_items;
+ v10 = vlc;
+ v11 = ((u(*)())v9)(v10);
+ v11;
+ return 0UL;
+}
+u zlalr_items(u vlc) {
+ return 0UL;
+}
+u zlalr_lookup(u vlc, u vname, u vnew) {
+ u vp = 0;
+ u vlink = 0;
+ u vd = 0;
+ u vdir = 0;
+ u v7 = 0;
+ u v8 = 0;
+ u v9 = 0;
+ u v10 = 0;
+ u v11 = 0;
+ u v12 = 0;
+ u v13 = 0;
+ u v14 = 0;
+ u v15 = 0;
+ u v16 = 0;
+ u v17 = 0;
+ u v18 = 0;
+ u v19 = 0;
+ u v20 = 0;
+ u v21 = 0;
+ vp = 0UL;
+ vlink = vlc + 24UL;
+b1: vd = *(u*)vlink;
+ if (!vd) goto b7;
+ v7 = 0UL;
+b8: if (!v7) goto b5;
+b2: if (!vnew) goto b19;
+ v12 = 0UL;
+b20: if (!v12) goto b17;
+ return vd;
+b17: if (!vd) goto b23;
+ v13 = (u)zdie;
+ v14 = (u)"duplicate rule";
+ v15 = ((u(*)())v13)(v14);
+ v15;
+b21: *(u*)(vnew + 40UL) = vname;
+ v16 = (u)zrb_link;
+ v17 = vlc + 24UL;
+ v18 = vlink;
+ v19 = vp;
+ v20 = vnew + 0UL;
+ v21 = ((u(*)())v16)(v17, v18, v19, v20);
+ v21;
+ return vnew;
+b23: goto b21;
+b19: v12 = 1UL;
+ goto b20;
+b5: v8 = (u)zstrcmp;
+ v9 = *(u*)(vd + 40UL);
+ v10 = vname;
+ v11 = ((u(*)())v8)(v9, v10);
+ vdir = v11;
+ if (vdir != 0UL) goto b12;
+ goto b2;
+b12: if ((s)vdir >= (s)0UL) goto b14;
+ vlink = vd + 0UL + 16UL;
+ vp = vd + 0UL;
+b10: goto b1;
+b14: vlink = vd + 0UL + 24UL;
+ vp = vd + 0UL;
+ goto b10;
+b7: v7 = 1UL;
+ goto b8;
+}
+u zlalr_mkalt(u vlc, u vp) {
+ u va = 0;
+ u v3 = 0;
+ u v4 = 0;
+ u v5 = 0;
+ u v6 = 0;
+ u v7 = 0;
+ u v8 = 0;
+ u v9 = 0;
+ u v10 = 0;
+ u v11 = 0;
+ u v12 = 0;
+ u v13 = 0;
+ v3 = (u)zalloc;
+ v4 = *(u*)(vlc + 0UL);
+ v5 = 24UL;
+ v6 = ((u(*)())v3)(v4, v5);
+ va = v6;
+ v7 = (u)zensure_arr;
+ v8 = *(u*)(vlc + 0UL);
+ v9 = vp + 48UL;
+ v10 = vp + 64UL;
+ v11 = *(u*)(vp + 56UL) + 1UL;
+ v12 = 8UL;
+ v13 = ((u(*)())v7)(v8, v9, v10, v11, v12);
+ v13;
+ *(u*)(*(u*)(vp + 48UL) + *(u*)(vp + 56UL) * 8UL) = va;
+ *(u*)(vp + 56UL) = *(u*)(vp + 56UL) + 1UL;
+ return va;
+}
+u zlalr_mkprod(u vlc) {
+ u vp = 0;
+ u v2 = 0;
+ u v3 = 0;
+ u v4 = 0;
+ u v5 = 0;
+ u v6 = 0;
+ u v7 = 0;
+ u v8 = 0;
+ u v9 = 0;
+ u v10 = 0;
+ u v11 = 0;
+ u v12 = 0;
+ v2 = (u)zensure_arr;
+ v3 = *(u*)(vlc + 0UL);
+ v4 = vlc + 32UL;
+ v5 = vlc + 48UL;
+ v6 = *(u*)(vlc + 40UL) + 1UL;
+ v7 = 8UL;
+ v8 = ((u(*)())v2)(v3, v4, v5, v6, v7);
+ v8;
+ v9 = (u)zalloc;
+ v10 = *(u*)(vlc + 0UL);
+ v11 = 72UL;
+ v12 = ((u(*)())v9)(v10, v11);
+ vp = v12;
+ *(u*)(vp + 32UL) = *(u*)(vlc + 40UL);
+ *(u*)(*(u*)(vlc + 32UL) + *(u*)(vlc + 40UL) * 8UL) = vp;
+ *(u*)(vlc + 40UL) = *(u*)(vlc + 40UL) + 1UL;
+ return vp;
+}
+u zlalr_pattern(u vlc, u vp, u vpn) {
+ u va = 0;
+ u v4 = 0;
+ u v5 = 0;
+ u v6 = 0;
+ u v7 = 0;
+ u v8 = 0;
+ u v9 = 0;
+ u v10 = 0;
+ u v11 = 0;
+ u v12 = 0;
+ u v13 = 0;
+ vpn = *(u*)(vpn + 16UL);
+b1: if (!vpn) goto b7;
+ v4 = 0UL;
+b8: if (!v4) goto b5;
return 0UL;
+b5: v5 = (u)zlalr_mkalt;
+ v6 = vlc;
+ v7 = vp;
+ v8 = ((u(*)())v5)(v6, v7);
+ va = v8;
+ v9 = (u)zlalr_alt;
+ v10 = vlc;
+ v11 = va;
+ v12 = vpn;
+ v13 = ((u(*)())v9)(v10, v11, v12);
+ v13;
+ vpn = *(u*)(vpn + 8UL);
+ goto b1;
+b7: v4 = 1UL;
+ goto b8;
+}
+u zlalr_primary(u vlc, u va, u vpn) {
+ u vv = 0;
+ u vs = 0;
+ u vname = 0;
+ u v6 = 0;
+ u v7 = 0;
+ u v8 = 0;
+ u v9 = 0;
+ u v10 = 0;
+ u v11 = 0;
+ u v12 = 0;
+ u v13 = 0;
+ u v14 = 0;
+ u v15 = 0;
+ u v16 = 0;
+ u v17 = 0;
+ u v18 = 0;
+ u v19 = 0;
+ u v20 = 0;
+ u v21 = 0;
+ u v22 = 0;
+ u v23 = 0;
+ u v24 = 0;
+ u v25 = 0;
+ u v26 = 0;
+ u v27 = 0;
+ u v28 = 0;
+ u v29 = 0;
+ u v30 = 0;
+ u v31 = 0;
+ u v32 = 0;
+ u v33 = 0;
+ u v34 = 0;
+ u v35 = 0;
+ u v36 = 0;
+ u v37 = 0;
+ u v38 = 0;
+ u v39 = 0;
+ u v40 = 0;
+ u v41 = 0;
+ u v42 = 0;
+ u v43 = 0;
+ u v44 = 0;
+ u v45 = 0;
+ u v46 = 0;
+ u v47 = 0;
+ u v48 = 0;
+ u v49 = 0;
+ u v50 = 0;
+ u v51 = 0;
+ u v52 = 0;
+ u v53 = 0;
+ u v54 = 0;
+ u v55 = 0;
+ u v56 = 0;
+ u v57 = 0;
+ u v58 = 0;
+ u v59 = 0;
+ u v60 = 0;
+ u v61 = 0;
+ u v62 = 0;
+ u v63 = 0;
+ vpn = *(u*)(vpn + 16UL);
+ if (*(u*)(vpn + 0UL) != 91UL) goto b3;
+ v6 = (u)zmkstr;
+ v7 = *(u*)(vlc + 0UL);
+ v8 = *(u*)(vpn + 24UL);
+ v9 = *(u*)(vpn + 32UL);
+ v10 = ((u(*)())v6)(v7, v8, v9);
+ vname = v10;
+ v11 = (u)zlalr_lookup;
+ v12 = vlc;
+ v13 = vname;
+ v14 = 0UL;
+ v15 = ((u(*)())v11)(v12, v13, v14);
+ vs = v15;
+ if (!vs) goto b8;
+ v16 = (u)zlalr_alt_nonterminal;
+ v17 = vlc;
+ v18 = va;
+ v19 = vs;
+ v20 = ((u(*)())v16)(v17, v18, v19);
+ v20;
+ return 0UL;
+b8: v21 = (u)zfind;
+ v22 = *(u*)(vlc + 8UL);
+ v23 = vname;
+ v24 = 0UL;
+ v25 = 0UL;
+ v26 = ((u(*)())v21)(v22, v23, v24, v25);
+ vv = v26;
+ if (!vv) goto b19;
+ v28 = 0UL;
+b20: if (!v28) goto b15;
+ v27 = 1UL;
+b17: if (!v27) goto b13;
+ v30 = (u)zfputs;
+ v31 = *(u*)(vlc + 16UL);
+ v32 = (u)"name: ";
+ v33 = ((u(*)())v30)(v31, v32);
+ v33;
+ v34 = (u)zfputs;
+ v35 = *(u*)(vlc + 16UL);
+ v36 = vname;
+ v37 = ((u(*)())v34)(v35, v36);
+ v37;
+ v38 = (u)zfputs;
+ v39 = *(u*)(vlc + 16UL);
+ v40 = (u)"\012";
+ v41 = ((u(*)())v38)(v39, v40);
+ v41;
+ v42 = (u)zdie;
+ v43 = (u)"undefined terminal";
+ v44 = ((u(*)())v42)(v43);
+ v44;
+b11: v45 = (u)zlalr_alt_terminal;
+ v46 = vlc;
+ v47 = va;
+ v48 = vname;
+ v49 = *(u*)(vv + 184UL);
+ v50 = ((u(*)())v45)(v46, v47, v48, v49);
+ v50;
+ return 0UL;
+b13: goto b11;
+b15: if (!*(u*)(vv + 176UL)) goto b23;
+ v29 = 0UL;
+b24: if (!v29) goto b21;
+ v27 = 1UL;
+ goto b17;
+b21: v27 = 0UL;
+ goto b17;
+b23: v29 = 1UL;
+ goto b24;
+b19: v28 = 1UL;
+ goto b20;
+b3: v51 = (u)zlalr_mkprod;
+ v52 = vlc;
+ v53 = ((u(*)())v51)(v52);
+ vs = v53;
+ v54 = (u)zlalr_pattern;
+ v55 = vlc;
+ v56 = vs;
+ v57 = vpn;
+ v58 = ((u(*)())v54)(v55, v56, v57);
+ v58;
+ v59 = (u)zlalr_alt_nonterminal;
+ v60 = vlc;
+ v61 = va;
+ v62 = vs;
+ v63 = ((u(*)())v59)(v60, v61, v62);
+ v63;
+ return 0UL;
+}
+u zlalr_rules(u vlc, u vpn) {
+ u vrule = 0;
+ u vroot = 0;
+ u vp = 0;
+ u va = 0;
+ u vname = 0;
+ u vi = 0;
+ u v8 = 0;
+ u v9 = 0;
+ u v10 = 0;
+ u v11 = 0;
+ u v12 = 0;
+ u v13 = 0;
+ u v14 = 0;
+ u v15 = 0;
+ u v16 = 0;
+ u v17 = 0;
+ u v18 = 0;
+ u v19 = 0;
+ u v20 = 0;
+ u v21 = 0;
+ u v22 = 0;
+ u v23 = 0;
+ u v24 = 0;
+ u v25 = 0;
+ u v26 = 0;
+ u v27 = 0;
+ u v28 = 0;
+ u v29 = 0;
+ u v30 = 0;
+ u v31 = 0;
+ u v32 = 0;
+ u v33 = 0;
+ u v34 = 0;
+ u v35 = 0;
+ u v36 = 0;
+ u v37 = 0;
+ u v38 = 0;
+ u v39 = 0;
+ v8 = (u)zlalr_mkprod;
+ v9 = vlc;
+ v10 = ((u(*)())v8)(v9);
+ vroot = v10;
+ vrule = *(u*)(vpn + 16UL);
+b2: if (!vrule) goto b8;
+ v11 = 0UL;
+b9: if (!v11) goto b6;
+ vi = 1UL;
+ vrule = *(u*)(vpn + 16UL);
+b13: if (!vrule) goto b19;
+ v25 = 0UL;
+b20: if (!v25) goto b17;
+ v31 = (u)zlalr_mkalt;
+ v32 = vlc;
+ v33 = vroot;
+ v34 = ((u(*)())v31)(v32, v33);
+ va = v34;
+ v35 = (u)zlalr_alt_nonterminal;
+ v36 = vlc;
+ v37 = va;
+ v38 = *(u*)(*(u*)(vlc + 32UL) + 1UL * 8UL);
+ v39 = ((u(*)())v35)(v36, v37, v38);
+ v39;
+ return 0UL;
+b17: vp = *(u*)(*(u*)(vlc + 32UL) + vi * 8UL);
+ v26 = (u)zlalr_pattern;
+ v27 = vlc;
+ v28 = vp;
+ v29 = *(u*)(*(u*)(vrule + 16UL) + 8UL);
+ v30 = ((u(*)())v26)(v27, v28, v29);
+ v30;
+ vrule = *(u*)(vrule + 8UL);
+ vi = vi + 1UL;
+ goto b13;
+b19: v25 = 1UL;
+ goto b20;
+b6: v12 = (u)zlalr_mkprod;
+ v13 = vlc;
+ v14 = ((u(*)())v12)(v13);
+ vp = v14;
+ v15 = (u)zmkstr;
+ v16 = *(u*)(vlc + 0UL);
+ v17 = *(u*)(*(u*)(vrule + 16UL) + 24UL);
+ v18 = *(u*)(*(u*)(vrule + 16UL) + 32UL);
+ v19 = ((u(*)())v15)(v16, v17, v18);
+ vname = v19;
+ v20 = (u)zlalr_lookup;
+ v21 = vlc;
+ v22 = vname;
+ v23 = vp;
+ v24 = ((u(*)())v20)(v21, v22, v23);
+ v24;
+ vrule = *(u*)(vrule + 8UL);
+ goto b2;
+b8: v11 = 1UL;
+ goto b9;
+}
+u zlalr_suffix(u vlc, u va, u vpn) {
+ u vzero = 0;
+ u vmore = 0;
+ u vch = 0;
+ u vs = 0;
+ u vt = 0;
+ u vone = 0;
+ u v9 = 0;
+ u v10 = 0;
+ u v11 = 0;
+ u v12 = 0;
+ u v13 = 0;
+ u v14 = 0;
+ u v15 = 0;
+ u v16 = 0;
+ u v17 = 0;
+ u v18 = 0;
+ u v19 = 0;
+ u v20 = 0;
+ u v21 = 0;
+ u v22 = 0;
+ u v23 = 0;
+ u v24 = 0;
+ u v25 = 0;
+ u v26 = 0;
+ u v27 = 0;
+ u v28 = 0;
+ u v29 = 0;
+ u v30 = 0;
+ u v31 = 0;
+ u v32 = 0;
+ u v33 = 0;
+ u v34 = 0;
+ u v35 = 0;
+ u v36 = 0;
+ u v37 = 0;
+ u v38 = 0;
+ u v39 = 0;
+ u v40 = 0;
+ u v41 = 0;
+ u v42 = 0;
+ u v43 = 0;
+ u v44 = 0;
+ u v45 = 0;
+ u v46 = 0;
+ u v47 = 0;
+ u v48 = 0;
+ u v49 = 0;
+ u v50 = 0;
+ u v51 = 0;
+ u v52 = 0;
+ u v53 = 0;
+ u v54 = 0;
+ u v55 = 0;
+ u v56 = 0;
+ u v57 = 0;
+ u v58 = 0;
+ u v59 = 0;
+ u v60 = 0;
+ u v61 = 0;
+ u v62 = 0;
+ u v63 = 0;
+ u v64 = 0;
+ u v65 = 0;
+ u v66 = 0;
+ u v67 = 0;
+ u v68 = 0;
+ u v69 = 0;
+ u v70 = 0;
+ u v71 = 0;
+ u v72 = 0;
+ u v73 = 0;
+ u v74 = 0;
+ u v75 = 0;
+ u v76 = 0;
+ u v77 = 0;
+ u v78 = 0;
+ u v79 = 0;
+ u v80 = 0;
+ u v81 = 0;
+ u v82 = 0;
+ u v83 = 0;
+ u v84 = 0;
+ u v85 = 0;
+ u v86 = 0;
+ u v87 = 0;
+ u v88 = 0;
+ u v89 = 0;
+ u v90 = 0;
+ u v91 = 0;
+ u v92 = 0;
+ u v93 = 0;
+ u v94 = 0;
+ u v95 = 0;
+ u v96 = 0;
+ u v97 = 0;
+ u v98 = 0;
+ u v99 = 0;
+ u v100 = 0;
+ u v101 = 0;
+ u v102 = 0;
+ u v103 = 0;
+ u v104 = 0;
+ u v105 = 0;
+ vpn = *(u*)(vpn + 16UL);
+ vone = vpn;
+ vzero = 0UL;
+ vmore = 0UL;
+ vpn = *(u*)(vpn + 8UL);
+b1: if (!vpn) goto b7;
+ v9 = 0UL;
+b8: if (!v9) goto b5;
+ if (!vzero) goto b20;
+ if (!vmore) goto b20;
+ v10 = 1UL;
+b22: if (!v10) goto b18;
+ v11 = (u)zlalr_mkprod;
+ v12 = vlc;
+ v13 = ((u(*)())v11)(v12);
+ vs = v13;
+ v14 = (u)zlalr_alt_nonterminal;
+ v15 = vlc;
+ v16 = va;
+ v17 = vs;
+ v18 = ((u(*)())v14)(v15, v16, v17);
+ v18;
+ v19 = (u)zlalr_mkalt;
+ v20 = vlc;
+ v21 = vs;
+ v22 = ((u(*)())v19)(v20, v21);
+ va = v22;
+ v23 = (u)zlalr_primary;
+ v24 = vlc;
+ v25 = va;
+ v26 = vone;
+ v27 = ((u(*)())v23)(v24, v25, v26);
+ v27;
+ v28 = (u)zlalr_alt_nonterminal;
+ v29 = vlc;
+ v30 = va;
+ v31 = vs;
+ v32 = ((u(*)())v28)(v29, v30, v31);
+ v32;
+ v33 = (u)zlalr_mkalt;
+ v34 = vlc;
+ v35 = vs;
+ v36 = ((u(*)())v33)(v34, v35);
+ va = v36;
+b16: return 0UL;
+b18: if (!vzero) goto b30;
+ v37 = (u)zlalr_mkprod;
+ v38 = vlc;
+ v39 = ((u(*)())v37)(v38);
+ vs = v39;
+ v40 = (u)zlalr_alt_nonterminal;
+ v41 = vlc;
+ v42 = va;
+ v43 = vs;
+ v44 = ((u(*)())v40)(v41, v42, v43);
+ v44;
+ v45 = (u)zlalr_mkalt;
+ v46 = vlc;
+ v47 = vs;
+ v48 = ((u(*)())v45)(v46, v47);
+ va = v48;
+ v49 = (u)zlalr_primary;
+ v50 = vlc;
+ v51 = va;
+ v52 = vone;
+ v53 = ((u(*)())v49)(v50, v51, v52);
+ v53;
+ v54 = (u)zlalr_mkalt;
+ v55 = vlc;
+ v56 = vs;
+ v57 = ((u(*)())v54)(v55, v56);
+ va = v57;
+ goto b16;
+b30: if (!vmore) goto b37;
+ v58 = (u)zlalr_mkprod;
+ v59 = vlc;
+ v60 = ((u(*)())v58)(v59);
+ vs = v60;
+ v61 = (u)zlalr_alt_nonterminal;
+ v62 = vlc;
+ v63 = va;
+ v64 = vs;
+ v65 = ((u(*)())v61)(v62, v63, v64);
+ v65;
+ v66 = (u)zlalr_mkprod;
+ v67 = vlc;
+ v68 = ((u(*)())v66)(v67);
+ vt = v68;
+ v69 = (u)zlalr_mkalt;
+ v70 = vlc;
+ v71 = vt;
+ v72 = ((u(*)())v69)(v70, v71);
+ va = v72;
+ v73 = (u)zlalr_primary;
+ v74 = vlc;
+ v75 = va;
+ v76 = vone;
+ v77 = ((u(*)())v73)(v74, v75, v76);
+ v77;
+ v78 = (u)zlalr_mkalt;
+ v79 = vlc;
+ v80 = vs;
+ v81 = ((u(*)())v78)(v79, v80);
+ va = v81;
+ v82 = (u)zlalr_alt_nonterminal;
+ v83 = vlc;
+ v84 = va;
+ v85 = vt;
+ v86 = ((u(*)())v82)(v83, v84, v85);
+ v86;
+ v87 = (u)zlalr_alt_nonterminal;
+ v88 = vlc;
+ v89 = va;
+ v90 = vs;
+ v91 = ((u(*)())v87)(v88, v89, v90);
+ v91;
+ v92 = (u)zlalr_mkalt;
+ v93 = vlc;
+ v94 = vs;
+ v95 = ((u(*)())v92)(v93, v94);
+ va = v95;
+ v96 = (u)zlalr_alt_nonterminal;
+ v97 = vlc;
+ v98 = va;
+ v99 = vt;
+ v100 = ((u(*)())v96)(v97, v98, v99);
+ v100;
+ goto b16;
+b37: v101 = (u)zlalr_primary;
+ v102 = vlc;
+ v103 = va;
+ v104 = vone;
+ v105 = ((u(*)())v101)(v102, v103, v104);
+ v105;
+ goto b16;
+b20: v10 = 0UL;
+ goto b22;
+b5: vch = (u)*(b*)(*(u*)(vpn + 24UL) + 0UL * 1UL);
+ if (vch != 42UL) goto b11;
+ vzero = 1UL;
+ vmore = 1UL;
+b9: vpn = *(u*)(vpn + 8UL);
+ goto b1;
+b11: if (vch != 43UL) goto b13;
+ vmore = 1UL;
+ goto b9;
+b13: if (vch != 63UL) goto b15;
+ vzero = 1UL;
+ goto b9;
+b15: goto b9;
+b7: v9 = 1UL;
+ goto b8;
}
u zlayout_struct(u vc, u vd) {
u vm = 0;
@@ -28715,6 +29488,31 @@ u zmknode1(u vc, u vkind, u va) {
v8 = ((u(*)())v3)(v4, v5, v6, v7);
return v8;
}
+u zmkstr(u va, u vs, u vn) {
+ u vr = 0;
+ u v4 = 0;
+ u v5 = 0;
+ u v6 = 0;
+ u v7 = 0;
+ u v8 = 0;
+ u v9 = 0;
+ u v10 = 0;
+ u v11 = 0;
+ u v12 = 0;
+ v4 = (u)zalloc;
+ v5 = va;
+ v6 = vn + 1UL;
+ v7 = ((u(*)())v4)(v5, v6);
+ vr = v7;
+ v8 = (u)zmemcpy;
+ v9 = vr;
+ v10 = vs;
+ v11 = vn;
+ v12 = ((u(*)())v8)(v9, v10, v11);
+ v12;
+ *(b*)(vr + vn * 1UL) = 0UL;
+ return vr;
+}
u zmktype(u vc, u vkind, u va, u vb, u vst) {
u vt = 0;
u v6 = 0;
diff --git a/lalr.om b/lalr.om
@@ -1,3 +1,363 @@
+// The dragon book is a good reference.
+// Aho, A.V., Sethi, R. and Ullman, J.D. (2007) Compilers: Principles, techniques, and Tools. Reading, Mass: Addison-Wesley.
+
+struct lalr_item {
+ prod: int;
+ alt: int;
+ point: int;
+}
+
+struct lalr_point {
+ term: int;
+ id: int;
+ name: *byte;
+}
+
+struct lalr_alt {
+ point: *lalr_point;
+ point_len: int;
+ point_cap: int;
+}
+
+struct lalr_prod {
+ node: rbnode;
+ id: int;
+ name: *byte;
+
+ alt: **lalr_alt;
+ alt_len: int;
+ alt_cap: int;
+}
+
+struct lalr_compiler {
+ a: *alloc;
+ c: *compiler;
+ err: *file;
+
+ prod_name: *rbnode;
+ prod: **lalr_prod;
+ prod_len: int;
+ prod_cap: int;
+}
+
func lalr_compiler(c: *compiler, pn: *peg_node, err: *file) {
- //die("lalr");
+ var _lc: lalr_compiler;
+ var lc: *lalr_compiler;
+ lc = &_lc;
+ lc.a = c.a;
+ lc.c = c;
+ lc.err = err;
+ lalr_rules(lc, pn);
+ lalr_items(lc);
+}
+
+func lalr_mkprod(lc: *lalr_compiler): *lalr_prod {
+ var p: *lalr_prod;
+ ensure_arr(lc.a, (&lc.prod) as **void, &lc.prod_cap, lc.prod_len + 1, sizeof(*lc.prod));
+ p = alloc(lc.a, sizeof(*p)) as *lalr_prod;
+ p.id = lc.prod_len;
+ lc.prod[lc.prod_len] = p;
+ lc.prod_len = lc.prod_len + 1;
+ return p;
+}
+
+func lalr_lookup(lc: *lalr_compiler, name: *byte, new: *lalr_prod): *lalr_prod {
+ var p: *rbnode;
+ var link: **rbnode;
+ var d: *lalr_prod;
+ var dir: int;
+
+ p = nil;
+ link = &lc.prod_name;
+ loop {
+ d = (*link) as *lalr_prod;
+ if !d {
+ break;
+ }
+
+ dir = strcmp(d.name, name);
+ if dir == 0 {
+ break;
+ } else if dir < 0 {
+ link = &d.node.left;
+ p = &d.node;
+ } else {
+ link = &d.node.right;
+ p = &d.node;
+ }
+ }
+
+ if !new {
+ return d;
+ }
+
+ if d {
+ die("duplicate rule");
+ }
+
+ new.name = name;
+ rb_link(&lc.prod_name, link, p, &new.node);
+ return new;
+}
+
+func lalr_rules(lc: *lalr_compiler, pn: *peg_node) {
+ var rule: *peg_node;
+ var root: *lalr_prod;
+ var p: *lalr_prod;
+ var a: *lalr_alt;
+ var name: *byte;
+ var i: int;
+
+ root = lalr_mkprod(lc);
+
+ rule = pn.child;
+ loop {
+ if !rule {
+ break;
+ }
+ p = lalr_mkprod(lc);
+ name = mkstr(lc.a, rule.child.str, rule.child.len);
+ lalr_lookup(lc, name, p);
+ rule = rule.next;
+ }
+
+ i = 1;
+ rule = pn.child;
+ loop {
+ if !rule {
+ break;
+ }
+ p = lc.prod[i];
+ lalr_pattern(lc, p, rule.child.next);
+ rule = rule.next;
+ i = i + 1;
+ }
+
+ a = lalr_mkalt(lc, root);
+ lalr_alt_nonterminal(lc, a, lc.prod[1]);
+}
+
+func lalr_pattern(lc: *lalr_compiler, p: *lalr_prod, pn: *peg_node) {
+ var a: *lalr_alt;
+ pn = pn.child;
+ loop {
+ if !pn {
+ break;
+ }
+ a = lalr_mkalt(lc, p);
+ lalr_alt(lc, a, pn);
+ pn = pn.next;
+ }
+}
+
+func lalr_alt(lc: *lalr_compiler, a: *lalr_alt, pn: *peg_node) {
+ pn = pn.child;
+ loop {
+ if !pn {
+ break;
+ }
+ lalr_suffix(lc, a, pn);
+ pn = pn.next;
+ }
+}
+
+func lalr_suffix(lc: *lalr_compiler, a: *lalr_alt, pn: *peg_node) {
+ var zero: int;
+ var more: int;
+ var ch: int;
+ var s: *lalr_prod;
+ var t: *lalr_prod;
+ var one: *peg_node;
+
+ pn = pn.child;
+ one = pn;
+
+ zero = 0;
+ more = 0;
+
+ pn = pn.next;
+ loop {
+ if !pn {
+ break;
+ }
+
+ ch = pn.str[0] as int;
+ if ch == '*' {
+ zero = 1;
+ more = 1;
+ } else if ch == '+' {
+ more = 1;
+ } else if ch == '?' {
+ zero = 1;
+ }
+
+ pn = pn.next;
+ }
+
+ if zero && more {
+ // s -> one s |
+ s = lalr_mkprod(lc);
+ lalr_alt_nonterminal(lc, a, s);
+ a = lalr_mkalt(lc, s);
+ lalr_primary(lc, a, one);
+ lalr_alt_nonterminal(lc, a, s);
+ a = lalr_mkalt(lc, s);
+ } else if zero {
+ // s -> one |
+ s = lalr_mkprod(lc);
+ lalr_alt_nonterminal(lc, a, s);
+ a = lalr_mkalt(lc, s);
+ lalr_primary(lc, a, one);
+ a = lalr_mkalt(lc, s);
+ } else if more {
+ // s -> one s | one
+ s = lalr_mkprod(lc);
+ lalr_alt_nonterminal(lc, a, s);
+ t = lalr_mkprod(lc);
+ a = lalr_mkalt(lc, t);
+ lalr_primary(lc, a, one);
+ a = lalr_mkalt(lc, s);
+ lalr_alt_nonterminal(lc, a, t);
+ lalr_alt_nonterminal(lc, a, s);
+ a = lalr_mkalt(lc, s);
+ lalr_alt_nonterminal(lc, a, t);
+ } else {
+ lalr_primary(lc, a, one);
+ }
+}
+
+func lalr_primary(lc: *lalr_compiler, a: *lalr_alt, pn: *peg_node) {
+ var v: *decl;
+ var s: *lalr_prod;
+ var name: *byte;
+
+ pn = pn.child;
+
+ if pn.tag == P_ident {
+ name = mkstr(lc.a, pn.str, pn.len);
+ s = lalr_lookup(lc, name, nil);
+ if s {
+ lalr_alt_nonterminal(lc, a, s);
+ return;
+ }
+
+ v = find(lc.c, name, nil, 0);
+ if !v || !v.enum_defined {
+ fputs(lc.err, "name: ");
+ fputs(lc.err, name);
+ fputs(lc.err, "\n");
+ die("undefined terminal");
+ }
+
+ lalr_alt_terminal(lc, a, name, v.enum_value);
+ return;
+ }
+
+ s = lalr_mkprod(lc);
+ lalr_pattern(lc, s, pn);
+ lalr_alt_nonterminal(lc, a, s);
+}
+
+func lalr_mkalt(lc: *lalr_compiler, p: *lalr_prod): *lalr_alt {
+ var a: *lalr_alt;
+ a = alloc(lc.a, sizeof(*a)) as *lalr_alt;
+ ensure_arr(lc.a, (&p.alt) as **void, &p.alt_cap, p.alt_len + 1, sizeof(*p.alt));
+ p.alt[p.alt_len] = a;
+ p.alt_len = p.alt_len + 1;
+ return a;
+}
+
+func lalr_alt_terminal(lc: *lalr_compiler, a: *lalr_alt, name: *byte, id: int) {
+ var i: int;
+ ensure_arr(lc.a, (&a.point) as **void, &a.point_cap, a.point_len + 1, sizeof(*a.point));
+ i = a.point_len;
+ a.point_len = a.point_len + 1;
+ a.point[i].term = 1;
+ a.point[i].id = id;
+ a.point[i].name = name;
+}
+
+func lalr_alt_nonterminal(lc: *lalr_compiler, a: *lalr_alt, s: *lalr_prod) {
+ var i: int;
+ ensure_arr(lc.a, (&a.point) as **void, &a.point_cap, a.point_len + 1, sizeof(*a.point));
+ i = a.point_len;
+ a.point_len = a.point_len + 1;
+ a.point[i].term = 1;
+ a.point[i].id = s.id;
+ a.point[i].name = s.name;
+}
+
+func lalr_show(lc: *lalr_compiler) {
+ var i: int;
+ var j: int;
+ var k: int;
+ var p: *lalr_prod;
+ var a: *lalr_alt;
+ var t: *lalr_point;
+ var out: *file;
+
+ i = 0;
+ loop {
+ if i == lc.prod_len {
+ break;
+ }
+
+ p = lc.prod[i];
+
+ j = 0;
+ loop {
+ if j == p.alt_len {
+ break;
+ }
+
+ a = p.alt[j];
+
+ if p.name {
+ fputs(out, p.name);
+ } else {
+ fputd(out, i);
+ }
+
+ fputs(out, " -> ");
+
+ k = 0;
+ loop {
+ if k == a.point_len {
+ break;
+ }
+
+ t = &a.point[k];
+ if t.name {
+ fputs(out, t.name);
+ } else {
+ fputd(out, t.id);
+ }
+ fputs(out, " ");
+
+ k = k + 1;
+ }
+
+ fputs(out, "\n");
+
+ j = j + 1;
+ }
+
+ i = i + 1;
+ }
+}
+
+func lalr_items(lc: *lalr_compiler) {
+ // CLOSURE(I)
+ // J = I
+ // for each [A->a.Bb] in J
+ // for each production B->z
+ // add [B->.z] to J
+ // GOTO(I, X)
+ // CLOSURE({[A->aX.b] such that [A->a.Xb] in I})
+ // ITEMS(G)
+ // C = CLOSURE({[S'->.S]})
+ // for each I in C
+ // for each symbol x
+ // if GOTO(I,x) is not empty
+ // add GOTO(I,x) to C
}