LINUX.ORG.RU

yacc (pre-bison) парсер в bash-скрипт. Реализация jq на bash

 , ,


0

3

Иногда возникает проблема написать небольшой умный скрипт, понимающий некую встроенную грамматику, то есть с миниязыком внутрях. Изначально я написал минимальную реализацию jq на bash. Но чем больше добавлялось туда «умности», тем труднее приходилось реализовывать рекурсивный разбор подвыражений. Это так надоело, что сподвигло написать вначале компилятор LARL(1) yacc (pre-bison) для генерации bash-скрипта, а потом как по маслу получился весьма похожий на оригинал и хороший проверочный код для yacc_bash.c мини-jq на bash.

Статья полностью:

>>> Подробности

★★★★

Проверено: Shaman007 ()

python лучше как скриптовый язык: 1. поддержка unit-тестов 2. простой синтаксис 3. встроенная документация 4. поддерживает оптимизацию и т.д. и т.п.

xor2003 ()

Чем не устроил python?

Сам лично писал на python движок с динамическими подключаемыми «шаблонами», которые оформлены опять же как python скрипты. Делается не сложно.

Kroz ★★★★★ ()
Ответ на: комментарий от Zsh_1670

У меня все нормально открывается

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

vodz ★★★★ ()
Ответ на: комментарий от vodz

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

Теперь понятно. Спасибо за ответ. Удачи с проектом!

Zsh_1670 ()
Ответ на: комментарий от RazrFalcon

2.5KLOC сишки чтобы генерировать лексер на bash?

Все слова понятны, но в сумме ничего не значат. На C написан не лексер, а yacc - «еще один компилятор компиляторов», где lex - всего лишь малюсенькая и простая его часть.

У вас передоз?

По себе судим?

Что мешало взять python + peg?

Вы хотя бы введение прочли? Там же в в самом начале написан этот ответ.

vodz ★★★★ ()
Ответ на: комментарий от anonymous

Запускать парсерогенераторы на роутере?

Да, запросто. Это исходник 86 года, который прекрасно работал на машинах с 64к памяти. Сейчас оно ну 256 сжирает с учетверенной разрядностью. Не хотите сравнить с имеющимися там всякими lua?

vodz ★★★★ ()
Ответ на: комментарий от prizident

у openwrt такое есть

Да, я видел. Это json_lib с С на dash с миллионом eval. Работать с json методом json_create/json_set_var и т д удобно только когда этот скрипт генерит парсер :) А по человечьи удобнее юзать jq. Так что круг замкнулся.

vodz ★★★★ ()
Ответ на: комментарий от dekar

Не знаю, как у тебя, а у меня в достаточно старой прошивке 2.7.14 и 3.6.0. Если у тебя шел в роутере, наверняка это сторонняя прошивка типа OpenWrt. Вот и ставь оттуда питон.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Если именно закат вручную, это уже не так интересно.

Ну можно же в сырцы bash-а посмотреть. Когда я там смотрел, то увидел два небольших bison-файлов и море C-шной обвески к этому. Я так думаю это потому что каждый символ в bash что-то до значит и делать парсер с противоречивой многовперёд-читающей грамматикой на строгом парсере труднее. А тем более и интерактивность, и система отладки, фоновые процессы...

vodz ★★★★ ()
Ответ на: комментарий от RazrFalcon

Если я правильно помню, ТС работает с системами на Itanium, наверное, под HP-UX.

Думаю, ему иногда очень хочется что-нибудь запустить прямо на серверах на продакшене. Например, чтобы обработать какие-то особые логи. Но он не может установить на целевой системе компилятор, чтобы собрать программы на сях, потому что нельзя по правилам. Но на системах есть Bash, поэтому он и делает всё на нём. Кросс-компилятор для целевой системы получить — целая эпопея.

i-rinat ★★★★★ ()
Ответ на: комментарий от Anakros

Собери jq из сорцов для своего роутера. Всяко меньше телодвижений, чем связываться с лапшой на баше.

jq тут как пример, что результат - работоспособен. В первом же предложении статьи объяснено, что бывает, когда у вас получается свой миниязык. И что вы будете собирать?

vodz ★★★★ ()
Ответ на: комментарий от anonymous

Много ли смысла генерировать именно bash?

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

vodz ★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

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

dekar ()
Ответ на: комментарий от dekar

И в этом, в dependency hell и кучи разных версий, окружений и библиотек главный недостаток питона против шела.

Городские легенды.

Главный недостаток шелла в том, что он говно.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Главный недостаток шелла в том, что он говно.

Но при этом это «говно» достаточно стабильно. В отличии от проблем «разнообразия сортов помидоров». Не понятно о чем вы спорите. Никто вам не запрещает писать на любимом ЯП. Инструмент подбирается под конкретные задачи. Зачем нужно то что сделал ТС написано по его ссылке.

anc ★★★★★ ()
Ответ на: комментарий от anc

Но при этом это «говно» достаточно стабильно.

Баш уже не спасти.

Инструмент подбирается под конкретные задачи.

И баш не подходит ни для одной.

Зачем нужно то что сделал ТС написано по его ссылке.

Не написал.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Но при этом это «говно» достаточно стабильно.

Баш уже не спасти.

Вы много тем, а-ля «у меня на bash version не работает, а на bash version+N работает» видели ? И теперь сравним с питоном. Мне кажется в данном случае bash выигрывает.

И баш не подходит ни для одной.

Патрик смотрит с неодобрением.

anc ★★★★★ ()