serverless-artillery
Version:
A serverless performance testing tool. `serverless` + `artillery` = crush. a.k.a. Orbital Laziers [sic]
106 lines (101 loc) • 4.03 kB
JavaScript
function code(args, skipParentheses) {
var argsJs = args.map(function(a) {
return typeof(a) == 'number' ? ('$' + a) : JSON.stringify(a);
}).join(',');
return skipParentheses
? '$$ = [' + argsJs + '];'
: '$$ = ["(", ' + argsJs + ', ")"];';
}
var grammar = {
// Lexical tokens
lex: {
rules: [
['\\*', 'return "*";'],
['\\/', 'return "/";'],
['-' , 'return "-";'],
['\\+', 'return "+";'],
['\\^', 'return "^";'],
['\\%', 'return "%";'],
['\\(', 'return "(";'],
['\\)', 'return ")";'],
['\\,', 'return ",";'],
['==', 'return "==";'],
['\\!=', 'return "!=";'],
['>=', 'return ">=";'],
['<=', 'return "<=";'],
['<', 'return "<";'],
['>', 'return ">";'],
['\\?', 'return "?";'],
['\\:', 'return ":";'],
['and[^\\w]', 'return "and";'],
['or[^\\w]' , 'return "or";'],
['not[^\\w]', 'return "not";'],
['in[^\\w]', 'return "in";'],
['\\s+', ''], // skip whitespace
['[0-9]+(?:\\.[0-9]+)?\\b', 'return "NUMBER";'], // 212.321
['[a-zA-Z][\\.a-zA-Z0-9_]*', 'return "SYMBOL";'], // some.Symbol22
['"(?:[^"])*"', 'yytext = yytext.substr(1, yyleng-2); return "STRING";'], // "foo"
// End
['$', 'return "EOF";'],
]
},
// Operator precedence - lowest precedence first.
// See http://www.gnu.org/software/bison/manual/html_node/Precedence.html
// for a good explanation of how it works in Bison (and hence, Jison).
// Different languages have different rules, but this seems a good starting
// point: http://en.wikipedia.org/wiki/Order_of_operations#Programming_languages
operators: [
['left', '?', ':'],
['left', 'or'],
['left', 'and'],
['left', 'in'],
['left', '==', '!='],
['left', '<', '<=', '>', '>='],
['left', '+', '-'],
['left', '*', '/', '%'],
['left', '^'],
['left', 'not'],
['left', 'UMINUS'],
],
// Grammar
bnf: {
expressions: [ // Entry point
['e EOF', 'return $1;']
],
e: [
['e + e' , code([1, '+', 3])],
['e - e' , code([1, '-', 3])],
['e * e' , code([1, '*', 3])],
['e / e' , code([1, '/', 3])],
['e % e' , code([1, '%', 3])],
['e ^ e' , code(['Math.pow(', 1, ',', 3, ')'])],
['- e' , code(['-', 2]), {prec: 'UMINUS'}],
['e and e', code(['Number(', 1, '&&', 3, ')'])],
['e or e' , code(['Number(', 1, '||', 3, ')'])],
['not e' , code(['Number(!', 2, ')'])],
['e == e' , code(['Number(', 1, '==', 3, ')'])],
['e != e' , code(['Number(', 1, '!=', 3, ')'])],
['e < e' , code(['Number(', 1, '<' , 3, ')'])],
['e <= e' , code(['Number(', 1, '<=', 3, ')'])],
['e > e' , code(['Number(', 1, '> ', 3, ')'])],
['e >= e' , code(['Number(', 1, '>=', 3, ')'])],
['e ? e : e', code([1, '?', 3, ':', 5])],
['( e )' , code([2])],
['NUMBER' , code([1])],
['STRING' , code(['"', 1, '"'])],
['SYMBOL' , code(['data["', 1, '"]'])],
['SYMBOL ( argsList )', code(['functions.', 1, '(', 3, ')'])],
['e in ( inSet )', code([1, ' in (function(o) { ', 4, 'return o; })({})'])],
['e not in ( inSet )', code(['!(', 1, ' in (function(o) { ', 5, 'return o; })({}))'])],
],
argsList: [
['e', code([1], true)],
['argsList , e', code([1, ',', 3], true)],
],
inSet: [
['e', code(['o[', 1, '] = true; '], true)],
['inSet , e', code([1, 'o[', 3, '] = true; '], true)],
],
}
};
console.log(JSON.stringify(grammar));