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 | mul-expr add-op add-expr ; add-op ::= '+' | '-' ; mul-expr ::= unary-expr | unary-expr mul-op mul-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)* ;