ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » обработка текста » "Развидение" и инвариант


"Развидение" и инвариант

Сообщений 1 страница 5 из 5

1

Иногда нужно возвращать во входной поток символы, чтобы потом считать их снова. Если сделать функцию помещения символа в буфер, то это ломает логику считывания. Например символ может быть помещён не тот, который там был изначально. А если вместо возвращения символа в буфер делать откат указателей, то может оказаться, что нужно в буфере вернуться к предыдущему участку файла, при этом файл может не уметь позиционироваться назад (например если это pipe в консоли).

И трудности с возвратом символа ломают логику позиционирования во входном файле (счётчики строка/столбец для текстового редактора).
Я думаю - может ли переход от двухбуферного считывания к трёхбуферному решить эту проблему?
Один буфер считается текущим, один считается свободным для считывания, а третий - хранит предыдущие данные, чтобы можно было к ним вернуться во время "развидения".

Про "двухпольную систему севооборота" написано в википедии ( и вообще много где -
[html]
<a href="https://en.wikipedia.org/wiki/Circular_buffer">https://en.wikipedia.org/wiki/Circular_buffer</a>
<br />
<a href="http://ecomputernotes.com/compiler-design/input-buffering">http://ecomputernotes.com/compiler-design/input-buffering</a>[/html] ), а про "трёхпольную" я ещё не встречал.

Можно ли сюда призвать концепцию транзакций (в общекомпьютерном смысле, а не в смысле СУБД)?
В каких случаях вообще мы можем отбросить (выгрузить) уже прочитанную часть файла, если полное дерево разбора ещё не построено?

Отредактировано Лис (2019-04-04 13:35:15)

0

2

Иногда нужно возвращать во входной поток символы, чтобы потом считать их снова.

Это проблема формата данных, алгоритма обработки и выч. возможностей.

при этом файл может не уметь позиционироваться назад

Это проблема выбора носителя памяти и соглашений передачи данных.

И трудности с возвратом символа ломают логику позиционирования во входном файле (счётчики строка/столбец для текстового редактора).

Это проблема текстового формата. На уровне лекс. разбора этих понятий обычно нет, только в совсем древних языках.

В каких случаях вообще мы можем отбросить (выгрузить) уже прочитанную часть файла, если полное дерево разбора ещё не построено?

Отбрасываемая часть определяется исходя из грамматики языка. Можно выбрать однопроходимый - размер буфера может быть небольшим.

Можно ли сюда призвать концепцию транзакций (в общекомпьютерном смысле, а не в смысле СУБД)?

Но файлы используют концепцию проводимых действий из теории БД, концепция итак одна, ФС - частный случай БД.
Пока размеры позволяют загружать их целиком в оперативную память - нет никаких сложностей с файлами как единицами чтения.

Отредактировано MihalNik (2019-04-04 14:38:55)

0

3

MihalNik написал(а):

загружать их целиком в оперативную память

Для этого ещё нужно несколько системных вызовов изучить - либо для memory mapped files (mmf), либо просто для запрашивания памяти у системы.

И mmf не будут (в чудесном линуксе) нормально работать с пайпами (я тут уже где-то такую тему создавал)

Отредактировано Лис (2019-04-04 15:05:23)

0

4

Если цифра 1 в LL(1) и LR(1) означает количество символов, требуемых для просмотра вперёд при разборе теста по заданной грамматике, тогда третье "поле" поместится в "комбаине".

Отредактировано atzx (2019-04-04 23:30:25)

0

5

Символы в грамматике, это не те символы, которые в EGC в Unicode. В грамматике символом может быть например "строка", произвольной длины.

0


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » обработка текста » "Развидение" и инвариант