tc-line ::= item, EOL ;
item ::= assignment | expr ;
assignment ::= identifier '=' expr ;
identifier ::= [a-zA-Z_][a-zA-Z_0-9]* ;
expr ::= add-expr ;
add-expr ::= mul-expr | add-expr add-op mul-expr ;
add-op ::= '+' | '-' ;
mul-expr ::= unary-expr | mul-expr mul-op unary-expr-expr ;
mul-op ::= '*' | '/' | '%' ;
unary-expr ::= pow-expr | unary-op unary-expr ;
unary-op ::= '+' | '-' ;
pow-expr ::= primary | primary '^' pow-expr ;
primary ::= number | '(' expr ')' | identifier | call-expr ;
number ::= [0-9]+(.[0-9]+)? | '.'[0-9]+ ;
call-expr ::= identifier '(' argument-list ? ')' ;
argument-list ::= expr (',' expr)* ;