os

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

commit faa784e971aba23ab59bf3aba9e860fc4a7fbd54
parent 3a5cc4da6dc41a5513e48792a63dafc26dfa654b
Author: erai <erai@omiltem.net>
Date:   Sat, 12 Apr 2025 10:25:19 -0400

translate lalr peg to productions

Diffstat:
Mcc0.c | 798+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlalr.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 }