| identifier | → | Unicode identifier |
We try to be compatible with C++ literal syntax, and to accept a superset of valid C++ literals.
A string literal consists of a possibly empty sequence of string characters enclosed in double quotes:
| string‑literal | → |
encoding‑prefix? " schar* " |
| schar | → | [ ^ " \\ \n \r ] | escape |
| encoding‑prefix | → | u8 | u | U | L |
A string character may be an ordinary character that is not a double quote, a backslash, a newline or a carriage return, or it may be an escape sequence. A string literal may start with an optional encoding prefix.
A character literal may be a narrow character literal, a universal character literal or a wide character litera.
| character‑literal | → | narrow‑char‑literal | universal‑char‑literal | wide‑char‑literal |
| narrow‑char‑literal | → | ' cchar+ ' |
| universal‑char‑literal | → | (u | U) ' cchar+ ' |
| wide‑char‑literal | → | L ' cchar+ ' |
| cchar | → | [ ^ ' \\ \n \r ] | escape |
A narrow character literal consists of a non-empty sequence of symbols matching the cchar rule enclosed in single quotes. A cchar is either an ordinary character that is not a single quote, a backslash, a newline or a carriage return, or it may be an escape sequence. A universal character literal has a 'u' or 'U' prefix. A wide character literal has an 'L' prefix.
An escape sequence starts with the backslash character that is followed by a hexadecimal escape, a decimal escape, an octal escape, a UTF-16 escape, a UTF-32 escape, a C-escape, or any other single character.
| escape | → |
\
(
(x | X)
hex‑digit+ |
(d | D)
dec‑digit+ |
octal‑digit+ |
u hex4 |
U hex8 |
[
abfnrtv
] | 'any other character' ) |
| dec‑digit | → | [ 0 - 9 ] |
| hex‑digit | → | [ 0 - 9 | a - f | A - F ] |
| octal‑digit | → | [ 0 - 7 ] |
| hex4 | → | hex‑digit hex‑digit hex‑digit hex‑digit |
| hex8 | → | hex4 hex4 |
We have tried to define an escape sequence that is a superset of a valid C++ escape sequence, so it can be used in all contexts in SoulNG syntax files.
An integer literal can be an octal literal, a decimal literal, or a hexadecimal literal. It may have an optional integer suffix:
| integer‑literal | → | (octal‑literal | decimal‑literal | hex‑literal) integer‑suffix? |
| octal‑literal | → | 0 octal‑digit* |
| decimal‑literal | → | [ 1 - 9 ] dec‑digit* |
| hex‑literal | → | (0x | 0X) hex‑digit+ |
| integer‑suffix | → | unsigned‑suffix | long‑long‑suffix | long‑suffix |
| unsiged‑suffix | → | u | U |
| long‑long‑suffix | → | ll | LL |
| long‑suffix | → | l | L |
A floating-point literal may be a fractional floating-point literal or an exponential floating-point literal. It may have an optional floating-point suffix:
| floating‑literal | → | (fraction exponent? | dec‑digit+ exponent) floating‑suffix? |
| fraction | → | dec‑digit* . dec‑digit+ | dec‑digit+ . |
| exponent | → | (e | E) sign? dec‑digit+ |
| sign | → | + | - |
| floating‑suffix | → | f | F | l | L |
A file path consists of a non-empty sequence of characters enclosed in angle brackets. A character inside the angle brackets may be any other character than a newline or a right angle bracket.
| file‑path | → | < [^\n>]+ > |
An API specifier defines a macro symbol used for exporting generated classes and functions from a Windows DLL. See cmajor example in the examples/cmajor directory for an example use.
| api | → | api ( identifer ) |