Ответ 1
Вам нужно больше разбить грамматику, используя больше "не-терминалов" (не уверен, что вы их называете в PEG):
start
= article animal stmt_list
article
= article:'a'? __ { return article; }
animal
= animal:('cat'/'dog') _ { return animal; }
stmt_list
= '(' _ exp:[a-zA-Z]+ _ ')' { return [ exp.join('') ]; }
// optional whitespace
_ = [ \t\r\n]*
// mandatory whitespace
__ = [ \t\r\n]+
Спасибо, что задали этот вопрос!
Edit:
Чтобы повысить удобочитаемость, у вас есть две постановки: _
и __