/
EvilBeaver
/
OneScript
Обзор
Документация
Войти
/
EvilBeaver
/
OneScript
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
v2.0.1
src/OneScript.Language/LexicalAnalysis/StringLexerState.cs
96 строк
3 KB
Mr-Rm
вынесена проверка границы; доп. функция; мелочи
21 дек 2025, 20:11
21 дек 2025, 20:11
8ea8b74
Код
Авторство
О чём код?
/*---------------------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v.2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ using System.Text; namespace OneScript.Language.LexicalAnalysis { public class StringLexerState : LexerState { private void SkipSpacesAndComments(SourceCodeIterator iterator) { while (true) { /* Пропускаем все пробелы и комментарии */ if (iterator.ReadNextChar() == '/') { if (!iterator.MoveNext()) throw CreateExceptionOnCurrentLine("Некорректный символ", iterator); if (iterator.CurrentSymbol != '/') throw CreateExceptionOnCurrentLine("Некорректный символ", iterator); do { if (!iterator.MoveNext()) break; } while (iterator.CurrentSymbol != '\n'); } else break; } } public override Lexem ReadNextLexem(SourceCodeIterator iterator) { StringBuilder contentBuilder = new StringBuilder(); while (iterator.MoveNext()) { var cs = iterator.CurrentSymbol; if (cs == SpecialChars.StringQuote) { if (iterator.MoveNext()) { if (iterator.CurrentSymbol == SpecialChars.StringQuote) { /* Двойная кавычка */ contentBuilder.Append('"'); continue; } /* Завершение строки */ SkipSpacesAndComments(iterator); if (iterator.CurrentSymbol == SpecialChars.StringQuote) { /* Сразу же началась новая строка */ contentBuilder.Append('\n'); continue; } } return new Lexem { Type = LexemType.StringLiteral, Content = contentBuilder.ToString() }; } if (cs == '\n') { iterator.MoveNext(); SkipSpacesAndComments(iterator); if (iterator.CurrentSymbol != '|') throw CreateExceptionOnCurrentLine("Некорректный строковый литерал", iterator); contentBuilder.Append('\n'); } else if (cs != '\r') contentBuilder.Append(cs); } throw CreateExceptionOnCurrentLine("Незавершённый строковый литерал", iterator); } } }