Практика «Поля в кавычках»
В этой серии задач вам нужно реализовать парсер полей. Парсером обычно называют алгоритм, который из текста делает набор объектов, представленных в этом тексте.
Итак, на вход нашего парсера подается строка текста. В результате выполнения серии этих задач у вас получится алгоритм, возвращающий список полей, извлечённых из текста по описанным ниже правилам, либо пустой список, если полей в исходном тексте не оказалось.
Проверить работу парсера можно запустив программу. Появится окно, в котором можно вводить разные входные строки и смотреть, на какие поля эти строки разбиваются.
Типы полей
Поля могут быть двух типов: простые и поля в кавычках. Для простоты понимания начало и конец поля будем выделять квадратным скобками []
.
Простые поля
Простые поля не могут быть пустыми, не могут содержать пробелов и разделяются одним или несколькими пробелами.
Пример: в строке a
- одно простое поле [a]
, в строке ab cd
- два простых поля разделенных пробелом [ab]
и [cd]
.
Поля в кавычках
У таких полей начало и конец ограничивается кавычками. Кавычки могут быть двух типов: двойными "
и одинарными '
.
Кавычки разных типов могут быть вложенными. То есть строка "a 'b' 'c' d" '"1" "2" "3"'
содержит два поля [a 'b' 'c' d]
и ["1" "2" "3"]
.
Вложенные кавычки считаются элементами поля.
Могут содержать пробелы и быть пустыми. То есть строка '' "bcd ef" 'x y'
содержит три поля пустое поле []
, [bcd ef]
и
[x y]
.
Поля, заключенные в кавычки, могут не отделяться от других полей пробелами. То есть строка a"b c d e"f
содержит 3 поля [a]
,[b c d e]
и
[f]
.
Кавычки в конце строки можно не закрывать. Если в строке отсутствует последняя парная закрывающая кавычка, считать, что соответствующее поле
заканчивается в конце строки. То есть строка abc "def g h
содержит два поля [abc]
и [def g h]
.
Поле внутри кавычек может содержать символы кавычек, экранированные символом \
(другими словами пара символов \"
интерпретируется как
символ кавычки, являющийся частью поля.
Символ \
также может быть экранирован самим же собой.
То есть строка "a \"c\""
содержит одно поле [a "c"]
, а строка "\\" b
— два поля [\]
и [b]
.
В простых полях символ \
не считается экранирующим символом, поэтому строка \\
— это одно поле из двух слэшей [\\]
, а \"a b\"
— это два
поля [\]
и [a b"]
Игнорируйте пробелы в начале или в конце строки, если они не входят в поле.
Гарантируется, что в полях в кавычках не используется символ \
в единственном экземпляре. То есть за ним обязательно следует, какой-то
экранируемый символ. Например: \\
, \"
, \'
и т.д. Не может быть "a\ b"
или "a \"
.
Концепция токена
При решении задач разбора текста, например, вычленении из строки фрагментов, приходится отслеживать 2 вещи:
-
Проинтерпретированное значение, соответствующее фрагменту. Например, значение фрагмента
"a\"b"
это три символа:a
, символ кавычки иb
, хотя сам фрагмент имеет длину 6 символов. - Позицию фрагмента в строке.
Для этого удобно завести свой тип и хранить там эту информацию.
Этот тип уже создан для вас — найдите и изучите в проекте класс Tokens
.
Фрагменты, выделяемые из текста часто называют токенами или лексемами. Мы дальше будем называть их токенами.
Иллюстрация поясняющая семантику свойств класса Tokens при анализе текста:
- Position — номер символа в строке, с которого начинается запись токена.
- Length — количество символов, которое занимает токен в строке (открывающие и закрывающие кавычки включительно).
- Value — это проинтерпретированное значение токена. То есть «очищенное» от ненужных кавычек и слэшей.
Задача
В этой задаче реализуйте один вспомогательный метод ReadQuotedField, для чтения полей в кавычках. В следующей задаче вам нужно будет воспользоваться этим методом.
Метод ReadQuotedField принимает строку и позицию в строке. Гарантируется, что на стартовом индексе находится открывающая кавычка поля в кавычках. Метод должен обработать символы до следующей кавычки, если она есть (если нету, то до конца строки), и вернуть токен поля в кавычках. См. пример на схеме выше.
Проверить корректность работы можно запустив программу на выполнение. Но кроме ручного тестирования вам необходимо создать автоматические тесты в классе QuotedFieldTests в том же файле. Удобно создавать тесты, добавляя новые атрибуты TestCase (см. туториал по запуску тестов).
На проверку нужно отправлять файл, в котором есть и решение задачи и тесты.
Купить решение:
Ваш Email (на него будет отправлен ответ)
Продолжая, вы соглашаетесь с пользовательским соглашением
Возможны трудности с доставкой сообщений на Gmail
Практика, практика и еще раз практика!
Войдите или зарегистрируйтесь, чтобы отвечать на тесты и решать задачи.