tells RecDescent what to skip before trying each terminal. Normally that's any optional whitespace matched by the pattern C. But, if newlines (which would normally be skipped by the above pattern) are significant in your syntax, then you need to change the skipping pattern so that RecDescent doesn't skip newlines. And then match the newlines explicitly. For example: program : # Ignore non-newline whitespace statement(s) statement : command arg(s) "\n" command: /\w+/ args : /\d+/ | alphanum alphanum : /[A-Za-z0-9/