Skip to content

Instantly share code, notes, and snippets.

@paulcnichols
Created February 14, 2014 02:04
Show Gist options
  • Save paulcnichols/8994575 to your computer and use it in GitHub Desktop.
Save paulcnichols/8994575 to your computer and use it in GitHub Desktop.
Grammar file for pegjs to parse query expression in the form: strVar="asdf", numVar>=2314
// Generate the parser either by pasting this grammar into
// http://pegjs.majda.cz/online or using the node.js pegjs
// parser. Set the generated class to "aviParser".
//
{
function clearNode() {
this.node = null;
};
function startNode(type, field) {
this.node = {
type: type,
value: field,
};
return field;
};
function parseNumber(integral, fractional) {
if (fractional) {
return parseFloat(integral.join('') + '.' + fractional[1].join(''));
} else {
return parseInt(integral.join(''));
}
};
function finishExpr(field, op, query) {
clearNode();
return {
field: field,
op: op,
query: query,
};
};
function finishExprList(list) {
var ret=[];
for (var i=0; i < list.length; ++i) {
ret.push(list[i][0]);
}
return ret;
}
}
// main expression
start
= expr_list_l4
/ expr_list_l7
// whitespace, quotes
quote_double = "\""
quote_single = "'"
space = [ ]+
// words, reserved field names, and ops
word
= chars:[a-zA-Z0-9/()'?#\\\[\]]+ {
return chars.join('');
}
number
= integral:[0-9]+ fractional:( '.' [0-9]+ )? {
return parseNumber(integral, fractional);
}
// l4 fields
l4_number_fields
= "significant"
/ "client_src_port"
/ "client_dest_port"
/ "start_timestamp"
/ "report_timestamp"
/ "duration"
/ "rtt"
/ "mss"
/ "rx_bytes"
/ "tx_bytes"
/ "total_bytes"
/ "rx_pkts"
/ "tx_pkts"
/ "total_pkts"
/ "out_of_orders"
/ "retransmits"
/ "timeouts"
/ "zero_window_size_events"
/ "vcpu_id"
/ "log_id"
/ "server_dest_port"
/ "server_src_port"
/ "server_rtt"
/ "server_total_bytes"
/ "server_rx_bytes"
/ "server_tx_bytes"
/ "server_total_pkts"
/ "server_rx_pkts"
/ "server_tx_pkts"
/ "server_out_of_orders"
/ "server_retransmits"
/ "server_timeouts"
/ "server_zero_window_size_events"
l4_string_fields
= "significance"
/ "virtualserver"
/ "client_country"
/ "service_engine"
/ "network_security_policy_rule_name"
/ "analytics_policy_rule_name"
/ "pool"
/ "server_name"
// app fields
l7_number_fields
= "significant"
/ "report_timestamp"
/ "vcpu_id"
/ "log_id"
/ "client_src_port"
/ "client_dest_port"
/ "client_rtt"
/ "request_length"
/ "server_dest_port"
/ "server_src_port"
/ "server_rtt"
/ "server_resp_length"
/ "server_resp_code"
/ "server_resp_time_first_byte"
/ "server_resp_time_last_byte"
/ "resp_length"
/ "resp_code"
/ "resp_time_first_byte"
/ "resp_time_last_byte"
/ "compression_percentage"
l7_string_fields
= "significance"
/ "virtualserver"
/ "service_engine"
/ "client_country"
/ "ssl_session_id"
/ "http_version"
/ "method"
/ "uri_path"
/ "uri_query"
/ "referer"
/ "user_agent"
/ "client_device"
/ "client_browser"
/ "xff"
/ "persistent_cookie"
/ "host"
/ "etag"
/ "http_security_policy_rule_name"
/ "http_request_policy_rule_name"
/ "http_response_policy_rule_name"
/ "pool"
/ "server_name"
/ "connection_error_info"
// operations
string_ops
= "=" { return "eq"; }
/ "!=" { return "ne"; }
/ "~=" { return "co"; }
/ "!~=" { return "nc"; }
/ "^=" { return "sw"; }
/ "$=" { return "ew"; }
number_ops
= "=" { return "eq"; }
/ "!=" { return "ne"; }
/ ">=" { return "gte"; }
/ ">" { return "ge"; }
/ "<=" { return "lte"; }
/ "<" { return "le"; }
// tracking failure points
expr_l4_number_field
= field:l4_number_fields {
return startNode('l4_number_field', field);
}
expr_l7_number_field
= field:l7_number_fields {
return startNode('l7_number_field', field);
}
expr_l4_string_field
= field:l4_string_fields {
return startNode('l4_number_field', field);
}
expr_l7_string_field
= field:l7_string_fields {
return startNode('l7_number_field', field);
}
expr_string_op
= space? op:string_ops space? {
return startNode('string_op', op);
}
expr_number_op
= space? op:number_ops space? {
return startNode('number_op', op);
}
expr_query_string
= query:word {
return startNode('string', query);
}
expr_query_number
= query:number {
return startNode('number', query);
}
// various expression types
expr_l4
= field:expr_l4_string_field op:expr_string_op quote_double query:expr_query_string quote_double {
return finishExpr(field, op, query);
}
/ field:expr_l4_string_field op:expr_string_op quote_single query:expr_query_string quote_single {
return finishExpr(field, op, query);
}
/ field:expr_l4_number_field op:expr_number_op query:expr_query_number {
return finishExpr(field, op, query);
}
expr_l7
= field:expr_l7_string_field op:expr_string_op quote_double query:expr_query_string quote_double {
return finishExpr(field, op, query);
}
/ field:expr_l7_string_field op:expr_string_op quote_single query:expr_query_string quote_single {
return finishExpr(field, op, query);
}
/ field:expr_l7_number_field op:expr_number_op query:expr_query_number {
return finishExpr(field, op, query);
}
// the repeated list of expression
expr_list_delim
= space? ","? space?
expr_list_l4
= "l4:" space? list:(expr_l4 expr_list_delim?)+ {
return finishExprList(list);
}
expr_list_l7
= "l7:" space? list:(expr_l7 expr_list_delim?)+ {
return finishExprList(list);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment