File size: 1,249 Bytes
aa89cb5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
{
  function expression(target, calls) {
    return { type: "CallChain", target, calls: calls.map(item => item[3]) };
  }
}

Start
  = _ value:Expression _ ";"? _ { return value; }

Expression
  = target:Identifier calls:(_ "." _ Call)+ { return expression(target, calls); }

Call
  = method:Identifier _ "(" _ args:Arguments? _ ")" {
      return { type: "Call", method, arguments: args || [] };
    }

Arguments
  = head:Value tail:(_ "," _ Value)* { return [head, ...tail.map(item => item[3])]; }

Value
  = Expression
  / Array
  / DoubleQuotedString
  / SingleQuotedString
  / Number
  / Boolean
  / Null

Array
  = "[" _ values:Arguments? _ "]" { return values || []; }

DoubleQuotedString
  = value:$('"' ("\\" . / [^"\\])* '"') { return JSON.parse(value); }

SingleQuotedString
  = "'" chars:("\\" escaped:. { return escaped; } / [^'\\])* "'" { return chars.join(""); }

Number
  = value:$('-'? ([0-9]+ "." [0-9]+ / [0-9]+) ([eE] [+-]? [0-9]+)?) { return Number(value); }

Boolean
  = "true" !IdentifierPart { return true; }
  / "false" !IdentifierPart { return false; }

Null
  = "null" !IdentifierPart { return null; }

Identifier
  = value:$([A-Za-z_$] IdentifierPart*) { return value; }

IdentifierPart
  = [A-Za-z0-9_$]

_ = [ \t\r\n]*