aboutsummaryrefslogtreecommitdiff
path: root/src/c.bqn
blob: eed5f8431657319d5ee270065addb2cfaae3cd38 (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
#! ./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

bFbMbCbSbGbBbLbObIbDbNbAbW⊔/≠¨charGroups
vi+´¨9charGroups
charRole((vi-≠bI)↑/0∾≠¨3charGroups)(5/⌽↕2)0
spc356-30

Tokenize{
  r𝕩='#'s/(≠↑2)𝕩='''⋄d←/𝕩='"'
  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←¬≠`ToI b
  cb←(¬(st/q)⊏r)/b
  lu←⍷lit←𝕩⊔˜1-˜(+`ToI⊑˘cb)×≠`ToI cb
  cl←f/ToI⊑∘⌽˘cb

  c←charSet⊐f/𝕩
  w←(≠↑0∾⊢)⊸<l←c∊∾bD‿bN‿bA
  i←(1-˜l×+`w)⊔c
  na←≠alph⋄us←¯1⊑bA
  in←na(⊢-⊣×+⟜(⊑bA)⊸≤)us⊸≠⊸/¨i
  id←⍷(bA∊˜w/c)⍒⊸⊏in⋄nv←+´bA∊˜⊑¨id

  c↩(w∨¬l∨c∊bW)/(vi+id⊐in)⌾(w⊸/)(vi+(≠id)+lu⊐lit)⌾(cl⊸/)c
  c/˜↩¬(≠↑1∾(c∊2‿4⊏bB)∨⊢)⊸∧c∊bS⋄c/˜↩¬(1↓1∾˜c∊3‿5⊏bB)∧c∊bS
  ti←(us=¯1⊸⊑¨i)(⊢+∧⟜(2⊸=))0⌈na⌊∘÷˜(⊑bA)-˜⊑¨i
  ic←(0⊸≤∧<⟜(≠id))c-vi⋄t←ti⌾(ic⊸/)(vi⌊c)⊏charRole
  c+↩5×c∊5↑bI
  ⟨c,t,nv,(nv↓id)∾lu⟩
}

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


LEBv  {
  b128
  lb1𝕩
  o⍋⍋⊒/1+l
  ol{f×𝕨(𝕨-1)(b(×f+|)∾𝕊(⌊÷b)(f/))(´f)𝕩}𝕩
}

Parse  {nvr𝕨
  g⍋+`pbB((¯12|⊢))𝕩brp×𝕩23bB
  sl1𝕩bLsr¯1(g)slsaslsr
  g˜gslr׬saop>0
  r+(sa<𝕩=1bB)(⊣∧¬∨=(`(1+↕)×))(¯1(g)3=r)1r
  rev⍋+`1+¯1g((¯1∾⊣)(⊣⍋⊏⊏˜-⊏˜)1(+`∾-∾˜))osl𝕩bS

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

  FC-(≠↑0∾⊢)(c1)/·+`0
  H0<1·FC𝕩(5bI)+⊢
  ft0(H↕3)+2×(H⥊3)2×H⥊4
  r((1ft)(1+2)/↕4)(b)revr

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

  g⍋+`revp-brgrgrevsll1+2÷˜0(<-/>)grsr-sll/g𝕩=5bB
  g˜gsgrslgrgrev𝕩˜gr˜go˜grsi/grsr>sl
  giglgs
  s𝕩bSpssogrsla𝕩2bG
  r-psaopr2fe(r1)1r=3
  tr(`ׯ1ps)fe
  matr<(𝕩=1bG)1fe
  roopa<1r=3os⌽↕(⊣-⌈`×)⌽¬romaat(⊢+1+⊏os)/a
  aagasn¯1⌽+`gi⊏-(≠↑0∾⊢)(↕≠𝕩)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𝕩¯1bCu∧⍷obcn𝕩
  lo(o/𝕩)=4bBll1+lo/1(↓--)(o1)/+`(s0)-(1o)ps1
  dr/s>o+`0lort/𝕩=2bB

  diddecidmadasnlcFC dec
  ig((¯1c/gf)d/⊏((𝕩)bgf)˜)idfi
  ig<(id)/(⍋+`(d∾-/˜d))(⍋⊏((d/)idx))ig
  uid(`×)(ig)id
  ii(ui(fiftspc)-(`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)˜/1orbc0+rt)<¨lc+ftspc
  LEBv bc25,u,fs
}

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