{} = English Meaning of KEYWORD

statements: NEWLINE* statement (NEWLINE+ statement)* NEWLINE*

statement: KEYWORD:redi{return} expr?
	     : KEYWORD:continua{continue}
		 : KEYWORD:confringe{break}
		 : expr

expr: IDENTIFIER (IDENTIFIER TOKEN:COMMA)* (TOKEN:LSQUARE IDENTIFIER (IDENTIFIER, TOKEN:COMMA)* TOKEN:RSQUARE)* (TOKEN:EQ || TOKEN:PLUSEQ || TOKEN:MIN_EQ || TOKEN:MUL_EQ || TOKEN:DIV_EQ ) expr
    : comp-expr ((KEYWORD:et{and}|KEYWORD:aut{or}) comp-expr)*

comp-expr: non{not} comp-expr
         : arith-expr ((EE|LT|GT|LTE|GTE) arith-expr)*

arith-expr: term ((PLUS|MINUS) term)*

term: factor ((MUL|DIV) factor)*

factor: (PLUS|MINUS) factor
      : power

power: call (POW factor)*

call: atom (LPAREN (expr (COMMA expr)*)? RPAREN)?

atom: INT|FLOAT|STRING|IDENTIFIER([idx])*(.attribute)?
    : LPAREN expr RPAREN
    : list-expr
    : if-expr
    : try-expr
    : for-expr
    : while-expr
    : func-def

list-expr: LSQUARE (expr (COMMA expr)*)? RSQUARE

if-expr: KEYWORD:si{if} expr TOKEN:COLON
       (statement if-expr-b|if-expr-c?)
       (NEWLINE statements|if-expr-b|if-expr-c)

if-expr-b: KEYWORD:alioquinsi{elif} expr TOKEN:COLON
         (statement if-expr-b|if-expr-c?)
         | (NEWLINE statements|if-expr-b|if-expr-c)

if-expr-c: KEYWORD:alioquin{else}
         statement
         | (NEWLINE statements)

try-expr: KEYWORD:tempta{try} TOKEN:COLON
         statement
         | (NEWLINE statements)
         (NEWLINE statements|except-expr)

except-expr: KEYWORD:praeter(except) (Exception)? (as name)? TOKEN:COLON
           statement
           | NEWLINE statements

for-expr: KEYWORD:pro{for} IDENTIFIER TOKEN:EQ expr KEYWORD:ad{to} expr 
        (KEYWORD:gradus{step} expr)? TOKEN:COLON
        statement
        | (NEWLINE statements)

while-expr: KEYWORD:dum{while} expr TOKEN:COLON
          statement
          | (NEWLINE statements)

func-def: KEYWORD:opus{fun} IDENTIFIER?
        LPAREN (IDENTIFIER (COMMA IDENTIFIER)*)? RPAREN
        (ARROW expr)
        | TOKEN:COLON (NEWLINE statements)