whitespace:ws = [ \b\f\r\t\v]; comment-line:alias = "#" [^\n]*; comment = comment-line ("\n" comment-line)*; quoted:alias:nows = "\"" ([^\\"] | "\\" .)* "\""; word:alias:nows = ([^\\"\n=#.\[\] \b\f\r\t\v] | "\\" .)+; symbol = word+ | quoted; key-form:alias = symbol | symbol ("." symbol)+; key = key-form; group-key-form:alias = "[" key-form "]"; group-key = (comment "\n")? group-key-form | group-key-form; value-chars:alias:nows = ([^\\"\n=# \b\f\r\t\v] | "\\" .)+; value = value-chars+ | quoted; key-val = (comment "\n")? (key | key? "=" value?) comment-line?; entry:alias = group-key | key-val; doc:root = (entry | comment-line | "\n")*;