Код:
public static class ConstCharChecker {
public enum ResultType {
ErrorWritingChar, UnknownEscapeSequence, Success
}
public class Result {
public ResultType Type;
public String UnknownEscapeSequence;
}
public static Result Check(ConstChar chr) {
return Check(ref chr.Value, chr.WriteForm);
}
public static Result Check(ref String value, ConstCharWriteForm writeForm) {
switch(writeForm) {
case ConstCharWriteForm.Number:
return new Result{
Type = ConstNumberChecker.Check(ref value, NumeralSystem.Decimal, removeLeftZeros:true) ?
ResultType.Success : ResultType.ErrorWritingChar,
UnknownEscapeSequence = ""
};
case ConstCharWriteForm.Char:
switch(value.Length) {
case 1:
return new Result {
Type = (value[0]==SPECIAL_CHARS.PREFIX) ? ResultType.ErrorWritingChar : ResultType.Success,
UnknownEscapeSequence = ""
};
case 2:
if(value[0] == SPECIAL_CHARS.PREFIX) {
var escapeSequenceResult = EscapeSequenceChecker.Check(value);
return new Result {
Type = (escapeSequenceResult.Success) ? ResultType.Success : ResultType.UnknownEscapeSequence,
UnknownEscapeSequence = escapeSequenceResult.UnknownEscapeSequence
};
}
goto FAIL;
default:
goto FAIL;
}
}
FAIL:
return new Result {
Type = ResultType.ErrorWritingChar,
UnknownEscapeSequence = ""
};
}
}
Проверка записи символа (содержимое кавычек).
У символа есть 2 формы записи: числовая ('1055', '1054'...) и символьная ('x','z','\n').
Если числовая - проверяется как число, если символьная, то проверяется
как упр. последовательность (длина = 2) и как просто символ (длина = 1).
Иная длина - ошибка.