Skip to content

Instantly share code, notes, and snippets.

@kormat
Last active April 18, 2016 21:19
Show Gist options
  • Save kormat/33bfceedecaea2b36effc8eeca650727 to your computer and use it in GitHub Desktop.
Save kormat/33bfceedecaea2b36effc8eeca650727 to your computer and use it in GitHub Desktop.
EBNF description of mtail language
<statement> ::= <conditional statement>
| <expression statement>
| <declaration>
| <definition>
| <decoration statement>
| "next"
| "const", name, <pattern expression>
<conditional statement> ::= <cond> <compound statement>
<expression statement> ::= [<expr>] "\n"
<compound statement> ::= "{", { <statement> }, "}"
<expr> ::= <assign expr>
<assign expr> ::= [ <unary expr>, ("="|"+=") ], <bitwise expr>
<bitwise expr> ::= [ <bitwise expr> ("&"|"|"|"^") ], <rel expr>
<rel expr> ::= [ <rel expr> ("<"|">"|"<="|">="|"=="|"!=") ], <shift expr>
<shift expr> ::= [ <shift expr> ("<<"|">>") ], <additive expr>
<additive expr> ::= [ <additive expr> ("+"|"-") ], <multiplicative expr>
<multiplicative expr> ::= [ <multiplicative expr> ("*"|"/"|"**") ], <unary expr>
<unary expr> ::= [ "~" ], <postfix expr>
| <builtin>, "(", [ <arg expr list> ], ")"
<arg expr list> ::= [ <arg expr list>, "," ], <assign expr>
<postfix expr> ::= <primary expr>, [ "++" ]
| <primary expr>, "[" <expr> "]"
<primary expr> ::= name | capture group | string | "(", <expr>, ")" | int literal | float literal
<cond> ::= <pattern expr> | <rel expr>
<pattern expr> ::= "/", regex, "/"
| <pattern expr>, "+", [ "\n" ], "/", regex, "/"
| <pattern expr>, "+", name
<declaration> ::= [ "hidden" ], ("counter"|"gauge"|"timer"), <declarator>
<declarator> ::= <declarator>, <by spec>
| <declarator>, "as", string
| name
| string
<by spec> ::= "by", <by expr list>
<by expr list> ::= name | string
| <by expr list>, ",", name
| <by expr list>, ",", string
<definition> ::= "def", name, <compound statement>
<decoration statement> ::= "@", name, <compound statement>
<builtin> ::= "len"|"settime"|"strptime"|"strtol"|"timestamp"|"tolower"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment