Created
January 12, 2017 20:15
-
-
Save jonasfj/c0f807d8410ad54e54f77e04724bbf74 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
// Save parse options as context | |
var context = options; | |
} | |
Expression | |
= _ e:LogicalExpression _ { return e; } | |
LogicalExpression | |
= l:ComparisonExpression _ '||' _ r:LogicalExpression { return l || r; } | |
/ l:ComparisonExpression _ '&&' _ r:LogicalExpression { return l && r; } | |
/ ComparisonExpression | |
ComparisonExpression | |
= l:AdditiveExpression _ '==' _ r:ComparisonExpression { return l == r; } | |
/ l:AdditiveExpression _ '!=' _ r:ComparisonExpression { return l != r; } | |
/ l:AdditiveExpression _ '<' _ r:ComparisonExpression { return l < r; } | |
/ l:AdditiveExpression _ '>' _ r:ComparisonExpression { return l > r; } | |
/ l:AdditiveExpression _ '<=' _ r:ComparisonExpression { return l <= r; } | |
/ l:AdditiveExpression _ '>=' _ r:ComparisonExpression { return l >= r; } | |
/ AdditiveExpression | |
AdditiveExpression | |
= l:MultiplicativeExpression _ '+' _ r:AdditiveExpression { return l + r; } | |
/ l:MultiplicativeExpression _ '-' _ r:AdditiveExpression { return l - r; } | |
/ MultiplicativeExpression | |
MultiplicativeExpression | |
= l:UnaryExpression _ '*' _ r:MultiplicativeExpression { return l * r; } | |
/ l:UnaryExpression _ '/' _ r:MultiplicativeExpression { return l / r; } | |
/ l:UnaryExpression _ '%' _ r:MultiplicativeExpression { return l % r; } | |
/ UnaryExpression | |
UnaryExpression | |
= _ '!' _ e:InvocationExpression { return !v; } | |
/ _ '-' _ e:InvocationExpression { return -v; } | |
/ InvocationExpression | |
InvocationExpression | |
= f:FunctionExpression '(' _ args:Arguments _ ')' { | |
if (!(f.function instanceof Function)) { | |
throw new Error('Value "' + f.text + '" is not a function'); | |
} | |
return f.function.apply(null, args); | |
} | |
/ MemberExpression | |
FunctionExpression | |
= f:MemberExpression { | |
return {function: f, text: text()}; | |
} | |
Arguments | |
= e1:Expression ps:( _ ',' _ e:Expression { return e; })* { | |
return [e1].concat(ps); | |
} | |
/ _ {return []; } | |
MemberExpression | |
= v:Value '[' _ k:Expression _ ']' { return v[k]; } | |
/ v:Value '.' k:Identifier { return v[k]; } | |
/ Value | |
Value | |
= Literal | |
/ Variable | |
/ '(' _ e:Expression _ ')' { return e; } | |
Literal | |
= String / Number | |
Variable | |
= id:Identifier { | |
if (context[id] === undefined) { | |
throw new Error('Undefined identifier "' + id + '" referenced'); | |
} | |
return context[id]; | |
} | |
Identifier "identifier" | |
= $([a-z_]i [a-z0-9_-]i*) | |
_ = (Comment / Whitespace)* { return null; } | |
Comment "comment" | |
= '/*' (!'/*' .)* '*/' | |
/ '//' (!'\n' .)* '\n' | |
Whitespace "whitespace" | |
= [ \t\n\r] | |
Number "number" | |
= n:$([0-9]+ ('.' [0-9]+)?) { return parseFloat(n); } | |
String "string" | |
= '"' s:([^"\\] / EscapeSequence)* '"' { return s.join(''); } | |
/ "'" s:([^'\\] / EscapeSequence)* "'" { return s.join(''); } | |
EscapeSequence | |
= "\\" ("'" / '"' / "\\" | |
/ "b" { return "\b"; } | |
/ "f" { return "\f"; } | |
/ "n" { return "\n"; } | |
/ "r" { return "\r"; } | |
/ "t" { return "\t"; } | |
/ "v" { return "\x0B"; } | |
/ "u" digits:$(HEX HEX HEX HEX) { | |
return String.fromCharCode(parseInt(digits, 16)); | |
} | |
) | |
HEX = [0-9a-f]i |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment