Skip to content

Instantly share code, notes, and snippets.

@jonasfj
Created January 12, 2017 20:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonasfj/c0f807d8410ad54e54f77e04724bbf74 to your computer and use it in GitHub Desktop.
Save jonasfj/c0f807d8410ad54e54f77e04724bbf74 to your computer and use it in GitHub Desktop.
{
// 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