@spec lex(chars :: binary()) :: [term()]
@spec modulo(integer(), integer()) :: non_neg_integer() | :undefined
@spec parse(lexed :: [term()]) :: tuple()