EBNF
TextBlock ::= ( ~'{' | ''! '{' )*
LiteralBlock ::= '{' 'literal' '}' Graphic * '{' '/literal' '}'
DelimiterBlock :== '{ldelim}' | '{rdelim}'
::= '//' Graphic * ( EOL | '}' )
| '/*' Graphic * '*/'
Graphic ::= Digit | Letter | Blank | Operators | Assignment | CombinedAssignment | RemainingCharSet
EOL ::= end-of-line
EOF ::= end-of-file
Blank ::= Tab | Space
NewLine ::= 'n'
Space ::= ' '
Tab ::= 't'
Letter ::= 'a' ... 'z' | 'A' ... 'Z'
Hexdigit ::= '0' .. '9' | 'A' .. 'F'
Octdigit ::= '0' .. '8'
NonZeroDigit ::= '1' .. '9'
Digit ::= '0' | NonZeroDigit
Assignment ::= '='
CombinedAssignment ::= '+=' | '-=' | '*=' | '/=' | '%=' | '.='
Operators ::= BinaryOperator | UnaryOperator | '++' | '--'
BinaryOperator ::= ArithmeticOperator | ComparisonOperator | BooleanOperator | StringOperator
ArithmeticOperator ::= '+' | '-' | '*' | '/' | '%'
ComparisonOperator ::= '==' | '===' | '!=' | '!==' | '<' | '<=' | '>' | '>='
BooleanOperator ::= '&&' | '||'
StringOperator ::= '.'
UnaryOperator ::= '+' | '-' | '!'
RemainingCharSet ::= '.' | ':' | ';' | ',' | '~' | '(' | ')' | '[' | ']' | '{' | '}' | '_' | '|' | "'" | '"' | '`' | '#' | '$' | '@'