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)

+1, треш какой то немного

Ну луа есть на крайняк, у нее нет проблем с совместимостью...

Я лично не против баша, но момент, когда скрипт на нем уже должен понимать язык, парсить который надо грамматикой - пора <s>лечить голову</s> переписывать скрипт на что то более вменяемое :-)

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

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

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

Bash is an sh-compatible command language interpreter

Да хрен там:

https://www.gnu.org/software/bash/

Bash is the GNU Project's shell. Bash is the Bourne Again SHell. Bash is an sh-compatible shell that incorporates useful features from the Korn shell (ksh) and C shell (csh). It is intended to conform to the IEEE POSIX P1003.2/ISO 9945.2 Shell and Tools standard. It offers functional improvements over sh for both programming and interactive use. In addition, most sh scripts can be run by Bash without modification.

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

Вы даже не осиливаете все что написано на маленькой текстовой странице? Хорошо подсказываю: Раздел «Documentation», первая ссылка «Documentation for Bash», далее например «HTML (780K bytes) - entirely on one web page.» Далее пункт «1.1 What is Bash?» В нем

Bash is the shell, or command language interpreter, for the GNU operating system.

ЗЫ Хотя то что я написал в предыдущем посте можно было прочитать набрав man bash. Вы будете оспаривать man-ы? Это вроде как официальная документация.

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

Вы даже не осиливаете

Правильно. Вы специально «неотдупляете»? Bash разрабатывался не как ЯП, а как «command line interpreter». Это разные вещи. И останутся разными.

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

это не интерпретируемые языки «с рождения»?

Вот именно «языки». А bash интерпретатор команд оболочки «с рождения».

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

Ну почему, что мне мешает в седьмую(емним) позицию /etc/passwd вписать /usr/bin/perl ? Тоже получиться некий shell.

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

Не все потеряно, будет вам и «/bin/bashD» Лёня «не останавливаться на достигнутом», а может и наоборот «/bin/cmd.exe» кто его знает.
Вы отчасти правы. Возможности чистого bash ограничены по сравнению с ЯП. Однако, это так же подчеркнуто у ТС. Но «мы же не будем забивать гвозди микроскопом»? Каждому решению свое применение.
ЗЫ Когда я был молодой, я все как и многие, пытался «написать с нуля», свою игру, свой архиватор, и так далее... но «когда подрос отбросил все детское»

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

Сколько времени заняло, от «Блин как же эта херня достала» до «Оооо, вот так збс»?

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Круто!

Вот-вот. Круто не то слово. А некоторые неосиляторы ещё пытаются хэйтить.
ЗЫ Кстати я кажется догадался почему и в этой теме «хэйт». ТС «отличается» достаточно «сложным/скромным» изложением. Я уже привык, а кому в «новинку», то конечно может не распарсить.

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

Да нормально, просто неуважают нынче хаки, всем интерпрайз подавай. И ТС не от хорошей жизни эту штуку сделал, нет инструмента, а он взял и себе его сделал, за то и плюс ::) Вот если бы это пропихивалось как замена чего либо аля потеринг и пиарилось я бы тоже орал «нинужнаааа». А так любо посмотреть даже если местами непонятно гы +)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от ananas

а что, eval уже не достаточно?

Увы, может не хватить скобочек для экранирования. Пример:

var_name=$1
eval $var_name="'строка'"
почти работает, пока в «строка» не будет амперсанда.

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

а забэкслешить амперсанды - это слишком неспортивно?

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

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

А такие фитчи: https://github.com/taviso/ctypes.sh не пользуешь?

Логически, насколько я понял, это обратное к поставленной перед собой ТЗ: отказаться от компилятора C/С++ при изменении синтаксиса. Вот для выражений с действительными числами можно над этим подумать, но пока не до них, а уж тем более не до sin/cos.

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

к сожалению, компилятор питона не поддерживает даже элементарную оптимизацию

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

eval выполняет выражение, нет? А нужен парсер. И собственно парсер bash это просто пример какого-нибудь более или менее сложного парсера. Конечная цель — компилятор Си на Bash в Bash, чтобы в нём можно было запускать Bash.

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

Удваиваю. Не стоит писать на этом поделии что-то сложнее, чем однострочник с пайпом пары команд.

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

а что есть «парсер bash на bash» если не «интерпретатор интерпретатора»?

Это такая фигня, которой можно управлять, скажем, сказать, «тут мы выявили, что предложено rm -rf». А eval просто исполнит.

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

psh уже давно получился.

psh == perl? perl == psh? )

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

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

Так питон же говняшка!?!

Уложились бы в 10 строк.

С чего бы это, почему в самом питоне тогда не уложились???

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

Хотя, там можно написать с юморком типа

Пилю по тихоньку yacc

И словить массу восторгов по поводу слова «пилю» :D

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

А почему у тебя личный сайт на УФК.

Как же вы достали с этим вопросом. Потому что site/~user — это сотрудник site. Что именно вас не устраивает?

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

а че не на гитлабе-то?

Именно это уж точно надоест раньше, чем захочется всё переводить, уж статью то 100%, а это же документация...

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

Как же вы достали с этим вопросом.

Привыкай, популярность она такая, надоедливая ::)

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