aboutsummaryrefslogtreecommitdiff
path: root/src/c.bqn
blob: 3d85f8e8bded13fac050370db7138ff5c7209389 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#! ./dzref

tab'	'nl'
'
dig  "0123456789"
alph  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
alow  "abcdefghijklmnopqrstuvwxyz"
charSetcharGroups
  chF"+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!" # Function
  "˜˘¨⌜⁼´˝`"            # Modifier
  "∘○⊸⟜⌾⊘◶⎉⚇⍟"          # Composition
  nl"⋄,"               # Separator
  "←↩→"                 # Gets
  "(){}⟨⟩"              # Bracket
  "‿"                   # Ligature
  "·"                   # nOthing
  "𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕗𝕘"          # Input (𝕣 pending; ℝ not allowed)
  dig                   # Digit
  "¯.π∞"                # Numeric
  alowalph"_"         # Alphabetic
  " "tab               # 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‿bD‿bN‿bA‿bW←≍¨˜⟜(+`≠↑0∾⊢)≠¨charGroups
bA_e←4+⊑bA
M←1⊸⊑(0⊸≤∧>)-⟜⊑
vi←+´≠¨9↑charGroups
charRole←((vi-1⊑bI)↑/0∾≠¨3↑charGroups)∾(5/⌽↕2)∾0
spc←⥊3‿5‿6-⌜3‿0

Tokenize←{
  r←𝕩='#'⋄s←/(≠↑2⊸↓)⊸∧𝕩='''⋄d←/dm←𝕩='"'
  g←⍋q←∾⟨  s⋄¯1↓d⋄/r⟩ ⋄q↩g⊏q
  e← g⊏∾⟨2+s⋄ 1↓d⋄(⊢-¯1↓0∾⊢)∘⊏⟜(0∾+`r)⊸//(𝕩=nl)∾1⟩
  Se←{(⊏˜𝕨)Se 1¨⌾((𝕩/𝕨)⊸⊏)𝕩}⍟{0=⊑⌽𝕩}
  st←¯1↓Se⟜(1↑˜≠)∾⟜≠q⍋e⋄b←st/q∾˘e
  ToI←¯1↓·/⁼(≠𝕩)∾˜⥊
  f←¬≠`bm←ToI b⋄f∧↩¬qe←f∧bm∧(1↓0∾˜⊢)⊸∧dm
  cb←(¬(st/q)⊏r)/b
  lu←⍷lit←𝕩⊔˜1-˜(+`qe-˜ToI⊑˘cb)×≠`ToI cb
  cl←f/ToI⊑∘⌽˘cb

  c←CharCode⌾((¬cl)⊸/) f/𝕩
  w←(≠↑0∾⊢)⊸<l←c M (⊑bD)≍+´1⊑¨bD‿bN‿bA
  na←≠alph⋄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 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
  ic←(0⊸≤∧<⟜ni)c-vi⋄t←ti⌾(ic⊸/)(vi⌊c)⊏charRole
  c+↩5×c M 5≍˜⊑bI
  ⟨c,t,+´¬in,((in//iu)⊏id)∾lu⟩
}

ReadNum←{
  n‿d‿p‿i←4↕⊸+⊑bN  # ¯.π∞
  Nat←+⟜(10⊸×)´∘⌽ -⟜(⊑bD)
  Int←(n=⊑)◶⟨Nat,-·Nat 1⊸↓⟩
  Dec←⊐⟜(<d)⊸(Nat∘↑ + ·(0<≠)◶⟨0,Nat÷10⋆≠⟩+⟜1⊸↓)
  Pos←(⊑p‿i⊐⊏)◶⟨π,∞,Dec⟩
  e←⊑𝕩⊐bA_e
  m←(n=⊑)◶⟨Pos,-·Pos 1⊸↓⟩e↑𝕩
  𝕩×⟜(10⋆·Int(e+1)↓⊣)˜⍟(e<≠𝕩)m
}
LitVal←(⊑("'"∾'"')⊐⊏)1,1,ReadNum


LEBv  {
  b128
  lb1𝕩
  o⍋⍋((¯1⊑⊢)-/(≠↑0∾⊢))(+`)1+l
  ol{f×𝕨(𝕨-1)(b(×f+|)∾𝕊(⌊÷b)(f/))(´f)𝕩}𝕩
}

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  {nvr𝕨
  gpd+`p𝕩(¯12|-)bBbrp×𝕩M 2˜2+⊑bB
  p(=1/ErrMismatchedBrackets1-˜=¯1/)(g)𝕩
  "Swapped open and closed brackets" ! 0(g)pd
  sl1𝕩 M bLsr¯1(g)slsaslsr
  g˜gslr׬saop>0
  r+(sa<𝕩=1+⊑bB)(⊣∧¬∨=(`(1+↕)×))(¯1(g)3=r)1r
  rev⍋+`1+¯1g((¯1∾⊣)(⊣⍋⊏⊏˜-⊏˜)1(+`∾-∾˜))osl𝕩 M bS

  gffd+`revbr
  rev˜gffd˜gf
  𝕩˜revbvrevbrb/bv<0fi+`cbv>0

  FC-(≠↑0∾⊢)(c1)/·+`0
  H0<1↓FC=
  ft(01H+2×2H⌈2×3H)(0345+5+⊑bI)𝕩
  fscftspc
  r((1ft)(1+2)/↕4)(b)revr

  id/idm(0≤∧<nv)xv𝕩-viidxid𝕩sp/𝕩 M bI
  ad(`×𝕩 M bG)𝕩=⊑bG

  g⍋+`revp-brgrgrevsll1+2÷˜0(<-/>)grsr-sll/g𝕩=5+⊑bB
  g˜gsgrslgrgrev𝕩˜gr˜go˜grsi/grsr>sl
  giglgs
  s𝕩 M bSpssogrsla𝕩 M 2˜bG
  r-psaopr2fe(r1)1r=3
  tr(`ׯ1ps)fe
  matr<(𝕩=1+⊑bG)1fe
  roopa<1r=3os⌽↕(⊣-⌈`×)⌽¬romaat(⊢+1+⊏os)/a
  aagasn¯1⌽+`gi⊏-(≠↑0∾⊢)¯1↓/(𝕩)˜at-1r¯1¨(aa/)r
  tf(a(`(1+↕)×)ps)(⊢∧2(|<≤)ps(⊢-⌈`×)+`)¬ro
  opaop>10˜psa
  oa⌽/opafa/(1aa)<(tf∨¬tr)(ro1opa)<(r=1)op<¯1opa
  dyfa10˜(𝕩≠⊑bO)(trr0)ro<r=0
  n𝕩vi+nvcn/n𝕩¯1++´bCu∧⍷obcn𝕩
  lo(o/𝕩)=4+⊑bBll1+lo/1(↓--)(o1)/+`(s0)-(1o)ps1
  dr/s>o+`0lort/𝕩=2+⊑bB

  diddecidmadasnlcFC dec
  ixf((¯1c/gf)d/⊏((𝕩)bgf)˜)idfi
  ig(⍋⊏(ixx(d/)idx))⊏⍋ixf
  "Multiple definitions" ! 1´ixx((≠↑0∾⊢)((id)/ig)⊏⊢)ixf
  ig<(id)/(⍋+`(d∾-/˜d))ig
  d˜igErrUndeclared/˜(0´)(d<(≠↑0∾⊢))igidx
  ui(`×d)(ig)id
  ii(ui(fifsc)-(`c×)¬+`dec)((spfi)3×2|ft)++(0)2+spxv
  idor3⥊<isidsp
  idbc21+isasn,(id-(fd)ui)0¨sp,ii

  bgi
  oridorg˜cn,cn,b,b,rt,dr,l,l,si,si,at,oa+1oaos,(dy×⊏os)+fa+dy
  bc0idbc0¨cn,uob,15¨b,1+↕≠b
  bcorbc0∾∾25¨rt,14¨dr,3+laa,ll,3+siaa,sll,(11-⊑bG)+a/ma+𝕩,5+oar,(⊢+9×10=)16+dy-7×fatr
  fs(ft⊏⥊32)¨((+`01+⌊1281bc)˜/1or M bc0rt)<¨lc+fsc
  LEBv bc25,u,fs
}

Compile{
  t,r,nVar,litsTokenize𝕩
  bc,u,blknVarr Parse t
  o(u-(vi+nVar-≠𝕨)×uvi)𝕨∾LitVal¨lits
  bc,o,blk
}