#matching(this) cvsFile ::= [!#empty #continue cvsRecord]*; cvsRecord ::= ->[['\r']? '\n' | #empty] |> csvStringList; csvStringList ::= #ignore(blanks) rawString [',' #continue rawString]*; rawString ::= [rawField]?; rawField ::= simpleField | => std::string sString; quotedField:sString => std::cout << "string = " << sString << std::endl; ; simpleField ::= [~[',' | '"']]+; quotedField ::= '"' #continue escapedField '"'; escapedField ::= ['"' '"' | ~'"']*; /* // remove the multi-line comment to test the BNF grammar of Julian Bucknal #overload escapedField ::= subField ['"' '"' escapedField]?; subField ::= [~'"']+; */