diff options
| author | Marshall Lochbaum <mwlochbaum@gmail.com> | 2020-09-05 22:17:48 -0400 |
|---|---|---|
| committer | Marshall Lochbaum <mwlochbaum@gmail.com> | 2020-09-05 22:17:48 -0400 |
| commit | 6bb849d6cfc00791acb72017ac0e7f7dea7bdc08 (patch) | |
| tree | a61dcbc94a73a2842e492e46dc3b89211808ca70 /c.bqn | |
| parent | f8e364460bd05dbd3e6db9d36166ef2b16745b66 (diff) | |
Align self-hosted compiler with dzaima/BQN one, except for UTF-16 hacks
Diffstat (limited to 'c.bqn')
| -rwxr-xr-x | c.bqn | 99 |
1 files changed, 64 insertions, 35 deletions
@@ -10,7 +10,7 @@ charSet←∾charGroups←⟨ "(){}⟨⟩" # Bracket "‿" # Ligature "·" # nOthing - ¯1⊏˘10‿2⥊"𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕗𝕘" # Input (𝕣 pending; ℝ not allowed) + ¯1⊏˘∘‿2⥊"𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕗𝕘" # Input (𝕣 pending; ℝ not allowed) "@" # nUll character '0'+↕10 # Digit "¯.π∞" # Numeric @@ -19,13 +19,20 @@ charSet←∾charGroups←⟨ " "∾@+9 # Whitespace # #'" eliminated during tokenization ⟩ +ErrUnknownChars←{ + "Unclosed quote"!¬∨´⟨''','"'⟩∊𝕩 + ⟨"Unknown character","s"/˜1<≠𝕩,": ",𝕩⟩∾⊸!0 +} +CharCode←charSet{ + Chk ← ⊢⊣ErrUnknownChars∘(≠/⊣)⍟≢⟜(⊏⟜𝕗) + g←⍋𝕗 ⋄ ⊢ Chk g⊏˜1-˜1⌈(g⊏𝕗)⍋⊢ +} bF‿bM‿bC‿bS‿bG‿bB‿bL‿bO‿bI‿bU‿bD‿bN‿bA‿bP‿bW←≍¨˜⟜(+`≠↑0∾⊢)≠¨charGroups bA_e←4+⊑bA M←1⊸⊑(0⊸≤∧>)-⟜⊑ vi←+´≠¨9↑charGroups charRole←((vi-1⊑bI)↑/0∾≠¨3↑charGroups)∾(5/⌽↕2)∾0 -special←<˘6‿2⥊"𝕤𝕩𝕨𝕣𝕗𝕘" -spd←⥊⍉3‿0↓⌜↑⟜special⌜3‿5‿6 +spc←⥊3‿5‿6-⌜3‿0 Tokenize←{ r←𝕩='#'⋄s←/(≠↑2⊸↓)⊸∧𝕩='''⋄d←/dm←𝕩='"' @@ -39,23 +46,23 @@ Tokenize←{ lu←⍷lit←𝕩⊔˜1-˜(+`qe-˜ToI⊑˘cb)×≠`ToI cb cl←f/ToI⊑∘⌽˘cb - c←charSet⊐f/𝕩 + c←cl-˜CharCode(⊑charSet)¨⌾(cl⊸/)f/𝕩 w←(≠↑0∾⊢)⊸<l←c M (⊑bD)≍+´1⊑¨bD‿bN‿bA u←c=⊑bU⋄l+↩u⋄w+↩u - i←(1-˜l×+`w)⊔c - na←≠•a⋄us←¯1++´bA - in←na(⊢-⊣×+⟜(⊑bA)⊸≤)us⊸≠⊸/¨i - id←⍷(bA M˜w/c)⍒⊸⊏in⋄nv←+´bA M˜⊑¨id + us←c=¯1++´bA + id←(1-˜(us<l)×+`w)⊔na(⊢-⊣×+⟜(⊑bA)⊸≤)c + ti←na⌊∘÷˜(⊑bA)-˜w/c + iu←(≠↑¯1∾⌈`)⊸<is←⊐id⋄ni←≠in←0>iu/ti + ti↩(us/˜(1↓0∾˜⊢)⊸<l)(⊢+∧⟜(2⊸=))0⌈ti - c↩(w∨¬l∨c M (⊑bP)≍+´1⊑¨bP‿bW)/(vi+id⊐in)⌾(w⊸/)(vi+(≠id)+lu⊐lit)⌾(cl⊸/)c + c↩(w∨¬l∨c M (⊑bP)≍+´1⊑¨bP‿bW)/(vi+is⊏⍋⍋in)⌾(w⊸/)(vi+ni+lu⊐lit)⌾(cl⊸/)c c/˜↩¬(≠↑1∾(c∊2‿4+⊑bB)∨⊢)⊸∧c M bS⋄c/˜↩¬(1↓1∾˜c∊3‿5+⊑bB)∧c M bS - ti←(us=¯1⊸⊑¨i)(⊢+∧⟜(2⊸=))0⌈na⌊∘÷˜(⊑bA)-˜⊑¨i - t←ti⌾(((0⊸≤∧<⟜(≠id))c-vi)⊸/)(vi⌊c)⊏charRole + ic←(0⊸≤∧<⟜ni)c-vi⋄t←ti⌾(ic⊸/)(vi⌊c)⊏charRole c+↩5×c M 5≍˜⊑bI - ⟨c,t,nv,(nv↓id)∾lu⟩ + ⟨c,t,+´¬in,((in//iu)⊏id)∾lu⟩ } -Parse←{ +WParse←{ a←𝕩M(2≍˜⊑bG)⋄at←1⌽a⋄𝕩/˜↩¬a⋄a/˜↩¬at l←≠𝕩⋄sep←𝕩M bS⋄𝕩↩(bF⊑⊸+⊑chF⊐<'⊣')¨⌾(sep⊸/)𝕩⋄sep∨↩𝕩=2+⊑bB o←𝕩=⊑bB⋄c←𝕩=1+⊑bB⋄v←a-˜𝕩≥vi⋄f←¬o∨c∨v∨sep @@ -69,11 +76,11 @@ Parse←{ Base←{+⟜(𝕨⊸×)´𝕩} Enc2←{2|⌊∘÷⟜2⍟(↕𝕨)𝕩} -Hex←16 Base⟜⌽ (•d∾"ABCDEF")⊸⊐ +Hex←16 Base⟜⌽ (∾"0A"+⟜↕¨10‿6)⊸⊐ ReadNum←{ n‿d‿p‿i←4↕⊸+⊑bN # ¯.π∞ - Nat←10 Base⟜⌽ -⟜(⊑bD) + Nat←+⟜(10⊸×)´∘⌽ -⟜(⊑bD) Int←(n=⊑)◶⟨Nat,-·Nat 1⊸↓⟩ Dec←⊐⟜(<d)⊸(Nat∘↑ + ·(0<≠)◶⟨0,Nat÷10⋆≠⟩+⟜1⊸↓) Pos←(⊑p‿i⊐⊏)◶⟨π,∞,Dec⟩ @@ -81,7 +88,7 @@ ReadNum←{ m←(n=⊑)◶⟨Pos,-·Pos 1⊸↓⟩e↑𝕩 𝕩×⟜(10⋆·Int(e+1)↓⊣)˜⍟(e<≠𝕩)m } -LitVal←(⊑((⊑bU)∾"'""")⊐⊏)◶⟨@,1⊸⊑,1⊸↓,ReadNum⟩ +LitVal←(⊑⟨⊑bU,''','"'⟩⊐⊏)◶⟨@,1⊸⊑,1⊸↓,ReadNum⟩ GenF64←{ 0:8⥊0; l←2(⌊⋆⁼)𝕩 @@ -109,7 +116,7 @@ GenFn←{ t⊏˜↩⍋+`-˝(2‿3+⊑bB)=⌜t nd←+´c←t=3+⊑bB t↩((vi+nVar+≠lits)+↕∘≠)⌾(c⊸/)t - ⟨a,na⟩←Parse t + ⟨a,na⟩←WParse t ops←⥊∾⟨ ∾⟜(0⥊˜3∾˜vi-≠)fntab ⍉(Hex¨"20"‿"22"‿"21")∾⌜↕nVar @@ -136,7 +143,7 @@ Gen←{ rcp←1 GenFn "1÷x" or ←2 GenFn "(w+x)-w∧x" -Compile←{ +WCompile←{ body←GenFn 𝕩 f←⟨rcp,or,body⟩ Gen ⟨(≠¨f)/(1‿2‿0∾¨1)⥊¨¨f64 ⋄ 2 ⋄ ∾f⟩ @@ -148,12 +155,23 @@ Compile←{ LEBv ← { b←128 l←⌊b⋆⁼1⌈𝕩 - o←⍋⍋⊒/1+l + o←⍋⍋((↕¯1⊑⊢)-/⟜(≠↑0∾⊢))⟜(+`)1+l o⊏l{f←×𝕨⋄(𝕨-1)(b⊸(×⟜f+|)∾𝕊⟜(⌊÷⟜b)○(f⊸/))⍟(∨´f)𝕩}𝕩 } -DParse ← {nv‿r𝕊𝕩: - g←⍋+`p←𝕩(Mׯ1⋆2|-⟜⊑)bB⋄br←p×𝕩M 2≍˜2+⊑bB +ErrMismatchedBrackets←{ + Lcs ← ¯1 ⊑ 0˘∘⊢ {𝕩⌈⌈`𝕨+0∾˜1↓𝕩}˝ =⌜ + _mis_ ← {"Missing "∾𝕗∾" "∾charSet⊏˜𝕘+⊢/˜≠∘⊣=⊒} + Msg ← >○≠◶⟨"opening"_mis_ 0, "closing"_mis_ 1˜⟩ + 0 !˜ 𝕨 (Lcs<⌊○≠)◶⟨Msg,"Malformed bracket nesting"⟩ 𝕩 +} +ErrUndeclared←{ + 0 !˜ "Undefined identifier"∾(1<≠𝕩)/"s" +} +Parse ← {nv‿r←𝕨 + g←⍋pd←+`p←𝕩(Mׯ1⋆2|-⟜⊑)bB⋄br←p×𝕩M 2≍˜2+⊑bB + p(=⟜1⊸/ErrMismatchedBrackets⍟≢1-˜=⟜¯1⊸/)○(g⊸⊏)𝕩 + "Swapped open and closed brackets" ! 0≤(⊑g)⊑pd sl←1⊸⌽⊸∨𝕩 M bL⋄sr←¯1⊸⌽⌾(g⊸⊏)sl⋄sa←sl∨sr g⊏˜↩⍋g⊏sl⋄r×↩¬sa⋄o←p>0 pt←sa<𝕩=1+⊑bB @@ -166,6 +184,7 @@ DParse ← {nv‿r𝕊𝕩: FC←-⟜(≠↑0∾⊢)(c∾1)/·+`∾⟜0 H←0<1↓FC∘= ft←(0∾1⊸H+2×2⊸H⌈2×3⊸H)(0‿3‿4‿5+5+⊑bI)⍋𝕩 + fsc←ft⊏spc r↩((1↓ft)⊏(1+2⊸≤)⊸/↕4)⌾((b⊏rev)⊸⊏)r r+↩pt(⊣∧¬⊸∨=○(⌈`(1+↕∘≠)⊸×)⊢)(¯1⊸⌽⌾(g⊸⊏)3=r)∨1≤r @@ -190,10 +209,13 @@ DParse ← {nv‿r𝕊𝕩: dr←/s>o+`⊸⊏0∾lo⋄rt←/𝕩=2+⊑bB d←id⊏dec←idm∧ad∧asn⋄lc←FC dec - ig←⍋(⊏⟜(¯1∾c/gf)∾d⊸/⊏((≠𝕩)∾b⊏gf)˜)id⊏fi - ig↩<⟜(≠id)⊸/(⍋+`∘⊏⟜(d∾-/˜d))⊸⊏(⍋⊏⟜(∾⟜(d⊸/)idx))⊸⊏ig - ui←d(⌈`↕∘≠⊸×)⊸⊏⌾(ig⊸⊏)id - ii←(ui⊏(fi⊏ft⊏≠¨spd)-(⌈`c⊸×)⊸¬+`dec)∾((sp⊏fi)⊏3×2|ft)++⟜(0⊸≤)2+sp⊏xv + ixf←(⊏⟜(¯1∾c/gf)∾d⊸/⊏((≠𝕩)∾b⊏gf)˜)id⊏fi + ig←(⍋⊏⟜(ixx←∾⟜(d⊸/)idx))⊸⊏⍋ixf + "Multiple definitions" ! 1∧´ixx∨○((≠↑0∾⊢)⊸≠((≠id)⊸≤⊸/ig)⊏⊢)ixf + ig↩<⟜(≠id)⊸/(⍋+`∘⊏⟜(d∾-/˜d))⊸⊏ig + d⊏˜↩ig⋄ErrUndeclared∘/˜⍟(0∨´⊢)⟜(d<(≠↑0∾⊢)⊸≠)ig⊏idx + ui←(⌈`↕∘≠⊸×d)⊸⊏⌾(ig⊸⊏)id + ii←(ui⊏(fi⊏fsc)-(⌈`c⊸×)⊸¬+`dec)∾((sp⊏fi)⊏3×2|ft)++⟜(0⊸≤)2+sp⊏xv idor←∾3⥊<is←id∾sp idbc←⟨21+is⊏asn,(id-○(⊏⟜fd)ui)∾0¨sp,ii⟩ @@ -201,8 +223,15 @@ DParse ← {nv‿r𝕊𝕩: or←⍋idor∾g⊏˜∾⟨cn,cn,b,b,rt,dr,l,l,si,si,at,oa+1⌈oa⊏os,(dy×⊏⟜os)⊸+fa+dy⟩ bc0←∾idbc∾⟨0¨cn,u⊐ob,15¨b,1+↕≠b⟩ bc←or⊏bc0∾∾⟨25¨rt,14¨dr,3+l⊏aa,ll,3+si⊏aa,sll,(11-⊑bG)+a/ma+𝕩,5+oa⊏r,(⊢+9×10⊸=)16+dy-7×fa⊏tr⟩ - fs←(ft⊏⥊"fmd"≍⌜⌽↕2)∾¨((+`0∾1+⌊128⋆⁼1⌈bc)⊏˜/1∾or M bc0≍○≠rt)≍○<¨(ft⊏spd)∾⟜(⥊¨↑⟜•a)¨lc - ⟨LEBv bc,u,fs⟩ + fs←(ft⊏⥊3≍⌜⟜⌽○↕2)∾¨((+`0∾1+⌊128⋆⁼1⌈bc)⊏˜/1∾or M bc0≍○≠rt)≍○<¨lc+fsc + ⟨LEBv bc∾25,u,fs⟩ +} + +Compile←{ + ⟨t,r,nVar,lits⟩←Tokenize𝕩 + ⟨bc,u,blk⟩←nVar‿r Parse t + o←(u-(vi+nVar-≠𝕨)×u≥vi)⊏𝕨∾LitVal¨lits + ⟨bc,o,blk⟩ } prims←⟨ @@ -210,13 +239,13 @@ prims←⟨ ˙,˜,˘,¨,⌜,⁼,´,˝,` ∘,○,⊸,⟜,⌾,⊘,◶,⎉,⚇,⍟ ⟩ -DGenFn←{ - p←𝕨⊣prims - ⟨t,r,nVar,lits⟩←Tokenize𝕩 - ⟨bc,u,blk⟩←nVar‿r DParse t - o←(u-(vi+nVar-≠p)×u≥vi)⊏p∾LitVal¨lits - ⟨bc,o,⟨⟩,blk⟩ -} +special←<˘∘‿2⥊"𝕤𝕩𝕨𝕣𝕗𝕘" DRun←{ - •COMP DGenFn 𝕩 + ⟨bc,o,blk⟩ ← prims Compile 𝕩 + blk ↩ { + ⟨t,i,l,n⟩←𝕩 + s←(3×i)↓(t⊑3‿5‿6)↑special + ⟨t⊑"fmd",i,l,s∾⥊¨'a'+↕n-≠s⟩ + }¨blk + •COMP ⟨bc,o,⟨⟩,blk⟩ } |
