/// <summary> /// Генерация токена распознанной лексемы. /// </summary> /// <returns>Токен распознанной лексемы.</returns> Token GenerateToken() { switch (State) { case States.Const: { Constants.Add(Buffer); return(Constants.GetToken(Buffer)); } case States.Id: { if (KeyWords.Contains(Buffer)) { return(KeyWords.GetToken(Buffer)); } else { Identifiers.Add(Buffer); return(Identifiers.GetToken(Buffer)); } } case States.Op1: case States.Op2: { return(Operations.GetToken(Buffer)); } case States.Final: { return(Delimiters.GetToken(Buffer)); } default: return(null); } }
/// <summary> /// Обработка очередного символа. /// </summary> /// <param name="C">Обрабатываемый символ.</param> public void ProcessSymbol(char C) { string CStr = Char.ToLower(C).ToString(); switch (State) { case States.Start: { Buffer = "" + C; if (Digits.Contains(CStr)) { State = States.Const; } else if (Letters.Contains(CStr)) { State = States.Id; } else if (Operations.Contains(CStr)) { State = States.Op1; } else if (C == '/') { State = States.Slash; } else if (Delimiters.Contains(CStr)) { State = States.Final; CurrentToken = GenerateToken(); } else if (Char.IsWhiteSpace(C)) { State = States.Final; CurrentToken = null; } else { throw new Exception("Недопустимый символ"); } } break; case States.Const: { if (Digits.Contains(CStr)) { Buffer += C; } else if (Delimiters.Contains(CStr) || Char.IsWhiteSpace(C) || Operations.Contains(CStr)) { CurrentToken = GenerateToken(); StepBack = true; State = States.Final; } else { throw new Exception("Недопустимый символ в константе"); } } break; case States.Id: { if (Letters.Contains(CStr) || Digits.Contains(CStr)) { Buffer += C; } else if (Delimiters.Contains(CStr) || Char.IsWhiteSpace(C) || Operations.Contains(CStr)) { CurrentToken = GenerateToken(); StepBack = true; State = States.Final; } else { throw new Exception("Недопустимый символ в идентификаторе"); } } break; case States.Op1: { if (C == '=') { Buffer += C; State = States.Op2; } else if (Delimiters.Contains(CStr) || Char.IsWhiteSpace(C) || Letters.Contains(CStr) || Digits.Contains(CStr)) { CurrentToken = GenerateToken(); StepBack = true; State = States.Final; } else { throw new Exception("Недопустимый символ после знака операции"); } } break; case States.Op2: { if (Delimiters.Contains(CStr) || Char.IsWhiteSpace(C) || Letters.Contains(CStr) || Digits.Contains(CStr)) { CurrentToken = GenerateToken(); StepBack = true; State = States.Final; } else { throw new Exception("Недопустимый символ после знака операции"); } } break; case States.Slash: { if (C == '/') { State = States.LineComm; } else if (C == '*') { State = States.BlockComm; } else { throw new Exception("Ошибка в комментарии"); } } break; case States.BlockComm: { if (C == '*') { State = States.BlockCommEnd; } } break; case States.BlockCommEnd: { if (C == '/') { State = States.Final; } else { State = States.BlockComm; } } break; } }