%ignore "^#(.*)"; %token Comma "\,"; %token Value "[^\n\r\,]+"; %token Break "\r(\n?) | \n"; %start document; %% // with optional last break document : rows Break | rows | /* empty */ ; // each row seprated with one break // and optional last space rows : rows Break row | row ; // values separated by spaces row : row Comma column | column ; // allow empty columns column : Value | /* empty */ ;