summaryrefslogtreecommitdiff
path: root/peripheral/libupm/doxy/node/grammars/xml.peg
blob: bca96d51d871c523409d22e7239a908bc5b1bd22 (plain)
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
document
  = _ ignore* _ "<doxygen " _ attr:attr* _ ">" body:elements _ "</doxygen>" _ { return body; }


elements
  = element*

element
  = _ "<" startTag:id _ attr:attr* _ ">" _ children:elements _ "</" endTag:id ">" _ {
    if (startTag != endTag) {
      throw new Error("Expected </" + startTag + "> but </" + endTag + "> found.");
    }
    return {name: startTag, attr: attr, children: children }
  }
  / "<" tag:id _ attr:attr* _ "/>" _ {
    return {name: tag, attr: attr }
  }
  / _ text:text _ { return text }

ignore
  = "<?xml" _ attr* _ "?>" { return }

attr
  = name:id _ "=" _ value:string { return { name:name, value:value } }

string
  = '"' '"' _           { return ""; }
  / "'" "'" _           { return ""; }
  / '"' text:quoted '"' _ { return text; }
  / "'" text:quoted "'" _ { return text; }

quoted
  = chars:[^<>'" \t\n\r]+  { return chars.join(""); }

text
  = chars:[^<> \t\n\r]+  { return chars.join(""); }

id
  = chars:[^<>/'"=? \t\n\r]+  { return chars.join(""); }

_ "whitespace"
  = whitespace*

whitespace
  = [ \t\n\r]