::= elements ::= ws? element ws? elements | ws? ε ::= string | list | symbol | integer | property-string string ::= <'"'> #'([^"\\]|\\.|\\\n)*' <'"'> property-string ::= <'#('> ws? string text-property* ws? <')'> text-property ::= ws? element ws? element ws? element list ::= <'('> elements dot-cdr? <')'> symbol ::= #'([^?#0-9 \n\s\f()\[\]"\'\\.]|\\.)([^ \n\s\f()\[\]"\'\\]|\\.)*' | #'\.([^ \n\s\f()\[\]"\'\\]|\\.)+' integer ::= #'[-+]?[0-9]+' <#'.'>? dot-cdr ::= <'.'> ws? element ::= ws? (string | property-string) ws? ::= <#'(\s| |\n)'>+