aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2020-09-05 22:17:48 -0400
committerMarshall Lochbaum <mwlochbaum@gmail.com>2020-09-05 22:17:48 -0400
commit6bb849d6cfc00791acb72017ac0e7f7dea7bdc08 (patch)
treea61dcbc94a73a2842e492e46dc3b89211808ca70
parentf8e364460bd05dbd3e6db9d36166ef2b16745b66 (diff)
Align self-hosted compiler with dzaima/BQN one, except for UTF-16 hacks
-rwxr-xr-xc.bqn99
-rw-r--r--src/c.bqn2
-rwxr-xr-xsrc/cjs.bqn4
-rwxr-xr-xtest/t.js2
4 files changed, 68 insertions, 39 deletions
diff --git a/c.bqn b/c.bqn
index c7fa2d3d..5867d6bd 100755
--- a/c.bqn
+++ b/c.bqn
@@ -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⟩
}
diff --git a/src/c.bqn b/src/c.bqn
index 1967591f..bd41f254 100644
--- a/src/c.bqn
+++ b/src/c.bqn
@@ -83,7 +83,7 @@ LEBv ← {
ErrMismatchedBrackets←{
Lcs ← ¯1 ⊑ 0˘∘⊢ {𝕩⌈⌈`𝕨+0∾˜1↓𝕩}˝ =⌜
- _mis ← {"Missing "∾𝕗∾" "∾charSet⊏˜𝕘+⊢/˜≠∘⊣=⊒}
+ _mis_ ← {"Missing "∾𝕗∾" "∾charSet⊏˜𝕘+⊢/˜≠∘⊣=⊒}
Msg ← >○≠◶⟨"opening"_mis_ 0, "closing"_mis_ 1˜⟩
0 !˜ 𝕨 (Lcs<⌊○≠)◶⟨Msg,"Malformed bracket nesting"⟩ 𝕩
}
diff --git a/src/cjs.bqn b/src/cjs.bqn
index e936b4fd..2b26f65d 100755
--- a/src/cjs.bqn
+++ b/src/cjs.bqn
@@ -1,6 +1,6 @@
#! /usr/bin/env dbqn
-compile ← ⟨•path∾"../c.bqn"⋄"DGenFn"⟩ •EX •path∾"../dzref"
+compile ← ⟨•path∾"../c.bqn"⋄"Compile"⟩ •EX •path∾"../dzref"
Comp ← ((<"runtime["∾⍕∾"]"˙)¨↕60)⊸Compile
FP ← ∞⊸=◶⟨⍕,"Infinity"⟩
Esc ← (⟨"\t","\n","\r","\'"⟩∾<∘⥊)⊑˜("'"∾˜@+9‿10‿13)⊑∘⊐⊢
@@ -9,7 +9,7 @@ Char ← "'"(∾∾⊣)Esc
Fconst ← ≡◶⟨(⊑⍋)∘(∾⟜∞)◶⟨0⊸≤◶⟨"-"∾FP∘|,FP⟩,Char⟩⋄Str⋄⊑⟩
L ← "["∾"]"∾˜1↓·∾","⊸∾⟜⍕¨
J ← ∾∾⟜(@+10)¨
-Fout ← ⟨L∾⟜25,L Fconst¨,L⟨⊑"fmd"⊸⊐,⊢,⊢,≠⟩⊸(L{𝕎𝕩}¨)¨⟩ {𝕎𝕩}¨ 0‿1‿3 ⊏ ⊢
+Fout ← ⟨⊢,Fconst,L⟩ {L𝕎¨𝕩}¨ ⊢
Frun ← ("provide.concat("∾∾⟜")")⌾(1⊸⊑) Fout
Long ← ∾ (1‿2/⟨" new Uint8Array("∾∾⟜")"⋄((@+10)∾" ,")⊸∾⟩) {𝕎𝕩}¨ ⊢
• ← (⊑"r"‿"c"‿"fmt"⊐⊏)◶⟨
diff --git a/test/t.js b/test/t.js
index 05ee2004..c11bcc01 100755
--- a/test/t.js
+++ b/test/t.js
@@ -11,7 +11,7 @@ const t=load('cases.bqn').split('\n').filter(x=>x).map(x=>x.split(' % '))
var compiler = execFile(
__dirname+'/../cshim.bqn',
- [ '{•←Compile𝕩}¨⟨'+test+'⟩' ],
+ [ '{•←WCompile𝕩}¨⟨'+test+'⟩' ],
function (error, stdout, stderr) {
const rslt=stdout.split('\n').filter(a=>a.length)
.map(a=>runWasm(a.split("‿").map(n=>+n)))