The FSA for scanning a C character. Note that this FSA doesn't scan the surrounding quotes. It is used in both FSACharConst and FSAString. There are multiple ways to represent a character: * A normal character : any character other than \\ \n or [quote] Note that [quote] might be \' or \" depending on the context. For example, inside a String, single quote are allowed, which means that the following code is legal: Char *str = "single quote here: ' see that?"; However, if we need a double quote inside a String, we have to use an escape character, like this: Char *str = "double quote needs to be escaped: \" "; Inside a Char, double quotes are allowed while single quotes need to be escaped. Char double_quote = '"'; // allowed Char single_quote = '\''; // needs to be escaped * An escape character : \a \b \f \n \r \t \v \' \" \\ \? Note that even though \' and \" might not needs to be escaped, you can always use them as escaped. If you escape a character not listed above, the behavior is undefined in the standard. I'll just assume you need the unescaped character. For example, if you typed '\c', then I'll just treat it as 'c'. * An octal number after a backslash. For example : \123. * A hexadecimal number after a backslash and an 'x' or 'X'. FOr example : \xFF.