Created
February 14, 2014 02:04
-
-
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
This file contains hidden or 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
// 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