-
Notifications
You must be signed in to change notification settings - Fork 0
/
Y.apln
159 lines (133 loc) · 5.23 KB
/
Y.apln
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
:Namespace Y
⎕IO←0 ⍝ ⎕IO delenda est
I←{(⊂⍵)⌷⍺} ⋄ U←{⍺←⊢ ⋄ 1≡⍺ 1:⍵⍵⍣¯1 ⍺⍺ ⍵⍵ ⍵ ⋄ ⍵⍵⍣¯1 ⍺ ⍺⍺⍥⍵⍵ ⍵}
WS←' '⍪⍨⊃HT LF CR←⎕UCS 9 10 13
_ M S K Q←⍳5
∆K←' MSKQ'
TM TS TK←1+⍳3
PS←{
1<≢⍴⍵:'PARSER EXPECTS VECTOR INPUT' ⎕SIGNAL 11
2<|≡⍵:'PARSER EXPECTS VECTOR OF CHARS OR LINES' ⎕SIGNAL 11
∨/0≠10|⎕DR¨⊆⍵:'PARSER EXPECTS CHAR INPUT' ⎕SIGNAL 11
c←∊LF,⍪⊆⍵ ⋄ k←0⍴⍨≢c
k c⌿⍨←⊂n≤(⊂¯1++⍀m)⌷(m←c=LF)⌿n←+⍀(≠⍀c∊'"''')<(c='#')∧¯1⊖c∊LF⍪WS
k[⍸(⊢∨¯1⊖⊢)≠⍀(k=¯1)<c∊'"''']←Q
k[⍸(k∊¯1 Q)<(c∊'-?:')∧1⊖c∊LF,' ']←S
k[⍸sm∧im←m<(n-i⌷m⌿n←⍳≢n)=n-(i←⊂¯1++⍀m)⌷(m←c=LF)⌿n←+⍀(k=S)∨sm←c=' ']←¯2
k[⍸im<k=S]←0
d←n-(⊂¯1++⍀m)⌷(m←c=LF)⌿n←+⍀0⍪¯1↓k∊¯2 S
k[i←⍸(k∊S Q)<(c=':')∧1⊖c∊LF⍪WS]←S
d k c m⌿⍨←⊂1+m←(⍳≢k)∊(i-1)(⊣I⍸)⍨⍸¯1⊖(k=S)∨c=LF ⋄ k c(⊣@(⍸m←m∧1⊖m))⍨←S'?'
d+←(c=':')<n>(⊂¯1++⍀m)⌷0⍪¯1↓(1⊖m←c=LF)⌿n←+⍀¯1⊖m
d k c⌿⍨←⊂k≠¯1 ⋄ p←⍳≢i←⍸(c=LF)⍱k<0
_←((¯1⊖⍪⍀){p[⍵]←(⊂a⍸⍵)⌷a←⍺I⍋⍺}¨⊢){⊂1↓⍵-≢x}⌸d[i]⍪⍨x←(⊢I⍋)∪d[i]
k[i]×←S=k[i] I I@{k[i][⍵]=S}⍣≡⍨p ⊣ k←k[i][y I x[y←⍸≠x]⍳x←¯1@{p=⍳≢p}p]@i⊢k
ld←d ⋄ d←(⊂+⍀m)⌷0⍪d⌿⍨m←(¯1⊖m)∨m←k=S
d k c⌿⍨←⊂(m∧k=¯2)⍱(d>ld)∧~m←(i⌷m⌿n)<(i←⊂¯1++⍀m)⌷(1⊖m←c=LF)⌿n←+⍀k=S
d⌿⍨←m←(1↑⍨≢)⍣(~∨⌿m)⊢m←k=S ⋄ k←S M Q I'-:'⍳m⌿c ⋄ k[⍸k≡,Q]←0 ⋄ c⊂⍨←m
c[i]←1↓¨c[i←⍸('-?:'∊⍨⊃¨c)∧k∊S M Q]
c⌿¨⍨←(∨⍀∧∨⍀U⊖)∘(~⊢∊LF⍪WS⍨)¨c ⋄ d k c⌿⍨←⊂(k=0)⍲0=≢¨c
c←(1↓¯1↓⊢)¨@(⍸'"'''∊⍨∊1↑¨c)⊢c
q←(k=M)⍀x⍳⍨qq←∪(⊂'')⍪x←c⌿⍨k=Q ⋄ d k q c⌿⍨←⊂k≠Q
d k q c⍪⍨←(d+←S M∊⍨⊃k)↑¨d k 0(⊂'')
k⊖⍨←1 ⋄ k[⍸d≥1⊖d]←K
t←TM TS TK 0I M S K⍳k
a←(≢d)⍴0
tt←'tag:yaml.org,2002:'∘⍪¨'map' 'seq' 'str'
ver←1 2
hnd←(,'!')'!!'
pfx←(,'!')'tag:yaml.org,2002:'
(d k t a q c)(tt qq ver hnd pfx)}
∇{z}←TEST;TAP;ERRS;d;k;t;a;q;c;tt;qq;ver;hnd;pfx
z←0 ⍝ Profiling with cmpx requires result
TAP←{⍺←⊢ ⋄ (0∊⍵)∨0=≢⍵: ⍺ ⎕SIGNAL 8 ⋄ ⎕←'ok - '⍪4↓(⎕CR'#.Y.TEST')[1⊃⎕LC;] ⋄ _←0}
ERRS←{⍺←⊢ ⋄ 0::⎕EN ⋄ 0⊣⍺ ⍺⍺ ⍵}
⎕←'# Empty input'
(d k t a q c)(tt qq ver hnd pfx)←PS ''
TAP 0=≢¨d k t a q c
TAP 1=≢∘⍴¨d k t a q c
TAP 0=⊃¨d k t a q
TAP c≡0⍴⊂''
TAP tt≡'tag:yaml.org,2002:'∘,¨'map' 'seq' 'str'
TAP qq≡,⊂''
TAP ver≡1 2
TAP hnd≡(,'!')'!!'
TAP pfx≡(,'!')'tag:yaml.org,2002:'
⎕←'# Invalid input'
TAP 11=PS ERRS ↑'fire' 'flies' 'at' 'dusk'
TAP 11=PS ERRS ⍳5
TAP 11=PS ERRS 'dally' 10 'monday'
⎕←'# Plain scalar singleton'
(d k t _ _ c)_←PS 'beware the drool'
TAP d=0
TAP k=K
TAP t=TK
TAP c≡,⊂'beware the drool'
⎕←'# One-line comment singleton'
(d _ _ _ _ _)_←PS '# asparagus goodies'
TAP d≡⍬
⎕←'# Plain scalar with whitespace padding'
(_ _ _ _ _ c)_←PS ' drosophilia melancholia '
TAP c≡,⊂'drosophilia melancholia'
⎕←'# Inline comment'
(_ _ _ _ _ c)_←PS'monkey business # for profit'
TAP c≡,⊂'monkey business'
⎕←'# Single-quoted string'
(_ k t _ _ c)_←PS '''fiona barrusta'''
TAP k=K
TAP t=TK
TAP c≡,⊂'fiona barrusta'
⎕←'# Single-quoted empty scalar'
(_ k t _ _ c)_←PS ''''''
TAP k=K
TAP t=TK
TAP c=,⊂''
⎕←'# Double-quoted scalar'
(_ k t _ _ c)_←PS '"dreamers in droves"'
TAP k=K
TAP t=TK
TAP c≡,⊂'dreamers in droves'
⎕←'# Double-quoted empty scalar'
(_ k t _ _ c)_←PS '""'
TAP k=K
TAP t=TK
TAP c≡,⊂''
⎕←'# Sequence wrapping'
(_ k _ _ _ c)_←PS '- APL' '- ???' '- PROFIT'
TAP 4=≢k
TAP k≡S K K K
TAP c≡'' 'APL' '???' 'PROFIT'
⎕←'# Empty lines'
(d _ _ _ _ _)_←PS '- APL' '' '- ???' '' '- PROFIT'
TAP 4=≢d
⎕←'# Comment lines'
(d _ _ _ _ _)_←PS 'meyers-briggs:' ' # types' ' - intj' ' - infp'
TAP 4=≢d
⎕←'# Padded double quoted scalar'
(_ _ _ _ _ c)_←PS ' "this is a test" '
TAP c≡,⊂'this is a test'
⎕←'# Simple maps'
(_ k _ _ q c)(_ qq _ _ _)←PS 'abc: 123' 'norse: gods' 'emily: bronte'
TAP 4=≢k
TAP c≡'' '123' 'gods' 'bronte'
TAP q≡0 1 2 3
TAP qq≡'' 'abc' 'norse' 'emily'
⎕←'# Simple maps with empty lines'
(_ _ _ _ _ c)_←PS 'abc: 123' '' 'norse: gods' '' ' ' 'emily: bronte' ' ' ''
TAP c≡'' '123' 'gods' 'bronte'
⎕←'# Sequence of sequences'
(d k _ _ _ c)_←PS '-' ' - dresser' ' - drawers' '- buzz lightyear'
TAP k=S S K K K
TAP c≡'' '' 'dresser' 'drawers' 'buzz lightyear'
TAP d=0 1 2 2 1
⍝⎕←'# Two-line plain scalar'
⍝ (_ k _ _ _ c)_←PS 'irridium' 'satellite constellation'
⍝ TAP k=K
⍝ TAP c≡,⊂'irridium satellite constellation'
⍝
⍝⎕←'# Multi-line plain scalar'
⍝ (_ k _ _ _ c)_←PS 'Truman' '' 'The lemonade was good.' 'We went outside.'
⍝ TAP k=K
⍝ TAP c≡,⊂'Truman'⍪(⎕UCS 10)⍪'The lemonade was good. We went outside.'
∇
:EndNamespace