broomhlda 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b531cf8a1deb12865af0da4152652846aa41d4b8
4
- data.tar.gz: 940fb9d11c3ed725af5e32c92b6d6988d3edc275
3
+ metadata.gz: a3a9585d07f566041aaa2f64eb3c39d8549659b0
4
+ data.tar.gz: f177b9a4c5037651d946fed5b778701199732973
5
5
  SHA512:
6
- metadata.gz: c747b4053c1bc6b035f49207fcf5262d6b77f3634d79ec9dd46877f0ae28e35e4068c3afadbc8e088314ea51ffb18c791db5c209749497f2e7d4e27f12095c97
7
- data.tar.gz: 4a1095545987f373e2a6a807db9d927569fb57985d32db51e854c8eee6dbbdd344e36d24b6533cc03cfa017db0fda818236ba39c09f5888eb02c6355fee6fd38
6
+ metadata.gz: db598fbeb791fb044348c1a28925edee938c043ed4a235170b6ac2c4c90c7059e1d8ae6e98c371d1b3209c76e420975667b3222f37636c726d51ab058a51d152
7
+ data.tar.gz: 8cc5f90657ff5fcf48e722bc0daa958bceb7f449d17f17b3153e74fb39b8c3ff21453546bec350d9a4a32c90d6f845b544c9e85ea039775e7762a09469bcf93e
data/lib/hl/define.ay CHANGED
@@ -53,14 +53,11 @@ def(type-from(`(using(~who)))):
53
53
 
54
54
  def(type-from(x)): raise("unknown match type: " + x inspect)
55
55
 
56
- def(regexp-from(x, regexps)):
57
- regexps <<
58
- `([x]: Regexp new(
59
- x source
60
- x options | @info fetch(.flags)
61
- ); call(~x))
62
-
63
- `(regexps[~(Atomy Grammar AST Number new(regexps size - 1))])
56
+ def(regexp-from(x)):
57
+ `([x]: Regexp new(
58
+ x source
59
+ x options | @info fetch(.flags)
60
+ ); call(~x))
64
61
 
65
62
  def(state-from('pop)): '(State Pop new)
66
63
  def(state-from(`(pop(~n)))): `(State PopNum new(~n))
@@ -86,15 +83,13 @@ macro(lex(~name) [~*args]: ~*tokens):
86
83
 
87
84
  body = []
88
85
 
89
- regexps = []
90
-
91
86
  tokens each [c]:
92
87
  c match:
93
88
  -- implicit continue state
94
89
  `(~x is(~y)):
95
90
  branches <<
96
91
  `(Matcher new(
97
- ~(regexp-from(x, regexps))
92
+ ~(regexp-from(x))
98
93
  ~(type-from(y))
99
94
  State Continue new
100
95
  ))
@@ -103,7 +98,7 @@ macro(lex(~name) [~*args]: ~*tokens):
103
98
  `(~x is(~y) -> ~z):
104
99
  branches <<
105
100
  `(Matcher new(
106
- ~(regexp-from(x, regexps))
101
+ ~(regexp-from(x))
107
102
  ~(type-from(y))
108
103
  ~(state-from(z))
109
104
  ))
@@ -112,7 +107,7 @@ macro(lex(~name) [~*args]: ~*tokens):
112
107
  `(~x is(~y) => ~z):
113
108
  branches <<
114
109
  `(Matcher new(
115
- ~(regexp-from(x, regexps))
110
+ ~(regexp-from(x))
116
111
  ~(type-from(y))
117
112
  State GoTo new(@matchers, .~z)
118
113
  ))
@@ -126,6 +121,5 @@ macro(lex(~name) [~*args]: ~*tokens):
126
121
 
127
122
  body << `([~*branches] flatten)
128
123
 
129
- `([regexps] {
130
- @matchers[.~name] = proc [~*args]: ~*body
131
- } call([~*regexps]))
124
+ `(@matchers[.~name] = proc [~*args]:
125
+ ~*body)
@@ -13,7 +13,7 @@ formatter = class:
13
13
  div(#{ .class: "highlight" }) [d]:
14
14
  d pre [p]:
15
15
  format-tokens(p)
16
-
16
+
17
17
  builder doc children first serialize(#{ .save-with: 0 })
18
18
 
19
19
  def(format-tokens(to)):
data/lib/hl/lexer.ay CHANGED
@@ -40,7 +40,7 @@ fn(try-all(matchers)):
40
40
  break
41
41
 
42
42
  unless(closest):
43
- /error(NoMatchFor new(@input))
43
+ Self error(NoMatchFor new(@input))
44
44
 
45
45
  skipped = closest pre-match
46
46
  @input = closest post-match
@@ -55,7 +55,7 @@ fn(try-all(matchers)):
55
55
 
56
56
  tokens(closest, worked type)
57
57
 
58
- lexer = class:
58
+ class(Lexer):
59
59
  def(initialize(input)):
60
60
  @input = input dup
61
61
 
@@ -95,5 +95,3 @@ lexer = class:
95
95
 
96
96
  def(flags &x):
97
97
  @info[.flags] = x call
98
-
99
- const-set(.Lexer, lexer)
@@ -0,0 +1,348 @@
1
+ use(require("atomy"))
2
+ use(require("hl/define"))
3
+
4
+ lexer = lexer:
5
+ name: "YAML"
6
+ aliases: "yaml"
7
+ extensions: [".yaml", ".yml"]
8
+ mimetypes: "text/x-yaml"
9
+ start: .root
10
+ flags: Regexp MULTILINE
11
+
12
+ -- starting point for lexing
13
+ lex(root):
14
+ @indent-stack = []
15
+ @indent = -1
16
+ @next-indent = 0
17
+
18
+ -- ignored whitespace
19
+ r"[ ]+(?=#|$)" is(text)
20
+
21
+ -- line breaks
22
+ r"\n+" is(text)
23
+
24
+ -- comments
25
+ r"#[^\n]*" is(comment.single)
26
+
27
+ -- '%YAML' directive
28
+ r"^%YAML(?=[ ]|$)" is(name.tag) -> do-all(
29
+ go-to(reset-indent)
30
+ go-to(yaml-directive)
31
+ )
32
+
33
+ -- '%TAG' directive
34
+ r"^%TAG(?=[ ]|$)" is(name.tag) -> do-all(
35
+ go-to(reset-indent)
36
+ go-to(tag-directive)
37
+ )
38
+
39
+ -- document start/end indicators
40
+ r"^(?:---|\.\.\.)(?=[ ]|$)" is(name.namespace) -> do-all(
41
+ go-to(reset-indent)
42
+ go-to(block-line)
43
+ )
44
+
45
+ -- indentation
46
+ r"[ ]*(?!\s|$)" is(text) -> do-all(
47
+ go-to(save-start-indent)
48
+ go-to(block-line)
49
+ go-to(indentation)
50
+ )
51
+
52
+
53
+ lex(reset-indent):
54
+ @indent-stack = []
55
+ @indent = -1
56
+ @next-indent = 0
57
+
58
+ r"" is(text) -> pop
59
+
60
+ lex(save-start-indent) [d]:
61
+ @next-indent = d[0] size
62
+
63
+ when(@next-indent < @indent):
64
+ while(@next-indent < @indent):
65
+ @indent = @indent-stack pop
66
+
67
+ r"" is(text) -> pop
68
+
69
+ lex(save-indent) [d]:
70
+ @next-indent += d[0] size
71
+
72
+ r"" is(text) -> pop
73
+
74
+ lex(set-indent) [d]:
75
+ when(@indent < @next-indent):
76
+ @indent-stack << @indent
77
+ @indent = @next-indent
78
+
79
+ @next-indent += d[0] size
80
+
81
+ r"" is(text) -> pop
82
+
83
+ lex(set-implicit-indent) [d]:
84
+ when(@indent < @next-indent):
85
+ @indent-stack << @indent
86
+ @indent = @next-indent
87
+
88
+ r"" is(text) -> pop
89
+
90
+
91
+ lex(ignored-line):
92
+ -- ignored whitespace
93
+ r"[ ]+(?=#|$)" is(text)
94
+
95
+ -- a comment
96
+ r"#[^\n]*" is(comment.single)
97
+
98
+ -- line break
99
+ r"\n" is(text) -> pop(2)
100
+
101
+
102
+ lex(yaml-directive):
103
+ -- the version number
104
+ r"([ ]+)([0-9]+\.[0-9]+)" is(by-groups(text, number)) => ignored-line
105
+
106
+
107
+ lex(tag-directive):
108
+ -- a tag handle and the corresponding prefix
109
+ r"([ ]+)(!|![\w-]*!)([ ]+)(!|!?[\w;/?:@&=+$,.!~*'()\[\]%-]+)" is(
110
+ by-groups(text, keyword.type, text, keyword.type)) => ignored-line
111
+
112
+
113
+ lex(indentation):
114
+ -- trailing whitespaces are ignored
115
+ r"[ ]*$" is(text) -> pop(2)
116
+
117
+ -- whitespaces preceding block collection indicators
118
+ r"[ ]+(?=[?:-](?:[ ]|$))" is(text) => save-indent
119
+
120
+ -- block collection indicators
121
+ r"[?:-](?=[ ]|$)" is(punctuation.indicator) => set-indent
122
+
123
+ -- the beginning a block line
124
+ r"[ ]*" is(text) -> do-all(pop, go-to(save-indent))
125
+
126
+
127
+ lex(block-line):
128
+ -- the line end
129
+ r"[ ]*(?=#|$)" is(text) -> pop -- something(Text)
130
+
131
+ -- whitespaces separating tokens
132
+ r"[ ]+" is(text)
133
+
134
+ -- tags, anchors and aliases,
135
+ any-of(descriptors)
136
+
137
+ -- block collections and scalars
138
+ any-of(block-nodes)
139
+
140
+ -- flow collections and quoted scalars
141
+ any-of(flow-nodes)
142
+
143
+ -- a plain scalar
144
+ r"(?=[^\s?:,\[\]{}#&*!|>'\"%@`-]|[?:-]\S)" is(name.variable) => plain-scalar-in-block-context -- something(Name.Variable)
145
+
146
+
147
+ lex(descriptors):
148
+ -- a full-form tag
149
+ r"!<[\w;/?:@&=+$,.!~*'()\[\]%-]+>" is(keyword.type)
150
+
151
+ -- a tag in the form '!', '!suffix' or '!handle!suffix'
152
+ r"!(?:[\w-]+)?(?:![\w;/?:@&=+$,.!~*'()\[\]%-]+)?" is(keyword.type)
153
+
154
+ -- an anchor
155
+ r"&[\w-]+" is(name.label)
156
+
157
+ -- an alias
158
+ r"\*[\w-]+" is(name.variable)
159
+
160
+
161
+ lex(block-nodes):
162
+ -- implicit key
163
+ r":(?=[ ]|$)" is(punctuation.indicator) => set-implicit-indent
164
+
165
+ -- literal and folded scalars
166
+ r"[|>][+-]?\n(?=([ ]*))" is(punctuation.indicator) => block-scalar-content
167
+
168
+ -- literal and folded scalars with explicit indent levels
169
+ r"[|>][+-]?([0-9]+)\n" is(punctuation.indicator) => block-scalar-content-with-indent
170
+ r"[|>]([0-9]+)[+-]?\n" is(punctuation.indicator) => block-scalar-content-with-indent
171
+
172
+
173
+ lex(block-scalar-content) [d]:
174
+ -- line break
175
+ r"\n" is(text)
176
+
177
+ -- indented line
178
+ r"^([ ]{#{d[1] size}})([^\n]*)" is(by-groups(text, name.constant))
179
+
180
+ -- unindented; leave state
181
+ r"^([ ]{0,#{d[1] size - 1}})(?=[^ ])" is(text) -> pop(2)
182
+
183
+
184
+ lex(block-scalar-content-with-indent) [d]:
185
+ -- line break
186
+ r"\n" is(text)
187
+
188
+ -- indented line
189
+ r"^([ ]{#{d[1] to-i}})([^\n]*)" is(by-groups(text, name.constant))
190
+
191
+ -- unindented; leave state
192
+ r"^([ ]{0,#{d[1] to-i - 1}})(?=[^ ])" is(text) -> pop(2)
193
+
194
+
195
+ lex(flow-nodes):
196
+ -- a flow sequence
197
+ r"\[" is(punctuation.indicator) => flow-sequence
198
+
199
+ -- a flow mapping
200
+ r"\{" is(punctuation.indicator) => flow-mapping
201
+
202
+ -- a single-quoted scalar
203
+ r"'" is(string) => single-quoted-scalar
204
+
205
+ -- a double-quoted scalar
206
+ r"\"" is(string) => double-quoted-scalar
207
+
208
+
209
+ lex(flow-collection):
210
+ -- whitespaces
211
+ r"[ ]+" is(text)
212
+
213
+ -- line breaks
214
+ r"\n+" is(text)
215
+
216
+ -- a comment
217
+ r"#[^\n]*" is(comment.single)
218
+
219
+ -- simple indicators
220
+ r"[?:,]" is(punctuation.indicator)
221
+
222
+ -- tags, anchors and aliases
223
+ any-of(descriptors)
224
+
225
+ -- nested collections and quoted scalars
226
+ any-of(flow-nodes)
227
+
228
+ -- a plain scalar
229
+ r"(?=[^\s?:,\[\]{}#&*!|>'\"%@`])" is(name.variable) => plain-scalar-in-flow-context
230
+
231
+
232
+ lex(flow-sequence):
233
+ -- include flow collection rules
234
+ any-of(flow-collection)
235
+
236
+ -- the closing indicator
237
+ r"\]" is(punctuation.indicator) -> pop
238
+
239
+
240
+ lex(flow-mapping):
241
+ -- include flow collection rules
242
+ any-of(flow-collection)
243
+
244
+ -- the closing indicator
245
+ r"\}" is(punctuation.indicator) -> pop
246
+
247
+
248
+ lex(quoted-scalar-whitespaces):
249
+ -- leading and trailing whitespaces are ignored
250
+ r"^[ ]+" is(text)
251
+ r"[ ]+$" is(text)
252
+
253
+ -- line breaks are ignored
254
+ r"\n+" is(text)
255
+
256
+ -- other whitespaces are a part of the value
257
+ r"[ ]+" is(name.variable)
258
+
259
+
260
+ lex(single-quoted-scalar):
261
+ -- include whitespace and line break rules
262
+ any-of(quoted-scalar-whitespaces)
263
+
264
+ -- escaping of the quote character
265
+ r"\'\'" is(string.escape)
266
+
267
+ -- regular non-whitespace characters
268
+ r"[^\s\']+" is(string)
269
+
270
+ -- the closing quote
271
+ r"\'" is(string) -> pop
272
+
273
+
274
+ lex(double-quoted-scalar):
275
+ -- include whitespace and line break rules
276
+ any-of(quoted-scalar-whitespaces)
277
+
278
+ -- escaping of special characters
279
+ r"\\[0abt\tn\nvfre \"\\N_LP]" is(string)
280
+
281
+ -- escape codes
282
+ r"\\(?:x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})" is(string.escape)
283
+
284
+ -- regular non-whitespace characters
285
+ r"[^\s\"\\]+" is(string)
286
+
287
+ -- the closing quote
288
+ r"\"" is(string) -> pop
289
+
290
+
291
+ lex(plain-scalar-in-block-context-new-line):
292
+ -- empty lines
293
+ r"^[ ]+$" is(text)
294
+
295
+ -- line breaks
296
+ r"\n+" is(text)
297
+
298
+ -- document start and document end indicators
299
+ r"^(?=---|\.\.\.)" is(name.namespace) -> pop(3)
300
+
301
+ -- continuing indentation spaces
302
+ r"^[ ]{#{@indent}}" is(text) -> pop
303
+
304
+ -- unindented; pop out of scalar
305
+ r"^[ ]{0,#{@indent - 1}}(?=[^ ])" is(text) -> pop(3)
306
+
307
+
308
+ lex(plain-scalar-in-block-context):
309
+ -- the scalar ends with the ':' indicator
310
+ r"[ ]*(?=:[ ]|:$)" is(text) -> pop -- something(Text)
311
+
312
+ -- the scalar ends with whitespaces followed by a comment
313
+ r"[ ]+(?=#)" is(text) -> pop
314
+
315
+ -- trailing whitespaces are ignored
316
+ r"[ ]+$" is(text)
317
+
318
+ -- line breaks are ignored
319
+ r"\n+" is(text) => plain-scalar-in-block-context-new-line
320
+
321
+ -- other whitespaces are a part of the value
322
+ r"[ ]+" is(literal.scalar.plain)
323
+
324
+ -- regular non-whitespace characters
325
+ r"(?::(?!\s)|[^\s:])+" is(name.property) --literal.scalar.plain)
326
+
327
+
328
+ lex(plain-scalar-in-flow-context):
329
+ -- the scalar ends with an indicator character
330
+ r"[ ]*(?=[,:?\[\]{}])" is(text) -> pop -- something(Text)
331
+
332
+ -- the scalar ends with a comment
333
+ r"[ ]+(?=#)" is(text) -> pop
334
+
335
+ -- leading and trailing whitespaces are ignored
336
+ r"^[ ]+" is(text)
337
+ r"[ ]+$" is(text)
338
+
339
+ -- line breaks are ignored
340
+ r"\n+" is(text)
341
+
342
+ -- other whitespaces are a part of the value
343
+ r"[ ]+" is(name.variable)
344
+
345
+ -- regular non-whitespace characters
346
+ r"[^\s,:?\[\]{}]+" is(name.variable)
347
+
348
+ const-set(.Lexer, lexer)
metadata CHANGED
@@ -1,39 +1,39 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: broomhlda
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Suraci
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-09 00:00:00.000000000 Z
11
+ date: 2015-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: atomy
15
- version_requirements: !ruby/object:Gem::Requirement
15
+ prerelease: false
16
+ requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: 0.6.2
20
+ version: 0.6.3
20
21
  type: :runtime
21
- prerelease: false
22
- requirement: !ruby/object:Gem::Requirement
22
+ version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.6.2
26
+ version: 0.6.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
- version_requirements: !ruby/object:Gem::Requirement
29
+ prerelease: false
30
+ requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
32
  - - "~>"
32
33
  - !ruby/object:Gem::Version
33
34
  version: '10.4'
34
35
  type: :development
35
- prerelease: false
36
- requirement: !ruby/object:Gem::Requirement
36
+ version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
@@ -215,9 +215,10 @@ files:
215
215
  - lib/hl/lexers/imported/xslt.ay
216
216
  - lib/hl/lexers/imported/xtend.ay
217
217
  - lib/hl/lexers/ruby.ay
218
+ - lib/hl/lexers/yaml.ay
218
219
  - lib/hl/state.ay
219
220
  - lib/hl/token.ay
220
- homepage: http://atomy-lang.org
221
+ homepage: https://vito.github.io/atomy
221
222
  licenses:
222
223
  - Apache-2.0
223
224
  metadata: {}
@@ -237,7 +238,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
237
238
  version: '0'
238
239
  requirements: []
239
240
  rubyforge_project:
240
- rubygems_version: 2.4.8
241
+ rubygems_version: 2.4.6
241
242
  signing_key:
242
243
  specification_version: 4
243
244
  summary: broomhlda syntax highlighter and tokenizer