From 486d4b6ad42f0760102aa34fcd9c37bd4f39491c Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 9 Aug 2021 13:46:57 -0400 Subject: Compute parsing ordering before propagating roles --- src/c.bqn | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/c.bqn b/src/c.bqn index 74c1ee2b..8843a64f 100644 --- a/src/c.bqn +++ b/src/c.bqn @@ -144,14 +144,21 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn nx←0 ⋄ nei←↕≠nr ⋄ _nerr←{𝕗 _err_ nei 2=nx⌈↩𝕩} "Can't strand Nothing (·)"_nerr nr׬ns g⊏˜↩⍋g⊏sdl←sl∨dl # Avoid reordering strands and dots in rev + rp←≠⊸»⌾(g⊸⊏)↕≠r # Position of previous, for roles # Permutation to reverse each expression: *more* complicated than it looks rev←⍋+`¯1↓(¯1∾g)(⊣⍋⊸⊏⊏˜⟜⍋¬⊏˜)⍋+`⊸+1∾g⊏sdl∨r=¯1 gf←⍋fd←+`br←rev⊏p×𝕩M⟨2+⊑bB,2⟩ # Order by brace depth fd to de-nest blocks rev⊏˜↩gf⋄fd⊏˜↩gf⋄br⊏˜↩gf - 𝕩⊏˜↩rev⋄p⊏˜↩rev⋄i⊏˜↩rev⋄e⊏˜↩rev + 𝕩⊏˜↩rev⋄dc⊏˜↩rev⋄i⊏˜↩rev⋄e⊏˜↩rev - # Block properties + # Compute parsing ordering gr≡g⊏rev + g↩⍋+`p↩br-˜rev⊏p⋄g⊏˜↩⍋g⊏«⊸∨dc⋄gr←g⊏rev # Order by non-brace bracket depth, then dots + sll←1+2÷˜0(<-○/>)gr⊏sr-sl⋄l←/g⊏𝕩=5+⊑bB # Strand length; list starts b←br>0⋄c←/br<0 # Block Begin (mask) and Close (index), in matching order + bp←⟨/b,c⟩∾¨0(<≍○()g⊏p # Bracket pairs + g⊏˜↩gs←⍋gr⊏sl⋄gr↩g⊏rev⋄gi←⍋g # Send strand prefixes *‿ to the end + + # Block properties hh←𝕩=⊑bH⋄cs←𝕩=1+⊑bH # Case header : and separator ; "Punctuation : and ; not allowed outside blocks"_err_(↕∘≠) (∨`b)»r=0 - r(×⟜¬-⊢)↩dl⋄dc⊏˜↩rev # Namespace and dot to ¯1 + "Dot must be preceded by a subject"_err_(⍋∘rev) (r=4)>»r=0 + r(×⟜¬-⊢)↩dl # Namespace and dot to ¯1 # Prep for lexical resolution before reordering 𝕩 xv←𝕩-vi - - # Parsing part 1 - p-↩br⋄g↩⍋+`p⋄g⊏˜↩⍋g⊏«⊸∨dc⋄gr←g⊏rev # Order by non-brace bracket depth, then dots - sll←1+2÷˜0(<-○/>)gr⊏sr-sl⋄l←/g⊏𝕩=5+⊑bB # Strand length; list starts - bp←⟨/b,c⟩∾¨0(<≍○()g⊏p # Bracket pairs {i↩(𝕨⊏i)⌾(𝕩⊸⊏)i⋄e↩(𝕩⊏e)⌾(𝕨⊸⊏)e}´bp # Highlight all contents of a pair when error reporting - g⊏˜↩gs←⍋gr⊏sl⋄gr↩g⊏rev⋄gi←⍋g # Send strand prefixes *‿ to the end 𝕩⊏˜↩g⋄r⊏˜↩gr⋄ir⊏˜↩gr⋄l↩(l⊏⍋gs)∾/gr⊏sr>sl + + # Parsing part 1 a←(¯5⊸<∧≤⟜¯3)r⋄ps←ahu)∨dm∨gi⊏«aa∧a)<(0⊸≤∧<⟜nv)xv # Identifier indices in xv + id←/((hf>hu)∨dm∨gi⊏«aa∧a)<(0⊸≤∧<⟜nv)xv # Identifier indices in xv sa←0