короче все в курсе про рандомно скидки Озона, сегодня купил, завтра товар на 500% дешевле(образно говоря)) Да, базара нет, можно отменить и купить дешевле. Но не суть. Меня короч в какой-то момент переклинило. Заходить по двадцать раз в день проверять, не подешевели ли носки. Чекнул чё есть на рынке... сторонние боты в телеге либо не работают,
либо просят подписку, либо показывают гостевые цены без учета Ozon Карты и регионального склада (ID).
В общем решил, а ху...и нам кабанам, пишем свой нативный трекер под Android на Kotlin, Jetpack Compose и локальном движке. Без серверов, без передачи данных третьим дядям(реже тетям), с жестким контролем всего происходящего.
К сожалению парсинг Озона через Jsoup/OkHttp в 2026 году ожидаемо шлет тебя на три буквы с кодом 403 Forbidden и бесконечным редиректом на капчу, пришлось поднять локальный headless-браузерный движок внутри прилож.
Что уже работает и радует душу:
1. Честные цены с Ozon Картой и скидкой ID: Приложение умеет подхватывать авторизацию Ozon ID. Никаких «средних цен по больнице» видит ровно ту цену, которую видите вы в своем профиле со своего домашнего ПВЗ.
2. Добавление в 1 клик через системный Share: Увидел товар в приложении Озона ➔ нажал «Поделиться» ➔ выбрал свой трекер ➔ выставил целевой прайс. Всё.
3. Разделение на три лагеря:
СЛЕДИМ то, что реально в наличии и пасется ботом;
ЗАКОНЧИЛСЯ товары, которые раскупили (бот продолжает тихо мониторить склад, и если продавец пополнил остатки ..прилетает Restock Alert);
АРХИВ ...купленное или отложенное барахло, чтобы не жрать ресурсы.
4. Умная сортировка и детекция падений: Если цена пошла вниз (даже на 50₽), товар моментально летит в топ списка с плашкой «🔥 Цена снизилась на X ₽».
5. Режим «ОРАТЬ» и Сирена: Обычные скидки шлют тихий пуш. Но если цена пробила выставленный таргет и телефон врубает полноэкранный Heads-up баннер и зацикленную сирену через аларм-менеджер, которая орет, пока ты не нажмешь «Купить». Проспать скидку физически невозможно.
6. Графики на Canvas: Написал нативный график истории цен прямо на Compose Canvas, с адаптацией под день/ночь и фирменный сине-розовый стиль Озона.
7. Живой логер в фоне: Фоновый воркер пишет логи с точностью до секунды, их можно экспортировать в .txt прямо в /Download.
Ну и там всякие другие плюшки...
И главное приложение уверенно живет в фоне на Xiaomi (HyperOS) и не умирает ночью в Doze Mode.
А теперь собственно боль (и почему я здесь)
Приложение сейчас на стадии активного бета-теста на реальном железе, и есть два момента, на которых мой инженерный дзен всё...
Проблемка1: Корзина Озона
Поштучно товары через «Поделиться» добавляются идеально за полторы секунды. Но добавлять 20 позиций по одной такое себе. У Озона есть функция «Поделиться корзиной» (cart?share=...), которая генерирует публичную ссылку. Казалось бы, епта. Но при попытке разобрать страницу корзины, этот франкенштейн на Nuxt 3 подмешивает в DOM-дерево подвал с лентами «Вы смотрели», «Возможно вам понравится» и еще 40 рекламных карточек с аналогичной версткой. В итоге вместо 2 товаров из корзины скрипт радостно пытается затрекать половину витрины озона.
Проблемка2: Периодический склероз сессии, раз в пару недель WebView решает, что он устал, и роняет сессионные куки авторизации. Цены при этом не ломаются, но превращаются обратно неавторизованные (без учета Ozon Банка), пока заново не откроешь профиль. В приложении просто тыкаешь в настройках на авторизацию и логинишься. Да, когда эту хрень заметил, я конечно сделал временную затычку в виде уведомления что "ау, залогиньтесь плиз снова", но все таки хочется как то убрать данное неудобство.
Внимание, вопрос к коллективному разуму местных гуру:
Господа фронтендеры, реверс-инженеры и просто бывалые воины парсинга:
1. Кто ковырял публичные корзины Озона (cart?share=...) на Nuxt...по какому самому надежному селектору или объекту в window можно уверенно изолировать реальные товары корзины от мусорных каруселей рекомендаций? Я пробовал по очевидным самым типа - 1 -(количество товаров), форма галочки, ну и другие элементы которые казалось бы только в корзине присутствуют, но при 2х товарах в корзине, удалось сократить парс до 6 товаров (из +-50)
2. Как держать живой вебвьюшную сессию без регулярных пинков?
Советы, идеи, конструктивная критика архитектуры и вобще в
комментах категорически приветствуются. Всем низких цен и стабильного рантайма!
# FIXME: Я не знаю, почему это работает. Не трогайте, иначе всё взорвется.
Вот такие холодильники отдают. Конкретно этот я не осилил :-(
Уже несколько лет я занимаюсь тем, что получаю на авито бесплатно различные вещи. Не надо думать, что бесплатно можно получить всякое барахло, так думают те, кто не использовал для таких целей специальные средства. Конечно если вы будете "время от времени" руками листая авито искать что-то действительно интересное (хоть бесплатно, хоть за деньги) вероятность чего-то действительно ценное найти минимальна. Я это уже понял давно, поэтому для поиска интересных объявлений использую самодельные программные средства.
Пример бесплатной отдачи
В самом начале (лет 5 назад) с авито еще можно было вытаскивать даже реальный телефон продавца. И моя программа парсинга авито это умела. На обычном сайте он шел в виде картинки, а вот на мобильной версии можно было получить цифрами. Правда для этого надо было очень постараться, залогиниться на авито (из программы, отправляя post и get запросы). потом уже также программно считывать объявления и вынимать телефон.
Также я парсил и юлу, там было гораздо меньше интересных отдач, но все таки тоже были.
Но потом авито вообще перестало выдавать реальные номера телефонов, можно было получить или фиктивный номер, или звонить/писать через само авито. Эта "новация" авито сильно поубавила пыл разработчиков всяких парсеров, т.к. поставило жирный крест на рассылках, сборах телефонов, прозвонах и т.п. Я же в телефонах особо не нуждался, т.к. чаще продавцы оставляли возможность только написать сообщение. Т.к. понимали, что отдавая какой-нибудь холодильник, их просто задолбают звонками всегда. И ночью и еще несколько дней. Не буду подробно описывать весь путь, который я прошел постоянно меняя способы и алгоритмы получения халявы, но наступил такой момент, когда я уже никак не мог _Программно_ открыть авито и получить оттуда данные с объявлениями. Раз, два выходило, потом хопа! Авито меня блокировало и на этом поиск халявы заканчивался. Единственно что меня как-то успокаивало, что видимо аналогичные проблемы есть и у моих конкурентов.
Какое-то время я использовал программу на питоне, которая открывала хром, там открывала нужную ссылку (типа бытовая техника бесплатно), а потом сохраняла выданные объявления в файл. И вот наконец этот метод тоже железно закрыли. Открыть авито стало возможно только руками. Запускаем браузер, открываем нужную страницу, смотрим и все. Я уже начал задумываться от сервоприводе, который бы тыкал по кнопкам и сам в автоматическом режиме искал халяву, но появилась идея поинтереснее. Я же программист и помню как давным давно еще в 90ых мне надо было написать программу для распознавания диаграмм с самописцев. И нет чтобы к прибору датчик подключить для снятия показаний, а именно подавай распознанные диаграммы. Это было в теплосети, там всякие графики давления в котлах, температуры, расхода газа и т.д. Я тогда знатно натрахался с этой задачей, вишенкой на торте была необходимость сканировать диаграммы и делать это программно. Т.е. оператор вставляет в планшетный сканер диаграмму и дальше все должно быть само. Т.е. моя программа должна была уметь отрыть окно драйвера сканера, выбрать там нужные параметры (типа 300 dpi, цветность) и программно нажать кнопку сканировать, потом программно сохранить полученный скан в jpeg (а на первых порах использовал pcx ;-))), закрыть драйвер сканера и дальше уже там обрабатывать изображение.
И вот именно то самое место где я искал окно, а в нем искал контролы и слал им сообщение типа WM_LBUTTONDOWN (нажата левая кнопка мыши) меня и вдохновило на новый способ.
Через некоторое время родилась новая программа sendkey. Она запускалась только через командную строку и принимала один аргумент - ссылку. Типа такого:
Т.е. строка запуска браузера, ожидание ответа авито, куда сохранить результат запроса, создавать файл с отладочной информацией. Логика работы такая. Запускаем программу sendkey.exe с аргументом ССЫЛКА. Программа запускает браузер с аргументом та же ссылка, браузер честно откывает авито (авито думает все хорошо, меня же браузером настоящим открыли, а не из питона или post запросом), ждет готовности браузера потом программно шлет в браузер сочетание клавиш "CTRL+S" т.е. сохранить страницу, затем моя программа ищет окно диалога сохранения файла, меняет в нем имя сохраняемого файла на мое заранее заданное имя, и программно нажимает кнопку "Сохранить". Затем через небольшую задержку и браузер программно закрывается. В итоге, мы имеем в нужной папке html файл со списком обявлений. Сортировка, фильтры, регион поиска, все это задается в ссылке. Затем в работу вступает 1с. На ней у меня написана конфигурация ("Запускалка") для анализа объявлений. Именно эта конфигурация с нужной периодичностью запускает вышеупомянутую программу, и потом разбирает ответ авито. Вычленяет объявления, накладывает фильтры, смотрит на попадание слов объявления в черный или белый списки. По необходимости рассылает клиентам то что нашли через мессенджер телеграмм.
Как показала практика такой режим работы не вызывает блокировки со стороны авито вообще! Все работает днями, неделями и месяцами. Так, например, недавно я стал сотрудничать с новыми клиентами. Они ищут на авито видеокарты. По всей России, за любые деньги, выискивают что-то приличное. Что под ремонт, что на перепродажу, что-то на запчасти. Был раньше телеграмм бот "Ловец видях", но видимо из-за постоянных блокировок авито сдулся. Моя же система пока еще работает.
Стоит заметить, что таким образом можно искать не только видеокарты и не только на авито. А, например, битые автомобили недорого под восстановление, или бесплатные стройматериалы, или антиквариат, да что угодно.
Чтобы вам был понятен маштаб халявы на авито, я приведу тут некоторые реальные отдачи, которые я получал за последнее время и что-то из нового.
Так самое интересное что было получено (что-то потом реализовано на том же авито)
- два токарных станка (1И611П и самодельный малогабаритный по металлу) оставил себе
- две деревянных бытовки (продал)
- котел на 65 КВт на дизеле с горелкой (продал)
- газовые баллоны без счета (пропан, кислород, углекислота и прочие технические газы) (продаю постепенно)
- немеряное число холодильников (в т.ч. торговые), газовые плиты, прочая бытовая техника
- бесперебойник на 30 КВа без аккумуляторов (продал)
- увлажнитель гигантский с wi-fi
Заменил сгоревший предохранитель и диодный мост
- компрессор на 8 атм (починил, заменив реле давления и использую)
- внешние блоки кондиционеров от мультисплит систем, кондеи в комплекте, отдельно внутренние блоки
- 4 зерновых кофемашины (3 починил, использую)
- платежные терминалы самообслуживания (восстановил, заменил в одном сенсорное стекло, сделал из них систему управления бильярдным залом)
Отремонтированные терминалы
- игровая приставка сони PS2
- лазерный станок с полем 40 на 40 см с ЧПУ и чиллер к нему на 5 КВт (запустил, резал фанеру и ламинат)
Вид объявления с отдачей лазерного станка
- строительные леса (ждут на даче своего часа)
- ледогенератор
- напольный принтер HP уровня предприятия на колесах размером с холодильник
Исправен, печатает
- моноблоки несколько штук
И вот такой отдали.
- биотуалет
- газовый настенный конвектор для обогрева больших помещений
- склад отрезных дисков по металлу (взял килограмм 100 новых в упаковках) (постепенно продаю)
Отрезные диски и их тьма.
А сколько было бытовой техники, компьютеров, деталей от них, всяких кабелей, стройматериалов, всякого железа, инструментов торговой техники я уже и не вспомню. У меня, например уже целая коллекция кувалд :-) Даже гиря есть на 32 кг бесплатная.
Каждый день в среднем отдают бесплатно по 5...8 холодильников и столько же стиральных машин. Частично рабочие или с дефектами. Но это все можно пустить на запчасти. Прикиньте, сколько всего реализуемого в старой ржавой стиралке: мозги, помпа, прессостат, аммортизаторы, датчики, кнопки, мотор, стекло, резиновый уплотнитель и еще может что. Этими запчастями можно потом нехило приторговывать. Хранить их в гараже, там же разбирать технику. А затраты на нее мизерные. Покупать ее не надо, только поехать и забрать.
Мне так однажды еще 1000 руб доплатили за то что я старую плиту увез, а новую подключил. А я же и старую еще почистил и продал потом.
Чищу как могу и обратно на авито
В среднем газовая плита уходит влёт за 4000 руб. Много кто их покупает для съемного жилья. Только ее надо отмыть и прочистить форсунки. Тут поможет канистра (полученная бесплатно) с бензином, куча тряпок (отдавали бесплатно постельное белье килограмм 100, что-то продал, что-то оставил себе на ветошь). Плюс компроссором продуть, есть насадка с длинным носиком (тоже бесплатно новую в блистере отдавали).
Торговые холодильники продаются от 8000 до 14000 руб. Правда они очень тяжелые.
Вот такие часто отдают даром. Некторые только помыть надо.
Приличные стиралки в рабочем состоянии я продавал от 5000 до 8000 руб.
Таким образом я создал свое направление в малом бизнесе.
- За аренду я не плачу, т.к. всю технику везу в гараж, там сортирую, разбираю и продаю. Разве что ежегодный взнос. Электричество в гараже бесплатное.
- Закупочные цены у меня нулевые - я ж ничего не покупаю. Только бензин и шоколадки на обмен.
- Зарплату я никому не плачу - купил прицеп, лебедку, телеги, разные приспособы и гружу все сам.
- Дополнительно получаю деньги с клиентов, которые ищут что-то свое через мою систему.
- При этом я повышаю свои навыки. Умею заправить холодильник или кондиционер фреоном, в т.ч. и автомобильный, могу починить микроволновку, обогреватели, бытовую электронику, стиралку. Обзавелся электро и газо-сваркой, пополнил запасы инструмента, часто отдают наборы инструментов дедушек после их смерти :-(. Замена щеток, предохранителей, выключателей, перетершихся кабелей покрывает где-то 60% всех ремонтов.
Буду рад, если изложенное кого-то заинтересует или вызовет желание заниматься аналогичным бизнесом!
Сегодня необычные сервисы, а помощники для LLM и ИИ-агентов, чтобы они анализировали ваши файлы без галлюцинаций и ошибок. Обычные ИИ плохо справляются с PDF и картиками: путают колонки, не понимают таблицы и заголовки. Следующие инструменты читают документы как человек — учитывают структуру, формат, сноски, даже логику. Эти же инструменты превращают документ в качественно распознанный и разбитый по структуре текст, который уже можно загрузить в Большие Языковые модели (LLM) для дальнейшего взаимодействия без галлюцинаций. Этакие парсеры документов.
Проще, зачем они нужны? Для создания:
• систем поиска по внутренним документам (вопрос-ответ по внутренним документам)
• интеллектуального анализа юридических, медицинских, технических файлов
• создания базы знаний из PDF/HTML/DOCX, изображений и тд
Вот два таких сервиса:
1) LlamaParse
LlamaParse — умный парсер документов и файлов от LlamaIndex. Очень круто извлекает сложные таблицы. Можно интегрировать через API в приложения. Бесплатно можно обработать до 1 000 страниц в день.
LlamaParse поддерживает:
• Документы: PDF, DOC, DOCX, RTF, TXT, EPUB, XML, HTML, Pages, Keynote и др.
Например: Вы загружаете инструкцию по продукту, договор или научную статью → LlamaParse анализирует структуру и разбивает по логике → вы используете это в GPT-боте, который теперь может грамотно отвечать на вопросы по документу.
Больше проверенной информации и пользы в моемтелеграм канале.
Contextual - тоже самое, вы загружаете документ со сложными таблицами, рисунками и диаграммами, сервис так же преобразовывает это в текстовый файл с метаданными, понятный для любой LLM. Бесплатно можно обработать до 500 страниц.
Вы проснулись в теле риэлтора. Опять. В той же кровати. В той же пижаме. С тем же пейзажем за окном. И с той же небритой физиономией в зеркале.
Впереди – 2,5 часа адского ctrl+с, ctrl+v.
Каждое утро у вас перед глазами сайты застройщиков. Вы вручную выдёргиваете их объявления и заливаете на Авито. Первое, второе, третье объявление... Коллега с дёргающимся глазом пьёт третью кружку растворимого кофе, от запаха которого вас уже тошнит.
Вы вручную проверяете, что уже продано. Убираете эти объявления. И так каждый день.
Акт 2. «Я не чёртов ксерокс»
Вы задумываетесь о смысле своей работы и хватаетесь за калькулятор:
2,5 часа драгоценного времени каждый день
55 часов в месяц – целая неделя работы на адское копирование
82 рабочих дня в году вы просто тратите на рутину
«Я не секретарь и не чёртов ксерокс. Мне платят за сделки, а не за копирование. Что-то нужно менять», – внутренний голос заставляет вас гуглить, как это исправить.
Читайте также наш кейс о том, как быстро проверить нишу начинающему бизнесмену с помощью парсинга и выйти в топ на Авито за месяц.
Акт 3. Спасение
Вы узнаёте о парсинге:
Зачем вручную мониторить сайты, если можно автоматизировать сбор данных? Зачем тратить часы на публикации, если их можно выгружать одним кликом?
Луч надежды впереди. Вы договариваетесь, чтобы всё рутинное копирование было автоматизировано.
И всего через несколько дней вы спасены:
Парсер собирает информацию с 6 сайтов застройщиков
Все данные автоматически собираются в Google-таблицу
Объявления сами публикуются на Авито, а проданные квартиры исчезают из публикаций
Кажется, и кофе коллеги уже не такой вонючий... И окно закрыть можно – выходить резко не захочется.
Этот кейс – реальный в Parsing Master. Мы помогли владельцу агентства недвижимости автоматизировать всю рутину с помощью парсинга и выдернуть сотрудников из дня сурка)
Для тех кто спешит увидеть код вот (С#) или псевдокод вот, кому нужна ясность в них читаем далее.
В привычной нами записи выражения, знак операции (далее оператор) записываются между значениями (далее операндами): а + б Такая форма называется инфиксной (калька - вкрепной). Так же используется префиксная (докрепная) запись, когда операторы пишутся до операндов: + а б и постфиксная (закрепная) запись, когда операторы пишутся за операндами: а б +
Ниже показаны ещё примеры:
Префиксная и постфиксная запись также именуются прямая и обратная польская нотация (далее ОПН), в честь её изобретателя польского логика Яна Лукасевича. Отличительная их черта, то что в них не используются скобки для обособления вычисления.
Получение ОПН из инфиксной записи
Используем рекурсивный спуск по рассмотренной нами грамматике, где в качестве чисел целые без знака:
Грамматика с унарным минусом и плюсом: Г: В -> ДС С -> ε | +ДС | -ДС Д -> РП | -Д | +Д П -> ε | *РП | /РП Р -> ч | (В)
Звенья цепочки ОПН опишем набором трёх типов: 1. Операнд - целые числа. 2. Одноместный оператор - однооп, это унарный минус и плюс. 3. Двуместный оператор - двуоп, это минус, плюс, умножить, делить.
Ниже представлено полное описание звена ОПН:
Соберём звенья в список, который будет представлять нашу ОПН. Для этого отметим 3 действия на отделах рисунка порядка: Д1 - Создать хрон. Переменная хранящая звено до момента добавления в список. Д2 - Запомнить. Помещаем встреченное звено в хрон. Д3 - Добавить. Записываем в список ОПН.
Ниже показаны отделы и процедуры со встроенными действиями в разбор:
1/3
Так мы добавляем в первую очередь операнды, затем операторы в порядке их приоритетов. Всмотритесь в процедуру «Дополнениее». В качестве хрона используется стог (англ. stack), так как запоминаются несколько знаков сразу, их следует вспомнить в обратном порядке.
Осмыслим следующее: рекурсивный разборщик выступает теперь не только в качестве распознавателя, но и переводчика. Ведь мы получили цепочку принадлежащую другому формальному языку, который можно описать так:
Грамматика обратной польской нотации: Г:В -> ч | П`П П`-> чПО П -> ВОП | ε
где:
В - ВЫРАЖЕНИЕ О - ОПЕРАТОР П - ПРАВОЕ_ПОДВЫРАЖЕНИЕ П`- ПОДВЫРАЖЕНИЕ ч - ЧИСЛО
Остановитесь на минутку, осмыслите.
Вычисление ОПН
Ниже изображена схема устройства вычисления ОПН - Стог-машина (Stack machine), а на следующем её описание. Для примера использована ОПН:
1 2 3 * + 4 -
Которая получена из инфиксной записи:
1 + 2 * 3 - 4
1/2
Стог-машина состоит из:
Стога - в котором хранятся промежуточные значения.
Набора двухместных и одноместных операций.
Движка - который читает ОПН, управляет стогом и обращается к набору операций.
ОПН обладает свойством: действия применяются последовательно при её чтении, на чём и основана работа стог-машины:
Если звено операнд, то кладём число в стог.
Если звено однооп, снимаем верхнее число обрабатываем, итог кладём в стог.
Если звено двуоп, снимаем два верхних числа и применяем операцию. Причём первое значение операции - второе верхнее, а второе - первое верхнее. Итог кладём в стог.
По окончанию чтения ОПН, итог вычисления оказывается наднестога, одним.
В заключении
Не стоит думать, что рассмотренный способ единственный для получения ОПН. Есть так же алгоритм Дейкстры перевода выражения в ОПН, но я не знаю стоит ли его разобрать или сразу перейти к обсуждению включения действий в «Провидца», ранее нами рассматриваемого.
На прошлом уроке мы создали табель разбора для грамматики:
Г: В → ДС С → +ДС | ε Д → РП П → *РП | ε Р → ч | (В)
Давайте этот табель поместим в общее представление разборщика КС-языков в начальном состоянии, который назовём «Провидец»:
Я надеюсь вы повторили статью, которая указана выше? Да? Замечательно. Мы видим контуром обведено внутренне устройство провидца, он состоит из: 1. Табеляразбора, в котором ранее пустые ячейки помечены словом «Ошибка». Это значит, что данная пара конечного и неконечного приводит к ошибке. 2. Стога в который вложен # - правый ограничитель потока, который является подом (далее будем говорить просто грань, имея в виду грань строки). А так же вложен стартовый неконечный символ В, что говорит нам, что разбор является нисходящим. 3. Движка который читает принимаемое выражение и делает вывод. В ходе разбора он управляет стог-памятью, обращаясь к табелю для принятия решения, какую цепь поместить следующей взаменверхнего неконечного. Если встречается продукция вида П →ε или конечныйсимвол, то просто снимаем символ с верха. Если на верху оказывается символ неравнозначный рассматриваемому или мы ненаходим в табеле продукцию сообщаем об ошибке. Останавливается когда верх будет равен грани.
Работа провидца напоминает повторение левостороннего вывода рассматриваемого выражения. Рассмотрим выражение «ч+ч*ч»: В => ДС => РПС => чПС => чС => ч+ДС => ч+РПС => ч+чПС => ч+ч*РПС => ч+ч*чПС => ч+ч*чС => ч+ч*ч
Ниже показана работа совершённая движком, для распознавания этого выражения:
Так как в табеле однозначно определенна применяемая продукция, то мы знаем, что может нас ожидать впереди, поэтому мы и назвали разборщика провидцем. Ниже приложен его псевдокод. Здесь и здесь, вы можете посмотреть полный псевдокод и реализацию на С# от получения табеля, до разбора выражения.
1/2
В следующей статье мы рассмотрим включения действий в рекурсивный спуск и немного подытожим цикл статей. Подписывайтесь, чтобы не пропустить.
Перед тем как читать изложение, ознакомьтесь с двумя прошлыми статьями и определением, что такое разбор, в этом порядке: раз, два, три. Прочли? Замечательно! В противном случае вы ничего не поймёте. Приступим.
Левая и правая рекурсия правил вывода.
Пусть у нас есть некоторая цепочка α - состоящая из конечных и неконечных символов, тогда если при выводе некоторого неконечного А, через один и более вывод мы приходим к виду А => … => Aα, где А находится слева от цепочки α, говорят что такая грамматика содержит левую рекурсию, и соответственно при А => … => αА, где А справа от α, правую рекурсию.
О правой рекурсии уже упоминалось, в теме «Рисунок порядка КС-языка», она позволяет легко свести рекурсию к циклу. При построении рекурсивного спуска требуются праворекурсивные грамматики, в противном случае возможна бесконечная рекурсию, затем переполнения стэка (стога) вызовов, как мы любим.
Леворекурсивная грамматика всегда может быть преобразована в эквивалентную праворекурсивную.
Направляющие символы, маяки.
Маяки это решающие в определении пути разбора, на одну ветвь может приходится множество направляющих символов. Это множество состоит из конечных символов и очень важно чтобы множество маяков одной ветви, не пересекалось со множеством другой ветви.
Перед - множество конечных направляющих символов.
LL-грамматика
LL(k)-грамматикой называется КС-грамматика, в которой выбор правила в ходе левостороннего разбора однозначно определяется не более чем k очередным символом входной цепочки, считываемой слевана право.
Своё название она получила из двух слова left left. что имеется ввиду левосторонее чтение, левостороний разбор.
Самой удобной для распознавания является грамматика которая позваляет опередлить правило по первому прочтённому символу, то есть LL(1)-грамматика.
Под рекурсивным спуском обычно подразумевают, предопределённый способ нисходящего разбора КС-языков, порождаемых ЛЛ(1)-грамматиками.
ЛЛ-грамматика праворекурсивна и множества направляющих символов в её правилах не пересекаются, что соответствует вышеуказанным требованиям.
Заключение
Эти правила касаются только лишь для метода рекурсивного спуска и ЛЛ-разбора по табелю (табличный анализатор), который рассмотрим в следующих статьях.