diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/c.bqn | 17 |
1 files changed, 9 insertions, 8 deletions
@@ -198,21 +198,22 @@ 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 - ip←id⊏ac⋄d←id⊏dd←ac M 2‿2⋄xm←ip M 1‿2 # Assignment classes; which are definitions, exports + 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 # Order every referenced identifier, and an undeclaration for each declaration - ixf←(((1=ip)+⊏⟜(¯1∾b/gf))∾d⊸/⊏((≠𝕩)∾c⊏gf)˙)idf # First order by block index, open for real and closed for virtual + 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 {"Redefinition"_err_(𝕩⊏·∾⟜(d⊸/)ID) ¬ixx∨○(»⊸≠𝕩⊸⊏)ixf} (≠d)⊸≤⊸/ig ig↩<⟜(≠d)⊸/(⍋+`∘⊏⟜(d∾-/˜d))⊸⊏ig # Last order by declaration depth - d⊏˜↩ig - ("Undefined identifier"Pl/)_err_(ig⊏ID) d<¯1⊸»⊸≠ig⊏idv - idx←idg⊔(dig←⍋d/ig)⊏d(/≥1↓PN)ig⊏xm # Exported identifier mask - idd←(⊢-(IT d)⊸⊏)⌾(ig⊸⊏)id⊏fd # Identifier frame depth + d⊏˜↩ig⋄id⊏˜↩ig + ip←id⊏ac⋄xm←ip M 1‿2 # Assignment class; which are exports + ("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 - idi←ig⍋⊸⊏(¯1+`d)⊏dig⍋⊸⊏(⊏⟜fsc+⊒)¯1↓idg # Slot within frame - uu←ip(((1«d)∧0=⊣)∧d(⊣+`⊸⊏PN)0<⊢)⌾(ig⊸⊏)idd# Unused marker + 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 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 |
