From ff1453f2e2d086a984905bbb85a89712ea3c78bb Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Fri, 30 Oct 2020 16:08:14 -0400 Subject: Generate expression displays from compiled bytecode, not an ad-hoc parser --- tutorial/evalexp.bqn | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) (limited to 'tutorial/evalexp.bqn') diff --git a/tutorial/evalexp.bqn b/tutorial/evalexp.bqn index 17c8c0db..f25144ac 100644 --- a/tutorial/evalexp.bqn +++ b/tutorial/evalexp.bqn @@ -15,25 +15,39 @@ Shadow ← { } DrawEval←{ - ix←𝕩⊏˜i←/𝕩≠' ' - f←0=b←(op←'('=ix)-')'=ix - l←op<<⟜«fn←ix∊"+-×÷⋆√" - g←⍋+`b - ei←¯1∾˜b{((𝕨<0)/𝕩)⌾((𝕨>0)⊸/)𝕩}○(g⊸⊏)»+`f - o←ei⊏˜f/↕∘≠⊸-⌾(g⊸⊏)(1+»l)(⊢+fn×-)1-2×l - g⊏˜↩⍋g⊏l - rev←⍋+`¯1↓(¯1∾g)(⊣⍋⊸⊏⊏˜⟜⍋¬⊏˜)⍋+`⊸+1∾g⊏l∨op - m←1+⌈´d←+`⊸×⌾(rev⊸⊏)fn + b‿const‿blk‿i ← Compile 𝕩 + ba‿bc‿bo‿bp ← '0'-˜⟨ # For each instruction, number of: + "11111000000000010000022000" # Arguments + "000//232323223102303200121" # Stack values consumed + "11111111111111011101111111" # Stack values output + "00000110101000001101000100" # Position determiner + ⟩ + m ← { # Mask of instruction starts + a ← ba(⊣⊏˜≠⊸>×⊢)b + na← ∾⟜≠ (≠-(1+↕∘≠)⊸(»·⌈`×)⌾⌽) <⟜128 b + n ← 1+{(𝕩=⌜a) +˝∘× >⊏⟜na⍟𝕩↕≠a}↕3 + ! ∧´ ↕∘≠⊸< n + Se←{(⊏˜𝕨)Se 1¨⌾((𝕩/𝕨)⊸⊏)𝕩}⍟(0=¯1⊑⊢) + (≠↑∾⟜≠Se 1∾0¨) n + } + mb‿mi ← m⊸/¨ b‿i + mi↓˜↩¯1 + + r←+`(mb⊏bo)-na←mb⊏bc + ! 1=¯1⊑r + p←((¯1↓r)⍋⊸⊏○⍋(⊏⟜r+⊒))⊸⊏/na + j←¯1↓mi⊏˜⊏˜⍟≠{s←𝕩⊏˜g←⍋𝕩⋄(g/˜(⊒s)=s⊏mb⊏bp)⌾((⍷s)⊸⊏)↕≠mb}p + je←j∾¯1.25 + d←+`⊸×f←0 wh×⟨i,d⟩ - off← (o ⊏ ∾⟜(whׯ1.25‿m))⊸- pt - pd ← pt (<(wh×0.6‿0.1)⊸+)⊸∾⟜⌽˘ off - dim← (wh×⟨≠𝕩,2+m⟩)+2‿0×pad - tp ← <˘pt+to+⎉1(0‿1×⌜˜f/¬fn)×off + pd ← <⊸∾⟜⌽˘˜˝ q ⊏ ⍉wh×0.6‿0.1+je≍d + dim← (wh×⟨≠𝕩,2+⌈´d⟩)+2‿0×pad (512‿0⊸⌈⊸(⊣∾˜(t+pad)-˜-˜÷2˙)dim+2×t) SVG gr Enc ∾⥊¨⟨ <"rect" Elt rc∾(Pos-pad)∾"width"‿"height"≍˘FmtNum¨dim <"text" Enc Highlight 𝕩 - (<"path" Elt ps∾"d"≍○<·∾"Mvh"∾⟜Fmt¨⊢)˘ pd -