LINUX.ORG.RU

Primula parsers - парсер Си кода

 ,


0

5

Здравствуйте, уважаемые.

Мне нужен компилятор Си. Да, мне очень нужен компилятор. Но где его взять? Спасибо, я знаю о существовании gcc и llvm. И простенький Portable C Compiler щупал тоже. А так же смотрел в сторону SmallerC. По разным причинам ни один из них не удовлетворил. В результате с дуру решил попробовать написать сам, убил чуть больше пяти лет, но не закончил. Переписывал его четыре раза. В одной из версий даже пытался генерировать ассемблерный код для x86. В настоящее время Primula умеет строить дерево синтаксического разбора и восстанавливать исходный код из этого дерева.

Скорость разработки ничтожная и если такой темп сохранится, то я тупо сдохну раньше, чем получится нечто, имеющее практический смысл.

https://github.com/L4OS/Primula

Проект состоит из двух парсеров - лексического и синтаксического. Лексический парсер делает препроцессинг кода, а затем разбивает его на лексемы и пишет в файл. Синтаксический анализатор читает лексемы из файла, делает синтаксический разбор и строит в памяти синтаксическое дерево.

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

★★★

В настоящее время Primula умеет строить дерево синтаксического разбора и восстанавливать исходный код из этого дерева.

Оно умеет превращать нечитабельный гомнокод в более-менее читабельный отформатированный? Или делать гомнокод менее гомном?

xDShot ★★★★★
()

Свой компилятор - это круто!

По разным причинам ни один из них не удовлетворил

Почему? Или можете просто описать особенности вашего парсера.

trex6 ★★★★★
()

Во первых желаю упорства и вдохновения. Ты делаешь хорошую и добрую штуку. И значит для тебя это что-то или нет, но не все смогут осилить даже часть того что ты уже сделал. Я вот не смогу. Так что если со своей колокольни тебе будет казаться что что-то не то вспомни что некоторые сишники вроде меня даже близко рядом не стояли.

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

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

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

Если устал, отложи и вернись со свежим взглядом. А иногда можно перестать писать код, а просто помечтать да подумать о том как по разному и интересному можно что-то сделать. Порой может придти яркое желание взять и мимолётную мысль записать,зарисовать, обдумать детальнее и закодировать.

Успехов. Идей. И положительного самонастроя. Лого хорошее. Название доброе. А глядишь и соратника/ков/ниц найдёшь и будете вместе думать, о всяких приколюхах.

Ну и фичреквест - компилятор хорошо бы иметь в виде .a .so библиотеки то есть встраиваемый с опрятным и маленьким API. Пусть там будет даже что-то урезано. Но подобного нехватает. Да есть tcc и аналоги. Но… ну в общем я просто предложил.

Успехов.

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

Оно умеет превращать нечитабельный гомнокод в более-менее читабельный отформатированный?

Форматирование восстановленного кода специфическое. Я старался делать форматирование таким, чтобы легче было сравнивать оригинал и восстановленный код с помощью BeyondCompare

Или делать гомнокод менее гомном?

Это вряд-ли.

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

Идея в том, что если идея с преобразованием кода в ассемблер не прогорит, то можно попробовать сделать из этого анализатор, конвертер, etc.

xDShot ★★★★★
()

Чувак, если ты за пять лет сделал только лексер и парсер, извини, но компилятором тут даже близко не пахнет. Эти штуки пишутся за неделю, ну ок месяц, если в первый раз. По-моему у тебя должна быть очень веская причина и солидный опыт, чтобы сказать «существующие компиляторы говно, делаем новый».

Я думаю, ты его делал для фана, тогда это другой разговор. Конпеляторы с одной стороны интересные, но с другой быстро наскучивают, когда приоткроешь завесу чего-то особенного и непостижимого. Поэтому я прекрасно могу понять, что руки не поднимаются продолжать это дело. Лучше забей, вдохновения не найдёшь.

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

gcc и llvm чертовски большие. Когда начинал, не готов был потрать год на изучение. Насчёт остальных промолчу.

Особенности синтаксического парсера - фигурные скобки порождают namespace. И уже от него уже вся пляска. На первом проходе синтаксического анализа строится просто дерево из лексем и производится небольшая предварительная обработка. Например else дописывается к if, так как самостоятельно else не может существовоать. Аналогично с do-while.

На втором проходе уже происходит полный разбор. Разбор сделан «в лоб» - множество конечных автоматов, меняющих состояние в зависимости от входящей лексемы. Если встречается выражение, то создаётся парсер выражений. Вложенность может быть большая, например при передаче параметров функциии может быть функция, в свою очередь имеющая параметры с функциямими. И т.д.

В некоторых случаях потребовался третий проход. Если точнее, это при разборе классов, если функция, описанная в классе, использует переменную член класса, объявленную ниже функции.

Нет, полной поддержки С++ нет, есть лишь разбор классов. Шаблоны не поддерживаются.

Вот как-то так.

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

Эти штуки пишутся за неделю, ну ок месяц

оптимистические взгляды на оценку работы сразу убираются поработав в реальных проектах несколько лет

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

Зачем?

Перешёл бы на гитхаб из первого сообщения, то узнал бы, что

пацаны пилят свою операционку на своём процессоре и со своим компилятором.

http://primula.l4os.ru/hello-world-news/

http://primula.l4os.ru/everest-site/

http://everest.l4os.ru/

https://youtu.be/MwBI2cgwaH4

http://l4os.ru/

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

Предлагать в таком топике варианты не названные автором, есть опасная дорожка - представляешь, ты подгонишь вариант который полностью удовлетворяет, а автор 5 лет убил. Доносчику же первый кнут :)

pon4ik ★★★★★
()

Утилиту для форматирования сишного кода разработайте /а то в многих проектах код «не читаемый»/.

Владимир

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

Да, троллят иногда …
Но их посты от моих легко отличить.

Владимир

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

Examples получения AST и работы с ним имеются?

Примеры + help по API …

Владимир

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

пацаны пилят свою операционку на своём процессоре и со своим компилятором.

Выглядит как «распил», как «импортозамещение» с искусственной самоизоляцией.

Без оценки хорошо это или плохо.

anonymous
()

ээээ. в 2020 писать тектовы код!111 надо писать метанпрог!11 и потом на нем писать операционку. metaprog подтвердит. Уж если он ниосили, то все такие же тупые! А ты же что? выбиваешься из коллектива?

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

Пацанов там ровно полтора, из которых «один» — это топикстартер.

Да и вообще, целеполагание очень странное:

— А давайте запилим свою, прорывную OS на базе L4. Потому что это круто и модно (ну ок, было модно, лет пятнадцать назад. Такое впечатление, что примерно в том периоде автор и застрял).

— …но выясняется, что очередная студенто-ос никому не нужна. Поэтому запилим микроведро в железе…

— …для чего разработаем свою, прорывную архитектуру. Как x86 (ни в коем случае не RISC), но другую. И обязательно с высокой плотностью кода, ага.

— …для которой конечно же нужен компилятор… Но разбираться с написанием бэкенда для gcc/clang нам недосуг, поэтому мы напишем свой

— …для которого нужен парсер и лексер… Конечно, пишем своё, с нуля!

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

Касаемо выложенного проекта — впечатления более чем странные. Тонна г… весьма посредственного кода, написанного по большей части в сишном стиле, но требующая плюсы для сборки. Куда это применить, зачем, как? Не понятно. Боюсь, полезно только для автора. Но название красивое, да.

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

Или делать гомнокод менее гомном?

А такое вообще бывает?

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

Даже не знаю что ответить. По сути всё верно написал.

ни в коем случае не RISC

Ну вот не нравится мне RISC. ИМХО, слишком много хайпа вокруг «упрощённой системы команд». Да и вообще система команд рождена в муках.

написанного по большей части в сишном стиле,

Справедливо для лексического анализатора.

но требующая плюсы для сборки

Увы, STL и классы только в плюсах.

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

Тему создал в надежде получить вдохновение ценным критическим замечанием

Тут ведь главное, чтобы не получилось как в басне про слона-живописца.

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

anonymous
()

Тему создал в надежде получить вдохновение

тут классаная книга про компилятор С, нужно только японский язык изучить - как раз твой стиль разработки

https://www.sigbus.info/compilerbook

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

соратника/ков/ниц

Оффтопик: сначала они пихали пробелы после «ни» в наречия на «ни» и писали «ни какой», потом они решили, что множественное число надо делить по родам, потом они пошли дальше деградировать… Не надо так.

Онтопик: лексер отдельной программой неплохо, может пригодится. AST гетерогенный, visitor’ов не видно, работать с этим тяжко. И есть опасение, что если кто-то захочет улучшить код, то он столкнётся с нежеланием ТСа иметь зависимости и сразу будет форк.

Тестировать такое надо на его же коде для начала, а не на левом проекте. Я попробовал и тест не пройден.

Вообще же проект не в товарном виде, я сразу нашёл ряд элементарных проблем. Хотел было отправить пулл-реквест, но увидел кок и передумал.

xaizek ★★★★★
()

В результате с дуру решил попробовать написать сам, убил чуть больше пяти лет, но не закончил

Тут недавно [user]byko3y[/user] говорил, что на такое несколько месяцев надо, лол )

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

Эти штуки пишутся за неделю, ну ок месяц, если в первый раз

О, ещё один. Но тут хотя бы только про разбор кода

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

полной поддержки С++ нет

Ну хотя бы UB с указателями есть(это то, которое launder-ом подпереть пытаются)?

anonymous
()

а контакты на сайте или в профиле, они где ? :-)

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