aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2021-05-21 08:01:34 -0400
committerMarshall Lochbaum <mwlochbaum@gmail.com>2021-05-21 08:01:34 -0400
commit11276895878aca3c2c97a98de1f2325cad133456 (patch)
treed30d952f72926f54c42a8baffcaa126b38e905f6 /src
parent660d333d70310b1df6edfcdcc9c1cd99bfbbf3b9 (diff)
Lexical resolution simplifications
Diffstat (limited to 'src')
-rw-r--r--src/c.bqn29
1 files changed, 15 insertions, 14 deletions
diff --git a/src/c.bqn b/src/c.bqn
index a0446e39..a299da3f 100644
--- a/src/c.bqn
+++ b/src/c.bqn
@@ -197,27 +197,28 @@ Parse ← {r‿vn‿i‿e←𝕨⋄nv←≠vn
# Lexical resolution (independent of parsing part 2 below)
di←/dm←»dc # Dots aren't scoped
- id←/idm←(gi⊏«aa∧a)<dm<(0⊸≤∧<⟜nv)xv
- d←id⊏dd←ac M 2‿2 # Which accesses are definitions
- "Can't define special name"_err_(SP) sp⊏dd
- idn←(idg←(d/idf←id⊏fi)∾≠fsc)⊔d/idv←id⊏xv # Numbers for each identifier, per-block
+ id←/(gi⊏«aa∧a)<dm<(0⊸≤∧<⟜nv)xv # Identifier indices in xv
+ sa←0<sc←sp⊏ac⋄d←(ic←id⊏ac)M 2‿2 # Which accesses are definitions
+ "Can't define special name"_err_(SP) sa∧sc<4
+ df←d/idf←id⊏fi # Function index
+ idn←(idg←df∾≠fsc)⊔dv←d/idv←id⊏xv # Identifier name ID, per-block
# Order every referenced identifier, and an undeclaration for each declaration
- ixf←(((1=id⊏ac)+⊏⟜(¯1∾b/gf))∾d⊸/⊏((≠𝕩)∾c⊏gf)˙)idf # First order by block index, open for real and closed for virtual
- ig←(⍋⊏⟜(ixx←∾⟜(d⊸/)idv))⊸⊏⍋ixf # Then order by name
+ ixf←((1=ic)+idf⊏¯1∾b/gf)∾df⊏(≠𝕩)∾c⊏gf # First order by block index, open for real and closed for virtual
+ ig←(⍋⊏⟜(ixx←idv∾dv))⊸⊏⍋ixf # Then order by name
{"Redefinition"_err_(𝕩⊏·∾⟜(d⊸/)ID) ¬ixx∨○(»⊸≠𝕩⊸⊏)ixf} (≠d)⊸≤⊸/ig
- ig↩<⟜(≠d)⊸/(⍋+`∘⊏⟜(d∾-/˜d))⊸⊏ig # Last order by declaration depth
- d⊏˜↩ig⋄id⊏˜↩ig
- ip←id⊏ac⋄xm←ip M 1‿2 # Assignment class; which are exports
+ ig↩<⟜(≠d)⊸/(⍋+`∘⊏⟜(d∾¯1¨dv))⊸⊏ig # Last order by declaration depth
+ d⊏˜↩ig⋄id⊏˜↩ig⋄ic⊏˜↩ig
+ ix←(ic<3)∧ia←0<ic # Which are exports, assignments
("Undefined identifier"Pl/)_err_(ID) d<¯1⊸»⊸≠ig⊏idv
idd←(⊢-(IT d)⊸⊏)id⊏fd # Identifier frame depth
- "Can't export from surrounding scope"_err_(ID) xm∧0<idd
- idx←idg⊔(dig←⍋d/ig)⊏d(/≥1↓PN)xm # Exported identifier mask
- idi←(¯1+`d)⊏dig⍋⊸⊏(⊏⟜fsc+⊒)¯1↓idg # Slot within frame
- uu←((1«d)∧0=ip)∧d(⊣+`⊸⊏PN)0<idd # Unused marker
+ "Can't export from surrounding scope"_err_(ID) ix∧0<idd
+ idx←idg⊔(dig←⍋d/ig)⊏d(/≥1↓PN)ix # Exported identifier mask
+ idi←(¯1+`d)⊏dig⍋⊸⊏(⊏⟜fsc+⊒)df # Slot within frame
+ uu←(ia<1«d)∧d(⊣+`⊸⊏PN)0<idd # Unused marker
spi←((spf←sp⊏fi)⊏3×fx)+0⊸≤⊸+2+sp⊏xv # Special name index
uu∾↩∊⌾⌽spi+6×spf # and unused marker
idor←∾2‿3/⟨di,id∾sp⟩ # Identifier bytecode ordering
- ido←21+uu(⊢+10×>)0<ip∾sp⊏ac # Opcode
+ ido←21+uu(⊢+10×>)ia∾sa # Opcode
idbc←⟨26¨di,di⊏xv, ido,idd∾0¨sp,idi∾spi⟩ # Identifier bytecode: instruction, depth, slot
# Parsing part 2