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 ()
Последнее исправление: Shaman007 (всего исправлений: 1)

Этот сайт небезопасен.

Сайт http://www.simtreas.ru/~dzo/yacc_bash_jq.html содержит вредоносный контент, включая страницы, которые:

Устанавливают на компьютеры пользователей нежелательное или вредоносное ПО.

Походу гугл совсем ошизел :-/

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

Походу гугл совсем ошизел :-/

Да уж, достало, придётся vnc паковать с паролем, чтоб им пусто было.

vodz ★★★★★
() автор топика

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

xor2003
()

Разве PEG такое не может?

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 1)

Просто фееричная реализация, ставлю плюс.

CYB3R ★★★★★
()

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

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

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

это кеш откомпилированного файла

«Оптимизация» где? Ху из «оптимизация»?

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

Байткод, в том числе предкомпилированный. Я уж не говорю про jit pypy. Вангую и другие фичи позволяют ему работать быстрее.

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

другие фичи позволяют ему работать быстрее.

А «оптимизация» где? Посмотреть и почитать «её» можно? Ху из «оптимизация»?

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

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

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

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

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

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

Zsh_1670
()

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

Что мешало взять python + peg? Уложились бы в 10 строк.

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

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

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

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

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

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

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

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

Запускать парсерогенераторы на роутере? Ну раз он такой мощный, поставь туда убунту максимальную эдишн, там есть питон.

anonymous
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от vodz

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

Но было бы забавно посмотреть на компилятор Си в Bash на Bash. И весь coreutils им пересобрать. BashOS.

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

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

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

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

Прочитал. Ответа на вопрос «Зачем?» не нашёл.

Это ваши проблемы. Вы задали вопрос, я считаю, что ответил.

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

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

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

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

Можно подумать на баше (да с eval, хи-хи) какую угодно дичь нельзя натворить. Бредовый продакшен.

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

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

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

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

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

vodz ★★★★★
() автор топика

Много ли смысла генерировать именно bash? Было бы переносимее использовать posix shell, как делают например автотулзы.

anonymous
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от RazrFalcon

Язык, который ничего не умеет, поддерживать проще.

Вы так говорите, как будто это что-то плохое.

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

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

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

ничего не умеет

«ничего» == /dev/null Без уточнений ваше высказывание так же равно /dev/null

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

Язык, который

Какой ещё «язык»? Bash никогда не был «языком», он всегда был инструментом. Вы о чём?

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.