cvecs ← {nv←0} ##.tokens cvec ⍝ Lex of APL src line. Splits an APL "source" line into its constituent tokens. Character literal strings, comments and expanses of "white space" are deemed single tokens. NB: this function is largely superseded by 60⌶. Optional left argument [nv] deterimines whether numeric vectors (1 2 3) are to be considered: 0 multiple tokens (default) 1 a single token An alternative coding of the function might be: tokens2←{ ⍝ Lex of APL source line. alph←(0≤⎕NC⍪⎕AV)/⎕AV ⍝ Alphabet for names. all←{+/∧\⍺∊⍵} ⍝ ∇ No of leading ⍺∊⍵ acc←{n←⍺⍺ ⍵ ⋄ (⍺,⊂n↑⍵)lex n↓⍵} ⍝ ∇∇ Accumulated tokens lex←{ ⍝ ∇ Next lexical token 0=⍴⍵:⍺ ⋄ hd←⊃⍵ ⍝ Next char else finished hd=' ':⍺{⍵ all' '}acc ⍵ ⍝ White Space hd∊alph:⍺{⍵ all alph,⎕D}acc ⍵ ⍝ Name hd∊'⎕:':⍺{1+(1↓⍵)all alph,':'}acc ⍵ ⍝ System Name / Keyword / guard hd='''':⍺{+/∧\{⍵∨¯1⌽⍵}≠\⍵=hd}acc ⍵ ⍝ Char literal hd∊⎕D,'¯':⍺{⍵ all ⎕D,'.¯E'}acc ⍵ ⍝ Numeric scalar literal hd∊'⍺⍵∇':⍺{⍵ all hd}acc ⍵ ⍝ Meta character. hd='⍝':⍺⍴acc ⍵ ⍝ Comment ⍺{1}acc ⍵ ⍝ Single char token } (0⍴⊂'')lex,⍵ } Example: {⎕←1 disp tokens ⍵}¨⎕nr'tokens' ┌→─────┬─┬─┬───┬─┬─┬───────────────────────────┬──────────────────────┐ │tokens│←│{│⎕ML│←│3│ │⍝ Lex of APL src line.│ └─────→┴→┴→┴──→┴→┴→┴──────────────────────────→┴─────────────────────→┘ ┌⊖┐ │ │ └⊖┘ ┌→───┬────┬─┬─┬─┬─┬───┬─┬───┬─┬─┬───┬────────────────┬─────────────────────┐ │ │alph│←│(│0│≤│⎕NC│⍪│⎕AV│)│/│⎕AV│ │⍝ Alphabet for names.│ └───→┴───→┴→┴→┴→┴→┴──→┴→┴──→┴→┴→┴──→┴───────────────→┴────────────────────→┘ ┌⊖┐ │ │ └⊖┘ ┌→───┬───┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬───────────────────────┬─────────────────────┐ │ │all│←│{│+│/│∧│\│⍺│∊│⍵│}│ │⍝ No. of leading ⍺∊⍵.│ └───→┴──→┴→┴→┴→┴→┴→┴→┴→┴→┴→┴→┴──────────────────────→┴────────────────────→┘ ┌⊖┐ │ │ └⊖┘ ┌→───┬───┬─┬─┬─┬─┬─┬─┬─┬─┬─┬───┬─┬─┬─┬─┬─┬────────────────┬────────────────────┐ │ │acc│←│{│(│⍺│,│↑│/│⍵│)│lex│⊃│↓│/│⍵│}│ │⍝ Accumulate tokens.│ └───→┴──→┴→┴→┴→┴→┴→┴→┴→┴→┴→┴──→┴→┴→┴→┴→┴→┴───────────────→┴───────────────────→┘ ┌⊖┐ │ │ └⊖┘ ┌→───┬───┬─┬─┐ │ │lex│←│{│ └───→┴──→┴→┴→┘ ┌⊖┐ │ │ └⊖┘ ┌→───────┬─┬─┬─┬─┬─┬─┬─┬─┬─┬──┬─┬─┬─┬──────────────────┬──────────────────────────┐ │ │0│=│⍴│⍵│:│⍺│ │⋄│ │hd│←│↑│⍵│ │⍝ Next char else finished.│ └───────→┴→┴→┴→┴→┴→┴→┴→┴→┴→┴─→┴→┴→┴→┴─────────────────→┴─────────────────────────→┘ ┌⊖┐ │ │ └⊖┘ ┌→───────┬──┬─┬───┬─┬─┬─┬───────────────────────┬──────────────┐ │ │hd│=│' '│:│⍺│{│ │⍝ White Space.│ └───────→┴─→┴→┴──→┴→┴→┴→┴──────────────────────→┴─────────────→┘ ┌→───────────┬────┬─┬─┬─┬───┬───┐ │ │size│←│⍵│ │all│' '│ └───────────→┴───→┴→┴→┴→┴──→┴──→┘ ┌→───────────┬─┬─┬───┬─┬────┬─┬─┐ │ │⍺│ │acc│ │size│ │⍵│ └───────────→┴→┴→┴──→┴→┴───→┴→┴→┘ ┌→───────┬─┬─┐ │ │}│⍵│ └───────→┴→┴→┘ ┌⊖┐ │ │ └⊖┘ ┌→───────┬──┬─┬────┬─┬─┬─┬──────────────────────┬──────┐ │ │hd│∊│alph│:│⍺│{│ │⍝ Name│ └───────→┴─→┴→┴───→┴→┴→┴→┴─────────────────────→┴─────→┘ ┌→───────────┬────┬─┬─┬─┬───┬─┬────┬─┬──┐ │ │size│←│⍵│ │all│ │alph│,│⎕D│ └───────────→┴───→┴→┴→┴→┴──→┴→┴───→┴→┴─→┘ ┌→───────────┬─┬─┬───┬─┬────┬─┬─┐ │ │⍺│ │acc│ │size│ │⍵│ └───────────→┴→┴→┴──→┴→┴───→┴→┴→┘ ┌→───────┬─┬─┐ │ │}│⍵│ └───────→┴→┴→┘ ┌⊖┐ │ │ └⊖┘ ┌→───────┬──┬─┬────┬─┬─┬─┬──────────────────────┬───────────────────────┐ │ │hd│∊│'⎕:'│:│⍺│{│ │⍝ System Name / Keyword│ └───────→┴─→┴→┴───→┴→┴→┴→┴─────────────────────→┴──────────────────────→┘ ┌→───────────┬────┬─┬─┬─┬───┬─┬──┬─┬────┐ │ │size│←│⍵│ │all│ │hd│,│alph│ └───────────→┴───→┴→┴→┴→┴──→┴→┴─→┴→┴───→┘ ┌→───────────┬─┬─┬───┬─┬────┬─┬─┐ │ │⍺│ │acc│ │size│ │⍵│ └───────────→┴→┴→┴──→┴→┴───→┴→┴→┘ ┌→───────┬─┬─┐ │ │}│⍵│ └───────→┴→┴→┘ ┌⊖┐ │ │ └⊖┘ ┌→───────┬──┬─┬────┬─┬─┬─┬──────────────────────┬──────────────┐ │ │hd│=│''''│:│⍺│{│ │⍝ Char literal│ └───────→┴─→┴→┴───→┴→┴→┴→┴─────────────────────→┴─────────────→┘ ┌→───────────┬────┬─┬─┬─┬─┬─┬─┬─┬─┬──┬─┬─┬─┬─┬─┬──┬─┬─┐ │ │size│←│+│/│∧│\│{│⍵│∨│¯1│⌽│⍵│}│≠│\│hd│=│⍵│ └───────────→┴───→┴→┴→┴→┴→┴→┴→┴→┴→┴─→┴→┴→┴→┴→┴→┴─→┴→┴→┘ ┌→───────────┬─┬─┬───┬─┬────┬─┬─┐ │ │⍺│ │acc│ │size│ │⍵│ └───────────→┴→┴→┴──→┴→┴───→┴→┴→┘ ┌→───────┬─┬─┐ │ │}│⍵│ └───────→┴→┴→┘ ┌⊖┐ │ │ └⊖┘ ┌→───────┬──┬─┬──┬─┬───┬─┬─┬─┬────────────────────┬─────────────────┐ │ │hd│∊│⎕D│,│'¯'│:│⍺│{│ │⍝ Numeric literal│ └───────→┴─→┴→┴─→┴→┴──→┴→┴→┴→┴───────────────────→┴────────────────→┘ ┌→───────────┬────┬─┬─┬─┬───┬─┬──┬─┬─────┐ │ │size│←│⍵│ │all│ │⎕D│,│'.¯E'│ └───────────→┴───→┴→┴→┴→┴──→┴→┴─→┴→┴────→┘ ┌→───────────┬─┬─┬───┬─┬────┬─┬─┐ │ │⍺│ │acc│ │size│ │⍵│ └───────────→┴→┴→┴──→┴→┴───→┴→┴→┘ ┌→───────┬─┬─┐ │ │}│⍵│ └───────→┴→┴→┘ ┌⊖┐ │ │ └⊖┘ ┌→───────┬──┬─┬─────┬─┬─┬─┬─────────────────────┬────────────────┐ │ │hd│∊│'⍺⍵∇'│:│⍺│{│ │⍝ ⍺⍺ or ⍵⍵ or ∇∇│ └───────→┴─→┴→┴────→┴→┴→┴→┴────────────────────→┴───────────────→┘ ┌→───────────┬────┬─┬─┬─┬───┬─┬──┐ │ │size│←│⍵│ │all│ │hd│ └───────────→┴───→┴→┴→┴→┴──→┴→┴─→┘ ┌→───────────┬─┬─┬───┬─┬────┬─┬─┐ │ │⍺│ │acc│ │size│ │⍵│ └───────────→┴→┴→┴──→┴→┴───→┴→┴→┘ ┌→───────┬─┬─┐ │ │}│⍵│ └───────→┴→┴→┘ ┌⊖┐ │ │ └⊖┘ ┌→───────┬──┬─┬───┬─┬─┬─┬───┬─┬─┬─┬─┬─┬───────────────┬─────────┐ │ │hd│=│'⍝'│:│⍺│ │acc│(│⍴│⍵│)│⍵│ │⍝ Comment│ └───────→┴─→┴→┴──→┴→┴→┴→┴──→┴→┴→┴→┴→┴→┴──────────────→┴────────→┘ ┌⊖┐ │ │ └⊖┘ ┌→───────┬─┬─┬───┬─┬─┬─┬─┬───────────────────────┬────────────────────┐ │ │⍺│ │acc│ │1│ │⍵│ │⍝ Single char token.│ └───────→┴→┴→┴──→┴→┴→┴→┴→┴──────────────────────→┴───────────────────→┘ ┌→───┬─┐ │ │}│ └───→┴→┘ ┌⊖┐ │ │ └⊖┘ ┌→───┬─┬─┬─┬─┬──┬─┬───┬─┬─┐ │ │(│0│⍴│⊂│''│)│lex│,│⍵│ └───→┴→┴→┴→┴→┴─→┴→┴──→┴→┴→┘ ┌→┐ │}│ └→┘ See also: words unify rmcm segs Back to: contents Back to: Workspaces