-
Notifications
You must be signed in to change notification settings - Fork 200
/
yaml.aug
78 lines (66 loc) · 1.54 KB
/
yaml.aug
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
(*
Module: Yaml
Only valid for the following subset:
> defaults: &anchor
> repo1: master
>
> host:
> # Inheritance
> <<: *anchor
> repo2: branch
Author: Dimitar Dimitrov <mitkofr@yahoo.fr>
*)
module YAML =
(* Group: helpers *)
let dash = Util.del_str "-"
let colon = Sep.colon
let space = Sep.space
let val = store Rx.word
let eol = Util.eol
let empty = Util.empty
let comment = Util.comment_noindent
(*
View: indent
the imposed indent is 2 spaces
*)
let indent = del /[ \t]+/ " "
let mval = [ label "@mval" . Util.del_str "|-" . eol
. [ label "@line" . indent . store Rx.space_in . eol ]+ ]
(*
View: inherit
> <<: *anchor
*)
let _inherit = [ key "<<" . colon . space . Util.del_str "*" . val . eol ]
let inherit = indent . _inherit . (indent . comment)*
(*
View: repo
> { "repo" = "branch" }
*)
let _repo = [ key Rx.word . colon . space . (val | mval) . eol ]
let repo = indent . _repo . (indent . comment)*
(*
View: anchor
> &anchor
*)
let anchor = Util.del_str "&" . val
(*
View: entry
> host:
> # Inheritance
> <<: *anchor
> repo2: branch
*)
let entry = [ key Rx.word . colon . (space . anchor)? . eol
. (indent . comment)*
. ((inherit . (repo+)?) | repo+)
]
(* View: top level sequence *)
let sequence = [ label "@sequence" . counter "sequence" . dash . repo+ ]
(* View: header *)
let header = [ label "@yaml" . Util.del_str "---"
. (Sep.space . store Rx.space_in)? . eol ]
(*
View: lns
The yaml lens
*)
let lns = ((empty|comment)* . header)? . (sequence | entry | comment | empty)*