Заказ транслятора входного кода на выходной код
Вложений: 1
Добрый день.
Мне требуется написать
Входным языком выбран урезанный синтаксис кода на C++. Пример входного языка (который полностью удовлетворяет требования по урезанному синтаксису входного языка). Код:
int var_a = +1; Сроки, бюджет, общие требования:
Оплата работы Предлагаю 2 варианта схем работы-оплаты:
Предоплата нежелательна. Я описал 2 варианта схемы сверху, которые дадут нам равные гарантии. Внимание: Ознакомьтесь, пожалуйста, с текстом заказа. Решите для себя, готовы ли Вы выполнять этот заказ. Многие исполнители, с которыми я работал по этому заданию, спустя неделю отказывались выполнять заказ из-за сложности реализации. Какие знания Вам необходимы/пригодятся:
|
Лексический анализатор
Лексический анализатор предполагает разбиение слов и символов входного кода на токены (классификаторы), которые будут записаны в массив токенов. например, строка Код:
int summa = 0; Код:
[ Синтаксический анализатор: Полученный на лексическом анализе массив токенов необходимо преобразовать в виде абстрактного синтаксического дерева. Таким образом проверяется корректность структуры набора токенов, правильно ли строится блок кода. L_TYPE L_VARIABLE (int abc) показывает синтаксически правильное объявление переменной. L_VARIABLE L_TYPE (inty int) - является синтаксически некорректным, т.к L_VARIABLE ожидает либо "=", либо операций сравнения (<, >, ==, !=, и тд), либо ";". А L_TYPE ожидает перед собой либо }, либо ";", а после себя только L_VAR (название переменной.) Дерево таким образом построить не получится(ведь с точки зрения, к примеру, бинарного дерева, у которого должны быть заполнены и левая и правая ветвь, одна из ветвей будет пустовать, чего быть не должно). Код:
int summa = 0; Итоговое дерево для объявления и инициализации переменных: Семантический анализ. Итоговое дерево после синтаксического анализа должно быть проверено на соответствие типов переменных и их значений. Код:
summa = 0; Синтез кода Проверенное семантическим анализом дерево должно быть свернуто в программу на выходном языке Питон. |
Скриншот дерева на этапе синтаксического анализа:
https://prnt.sc/AhC5FVOiv5ia |
Это форум посвященный ЯП JavaScript, а вам нужен специалист, владеющий языками C++ и Python. Не находите это странным?
В итоге ваш транспайлер должен уметь только: 1. работать с целочисленными; 2. работать с декларацией переменных; 3. правильно разбирать if else; 4. производить примитивные математические операции с целочисленными; 5. выводить информацию в stdout? + иметь web-интерфейс, написанный без использования каких-либо библиотек или фреймворков? Я правильно понял? Я совершенно точно не являюсь кандидатом на выполнение вашего задания, т.к. не владею нужными языками и я никогда не писал транспайлеров. НО! мне кажется, что работы даже с этим минимумом тут не меньше чем на рабочую неделю в режиме fulltime. А вы, как я понял, предлагаете за нее 10 тысяч рублей, т.е. часовая ставка специалиста получается равна 250р./час. На выполнение задания вы даете по меньшей мере 3 полных месяца (и даже можете подвинуть сроки), т.е. вы либо рассчитываете на очень неторопливое выполнение задания, либо реальная продолжительность работ может легко выйти за пределы пары месяцев. Если второе предположение истинно, то неудивительно, что «Многие исполнители [...] спустя неделю отказывались выполнять заказ из-за сложности реализации». Кто будет работать хотя бы месяц за 10к рублей? В любом случае, ваш изначальный бюджет слишком низок для такой задачи. |
Видите, выше уже уточняют что вы имеете ввиду под "урезанный синтаксис", а все потому что вы не составили никакого ТЗ по задаче.
В результате задачу можно трактовать совсем по разному, не скажу за c++, но в языках как php, js, тот же оператор switch имеет массу тонкостей, представления чисел и строк имеют кучу особенностей и вариантов. А сколько операторов... Разобраться чуток в синтаксисе с++ и выяснять от вас только по ТЗ выглядит как усилий минимум часов на 10, а для опытного человека это и будет весь ваш бюджет. Плюс, я думаю, мало кто в реалии с такими "учебными", для курсовых, задачами сталкивался и особенности проблем трансляции можно выяснить только копнув эту тему, а кто из профи станет этим заниматься без предоплаты? А этот код что вам наваяли, это вы чьи то попытки даете, чтобы с них продолжали? |
- Заказ состоит в том, чтобы написать Транслятор на JS + HTML, поэтому это ничуть не странно (Есть даже видео: "Как написать свой язык программирования" на TypeScript + NodeJs, а мне же требуется написать на чистом JS).
- Мне не требуется определять все виды конструкций: Достаточно распознать - Целочисленный тип int, - Любое наименование переменной ([a-zA-Z_]{1,}[0-9]{0,}) - Целочисленное значение [0-9]{1,} - Арифметические операции + - * / - Инкремент/декремент (достаточно постфиксного) ++ -- - Конструкцию if - else (может быть и 2 уровня вложенности) - Булевы операции сравнения (<, >, >=, <=, !=, ==) - Можно обойтись и без метода вывода printf, cout и тп. Мне не требуется определять кастомные функции и методы (int main() {}, int Fact(int i) {} и тп). Просто представьте, что Вы вводите код в функцию main(){//Входной код сюда }. Это примитивный синтаксис языка С++, мне парсить все операции, операнды, подключения библиотек, прототипы и тп не нужно Так что мой текущий лексический анализатор делает ровно то, что нужно и чего вполне достаточно. Что касается сроков: Как я уже ранее говорил, мне уже не горит выполнение задачи, сроки уже давно прошли, но сделать этот проект надо. Почему 3 месяца даю? Все просто. На схожих тематических форумах я заказывал эту же самую работу, но язык реализации был на выбор исполнителя. Давался ровно месяц до моего личного дедлайна, когда надо было сдавать проект. У меня по итогу было 4 исполнителей, которые брали по 1-й неделе на "разобраться / посмотреть / оценить", а после отказались выполнять, даже с предоплатой, т.к скорее всего не обладали нужными знаниями/опытом. На них я зла не держу, но к сведению принял, что могут быть и такие исходы. Я даю такой срок, чтобы человек успел разобраться/посмотреть/оценить и смог выполнить этот заказ. Что про бюджет: Очень мало - не конкретная сумма. Дайте мне, пожалуйста, оценку стоимости работы, если это стоит 15 000, окей, я готов и эту сумму заплатить, но дайте мне конкретную оценку. (Например, моя ставка в часах 200 рублей, по моему опыту, времязатраты на схожие проекты заняли у меня до 2 недель при выделении 3 часов на Ваш проект в сутки - 3 * 14 = 42 час в неделю, 42 * 200 = 8400, дополнительная стоимость: 50% от стоимости в качестве премиальной части - 12600 руб. Ведение документации 1000 рублей, ..... Окончательная стоимость: 15 000 руб. ). Все, по этим расчетам я уже вижу, что набирается 15 000. Значит, это столько стоит. Плюс я буду знать, что исполнитель будет делать и сколько времени у него это займет. Я понимаю, что это фриланс, и наши трудоотношения ничем не подкреплены, но все же хочется понимать, за что просят 20 000, 30 000, 50 000 и тп. |
Я дополнил, хотя ранее указывал в начале топика, какой код полностью удовлетворяет требованиям синтаксиса входного языка/входа.
Код я делал сам, не шедевр, знаю. Можно и переписать, если проще начать все с нуля. По предоплате я уже отписался, что она нежелательна. Имеется негативный опыт (Эту же самую работу брали и по предоплате, по истечению недели отказывались делать, после пришлось напоминать о возвращении авансовой части). Так что согласен оплачивать готовую часть функционала (показали синтаксический анализатор и он работает - отправляю 1/3, Показали Семантический анализатор - еще 1/3, показали синтез кода - оплачиваю оставшуюся часть) |
Цитата:
А денежку я согласен платить только тому, кто согласен взяться за работу:) |
Ваше предложение рассчитано имхо на школьников, которым возможно будет интересно попрогать такую вещь для практики, и сделать это для мотивации за символическую сумму.
Поэтому и валятся ваши исполнители, чуток поняв задачу. Т.е. они как и вы, что то там начали, но продолжить не в силах, даже несмотря на такую прорву времени как 3 мес, которые у вас есть. |
Этот товарищь всплывал полгода назад на форуме sql.ru где ему дали вполне конструктивную критику и объясняли почему то что он хочет таким способом реализовать не получиться.
Приведенный код яркий пример реализации паттерна да придет спаситель. https://www.youtube.com/watch?v=aKPbB_TfTR4 Ну а вообще если хочешь реализовать этот проект тебе стоит разобраться с таким понятием как грамматики языка в приведенном коде есть попытка грубой силой (простым условным ветвлением) выделить лексемы языка это закономерно приводит к потере контекста и структуры в которых используются эти части языка что и делает выделение этих лексем (токенов) бессмысленным занятием, происходит вырывание их из их контекста. Если объяснять по простому то твоя задача из кода в виде текста создать структуированную информацию об этом коде обычно это называют AST деревом. Ну и в целях общего развития необходимо научится использовать критику в свою пользу. небольшая лекция - https://coub.com/view/2eqj35 |
Спасибо за Вашу критику
Получается, можно сделать следующие выводы: - Реализация компилятора на JS - гиблое дело. - Лучше самому изучать учебники по компиляторам и хоть как-то сделать этот проект, нежели просить кого-то сделать его. Проблема в том, что я не могу сделать сам, не хватает уверенных знаний и терпения. Вот то, что мне сказал преподаватель: - сделай лексический анализатор (выведи результат его работы), передавай результат в следующий анализатор - сделай синтаксический анализатор (выведи результат его работы) , передавай результат в следующий анализатор - сделай семантический анализатор (выведи результат его работы), передавай результат на синтезатор - Синтез кода (выведи результат его работы). Вот тебе список того, что должна распознать программа(int,<название_пере енной> if, else и далее по требованиям) На чем делать будешь анализаторы и синтезатор - выбирай сам. Язык входной грамматики - какой хочешь Язык выходной грамматики - какой хочешь. Библиотеки flex, bison и тп не используй. Нужна собственная реализация. Это были все требования преподавателя, я практически буквально его процитировал. Можно тогда получить советы: Как правильно составить ТЗ, чтобы все его поняли, или как мне реализовать каждый шаг? Сейчас критику я воспринимаю спокойнее, торопиться мне уже некуда. Просто хочу уже закрыть вопрос с этим несчастным компилятором. |
Согласно всем обсуждениям, написать транслятор на JS - задача трудновыполнимая и дорогостоящая.
Зазря только всех всполошил да и сам свое время потерял. Спасибо большое за ваши советы и критику. Буду решать своими силами, на сколько это возможно. |
Она такая же трудновыполнимая, как и в другом языке.
Не имея профильных знаний, она содержит ряд подводных камней, которые решаются правильной архитектурой синтаксического анализатора, что приводит к сложностям когда куча кода написано, и к тому не знаешь всех этих нюансов и видов грамматик Такую задачу может решить толковый студент с профильным образованием, у которого свежи знания по конкретно это области Среди зрелых программистов задача написания парсера, тем более на столь фундаментальном уровне - не является частой задачей, и фактически представляет собой рокет-саенс Даже для тех, кто в свое время изучал эту тему в универе - без повторного применения эти знания весьма легко забываются Соответственно среди зрелых программистов решить задачу, в том числе с подводными камнями может далеко не каждый - нужно определенное упорство, и готовность подтянуть теоретический материал За эти качества и нетиповую работу и ценник будет соответствующий Так что с вашим бюджетом, вам к студентам Да и шанс, что со относительно свежими знаниями в голове студент не сольется спустя неделю - выше Может стоит поискать среди студентов вашего факультета? |
Студенты вашего факультета будут потенциально лучше из-за одинаковой программы
Потому что объем и качество изучаемого материала может отличаться Где-то для сдачи достаточно написать калькулятор, и хорошо если не с польской нотацией А где-то есть отдельные подробные факультативы с очень глубоким изучением теории грамматик, и вроде даже исследование новых подходов(в общем случае разбор грамматики идет в комплекте с отдельным математическим аппаратом) |
Также хочу отметить что 3 подзадачи не равноценны по сложности
Синтез кода из дерева - тривиальная прикладная задача Семантика - чутка посложнее, но в вашем случае не сильно А вот синтаксис - представляет собой основную сложность всей задачи Поэтому я бы предложил пересмотреть план оплаты, перебросив большую часть оплаты в первую часть, и в свою очередь разбив ее на несколько частей, с постепенно нарастающим синтаксисом В качестве первой вехи(рискую предположить, что на этом этапе уже часть разработчиков отсеется после пробы), поддержать синтаксис только объявление переменных с таким тестовым примером int a = 1, b, c = 2; int d = 3; Его особенность в том, что в нем есть 1. под-список из разных типов нод(VariableDeclarator с инициализацией и без) 2. под-список из одинаковых сущностей(VariableDeclaration-ы) Захват под-списка, без зацикливания - это один из примеров, который отделяет правильно выбранную архитектуру для данного типа грамматики Затем усложнить пример до int a = 1, b, c = 2; cout << a; int d = 3; Тут уже VariableDeclaration-ы перемешаны с Statement-ами Ну а затем остальные пункты синтаксиса |
Часовой пояс GMT +3, время: 07:09. |