# Arithmetic-grammar ####################################################################### # # EBNF-Directives # ####################################################################### @ whitespace = vertical # implicit whitespace, includes any number of line feeds @ literalws = right # literals have implicit whitespace on the right hand side @ comment = /#.*/ # comments range from a '#'-character to the end of the line @ ignorecase = False # literals and regular expressions are case-sensitive @ drop = whitespace, token # drop anonymous whitespace ####################################################################### # #: Expressions # ####################################################################### expression = add | sub | term add = term "+" expression sub = term "-" expression ####################################################################### # #: Terms # ####################################################################### term = mul | div | factor mul = factor "*" term div = factor "/" term ####################################################################### # #: Factors # ####################################################################### factor = [sign] [element] tail tail = seq | tail_elem seq = tail_elem tail ####################################################################### # #: Elements # ####################################################################### element = pow | atom pow = atom "^" pow atom = NUMBER | VARIABLE | group tail_elem = tail_pow | tail_atom tail_pow = fragment "^" pow tail_atom = VARIABLE | group sign = PLUS | MINUS group = "(" §expression ")" ####################################################################### # #: Tokens # ####################################################################### PLUS = /\+/ MINUS = /-/ NUMBER = /(?:0|(?:[1-9]\d*))(?:\.\d+)?/~ VARIABLE = /[i-z]/~