Spaces:
Running
Running
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]*
|