basic scannerless recursive descent parsing