Ответы на Ulearn

Практика «Поля в кавычках»

50 руб.

Скачайте проект TableParser

В этой серии задач вам нужно реализовать парсер полей. Парсером обычно называют алгоритм, который из текста делает набор объектов, представленных в этом тексте.

Итак, на вход нашего парсера подается строка текста. В результате выполнения серии этих задач у вас получится алгоритм, возвращающий список полей, извлечённых из текста по описанным ниже правилам, либо пустой список, если полей в исходном тексте не оказалось.

Проверить работу парсера можно запустив программу. Появится окно, в котором можно вводить разные входные строки и смотреть, на какие поля эти строки разбиваются.

Типы полей

Поля могут быть двух типов: простые и поля в кавычках. Для простоты понимания начало и конец поля будем выделять квадратным скобками [].

Простые поля

Простые поля не могут быть пустыми, не могут содержать пробелов и разделяются одним или несколькими пробелами.
Пример: в строке 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 вещи:

  1. Проинтерпретированное значение, соответствующее фрагменту. Например, значение фрагмента "a\"b" это три символа: a, символ кавычки и b, хотя сам фрагмент имеет длину 6 символов.
  2. Позицию фрагмента в строке.

Для этого удобно завести свой тип и хранить там эту информацию. Этот тип уже создан для вас — найдите и изучите в проекте класс Tokens. Фрагменты, выделяемые из текста часто называют токенами или лексемами. Мы дальше будем называть их токенами.

Иллюстрация поясняющая семантику свойств класса Tokens при анализе текста:

  • Position — номер символа в строке, с которого начинается запись токена.
  • Length — количество символов, которое занимает токен в строке (открывающие и закрывающие кавычки включительно).
  • Value — это проинтерпретированное значение токена. То есть «очищенное» от ненужных кавычек и слэшей.

Задача

В этой задаче реализуйте один вспомогательный метод ReadQuotedField, для чтения полей в кавычках. В следующей задаче вам нужно будет воспользоваться этим методом.

Метод ReadQuotedField принимает строку и позицию в строке. Гарантируется, что на стартовом индексе находится открывающая кавычка поля в кавычках. Метод должен обработать символы до следующей кавычки, если она есть (если нету, то до конца строки), и вернуть токен поля в кавычках. См. пример на схеме выше.

Проверить корректность работы можно запустив программу на выполнение. Но кроме ручного тестирования вам необходимо создать автоматические тесты в классе QuotedFieldTests в том же файле. Удобно создавать тесты, добавляя новые атрибуты TestCase (см. туториал по запуску тестов).

На проверку нужно отправлять файл, в котором есть и решение задачи и тесты.

Купить решение:

Ваш Email (на него будет отправлен ответ)

Продолжая, вы соглашаетесь с пользовательским соглашением

Возможны трудности с доставкой сообщений на Gmail