Javascript-форум (https://javascript.ru/forum/)
-   Работа (https://javascript.ru/forum/job/)
-   -   Заказ транслятора входного кода на выходной код (https://javascript.ru/forum/job/84076-zakaz-translyatora-vkhodnogo-koda-na-vykhodnojj-kod.html)

Дмитрий Луценко 29.05.2022 13:27

Заказ транслятора входного кода на выходной код
 
Вложений: 1
Добрый день.

Мне требуется написать
  1. лексический анализатор(?) (таблица с разбором входного кода на токены готова.)
  2. синтаксический анализатор (построение дерева разбора по таблице с токенами, проверка конструкций на синтаксические ошибки)
  3. семантический анализатор - проверить дерево на наличие необъявленных, но используемых переменных
  4. Транслятор взять синтаксически и семантически корректное дерево и перевести код с С++ на аналогичный код Python

Входным языком выбран урезанный синтаксис кода на C++.

Пример входного языка (который полностью удовлетворяет требования по урезанному синтаксису входного языка).
Код:

int var_a = +1;
int var_b = -2;
int var_c = 65; 
if(var_a != var_b){
    if (var_a < var_b) {
        var_c = var_a + var_b;
        var_a++;
        cout << var_a << "\n";
    }else {
        var_b++;
        cout << var_b << "\n";
        }
    }
if(var_a == var_b){
    cout << var_b << "\n";
}

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

Сроки, бюджет, общие требования:
  1. Сроки: до 29.08.2022, могу растянуть, (мне уже не горит).
  2. Бюджет: до 10000, если требуется больше - напишите, пожалуйста, что влияет на такое ценообразование(у меня запрашивали от 20 до 50 000 рублей без всяких объяснений по принципу "Я так оценил").
    Я могу согласиться и на большую сумму, просто дайте подробное объяснение Вашей предложенной цене.
  3. Тип работы: Удаленно.
  4. Тип отчетности: Периодически пишите о статусе работы(хотя бы 1 раз в 2 недели).
  5. Способ связи: email, zoom, discord, ЛС на данном форуме
  6. Не использовать уже готовые библиотеки - парсеры и анализаторы, каждый анализатор и синтезатор должен быть написан вручную.
  7. Не использовать серверный NodeJS, php и другие бэкенд технологии. Веб-приложение (HTML + JS) должно работать сразу, без установки/настройки ПО.
  8. Комментировать по возможности код.
  9. Выводить на экран промежуточные результаты(Можете воспользоваться различными библиотеками, которые облегчают только вывод результатов в верстку, но не более того.)

Оплата работы
Предлагаю 2 варианта схем работы-оплаты:
  1. Вы сделали 1 из 3 анализаторов/транслятора, присылаете мне обфусцированный проект, я проверяю его в рамках урезанного синтаксиса (Объявление новых переменных, вложенность конструкций максимум 2 if() {} else {}), если все хорошо - я оплачиваю 1/3 от согласованной суммы, высылаете исходники сделанного функционала.
  2. Вы сделали 1 из 3 анализаторов/транслятора, Я с Вами созваниваюсь в удобное для нас время, Вы показываете результат работы программы.
    Мы тестируем его на правильность работы. Если все хорошо, направляю Вам 1/3 от суммы. Вы направляете исходники.(Рекомендую)

Предоплата нежелательна. Я описал 2 варианта схемы сверху, которые дадут нам равные гарантии.

Внимание:
Ознакомьтесь, пожалуйста, с текстом заказа.

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

Какие знания Вам необходимы/пригодятся:
  • Алгоритмы и структуры данных: Бинарные деревья, деревья, Стек.
  • Ванильный JS (Если хотите, можете подключить jQuery и любые вспомогательные библиотеки только для вывода промежуточных результатов, не более того).
  • ООП

Дмитрий Луценко 29.05.2022 16:51

Лексический анализатор
Лексический анализатор предполагает разбиение слов и символов входного кода на токены (классификаторы), которые будут записаны в массив токенов.
например, строка
Код:

int summa = 0;
должна будет записана в массив токенов в виде:
Код:

[
[id:0, tokenName: 'L_TYPE', tokenValue: 'int' ],
[id:1, tokenName: 'L_VARIABLE', tokenValue: 'summa'],
[id:2, tokenName: 'L_EQUAL', tokenValue: '='],
[id:3, tokenName: 'L_NUM', tokenValue: '0'],
[id:4, tokenName: 'L_SEMICOLON', tokenValue: ';']
];

Синтаксический анализатор

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

L_TYPE L_VARIABLE (int abc) показывает синтаксически правильное объявление переменной.

L_VARIABLE L_TYPE (inty int) - является синтаксически некорректным, т.к L_VARIABLE ожидает либо "=", либо операций сравнения (<, >, ==, !=, и тд), либо ";".

А L_TYPE ожидает перед собой либо }, либо ";", а после себя только L_VAR (название переменной.)

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

Код:

int summa = 0;
int var_a = -90;

Варианты обхода синтаксического анализа могут быть нисходящим и восходящим (Выбирайте любой)
Итоговое дерево для объявления и инициализации переменных:


Семантический анализ.

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

Код:

summa = 0;
int var_a = "3334";

В ходе повторного обхода дерева Семантический анализатор должен проверить, summa ранее была ли объявлена или нет, соответствует ли целочисленный тип var_a со значением "3334".

Синтез кода

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

Дмитрий Луценко 29.05.2022 16:59

Скриншот дерева на этапе синтаксического анализа:
https://prnt.sc/AhC5FVOiv5ia

Nexus 30.05.2022 03:57

Это форум посвященный ЯП JavaScript, а вам нужен специалист, владеющий языками C++ и Python. Не находите это странным?

В итоге ваш транспайлер должен уметь только:
1. работать с целочисленными;
2. работать с декларацией переменных;
3. правильно разбирать if else;
4. производить примитивные математические операции с целочисленными;
5. выводить информацию в stdout?

+ иметь web-интерфейс, написанный без использования каких-либо библиотек или фреймворков? Я правильно понял?

Я совершенно точно не являюсь кандидатом на выполнение вашего задания, т.к. не владею нужными языками и я никогда не писал транспайлеров. НО! мне кажется, что работы даже с этим минимумом тут не меньше чем на рабочую неделю в режиме fulltime.
А вы, как я понял, предлагаете за нее 10 тысяч рублей, т.е. часовая ставка специалиста получается равна 250р./час.

На выполнение задания вы даете по меньшей мере 3 полных месяца (и даже можете подвинуть сроки), т.е. вы либо рассчитываете на очень неторопливое выполнение задания, либо реальная продолжительность работ может легко выйти за пределы пары месяцев. Если второе предположение истинно, то неудивительно, что «Многие исполнители [...] спустя неделю отказывались выполнять заказ из-за сложности реализации». Кто будет работать хотя бы месяц за 10к рублей?

В любом случае, ваш изначальный бюджет слишком низок для такой задачи.

micscr 30.05.2022 07:18

Видите, выше уже уточняют что вы имеете ввиду под "урезанный синтаксис", а все потому что вы не составили никакого ТЗ по задаче.
В результате задачу можно трактовать совсем по разному, не скажу за c++, но в языках как php, js, тот же оператор switch имеет массу тонкостей, представления чисел и строк имеют кучу особенностей и вариантов. А сколько операторов...
Разобраться чуток в синтаксисе с++ и
выяснять от вас только по ТЗ выглядит как усилий минимум часов на 10, а для опытного человека это и будет весь ваш бюджет.

Плюс, я думаю, мало кто в реалии с такими "учебными", для курсовых, задачами сталкивался и особенности проблем трансляции можно выяснить только копнув эту тему, а кто из профи станет этим заниматься без предоплаты?

А этот код что вам наваяли, это вы чьи то попытки даете, чтобы с них продолжали?

Дмитрий Луценко 30.05.2022 07:29

- Заказ состоит в том, чтобы написать Транслятор на 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 и тп.

Дмитрий Луценко 30.05.2022 07:41

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

Код я делал сам, не шедевр, знаю.

Можно и переписать, если проще начать все с нуля.

По предоплате я уже отписался, что она нежелательна.
Имеется негативный опыт (Эту же самую работу брали и по предоплате, по истечению недели отказывались делать, после пришлось напоминать о возвращении авансовой части).
Так что согласен оплачивать готовую часть функционала (показали синтаксический анализатор и он работает - отправляю 1/3, Показали Семантический анализатор - еще 1/3, показали синтез кода - оплачиваю оставшуюся часть)

Дмитрий Луценко 30.05.2022 08:49

Цитата:

Разобраться чуток в синтаксисе с++ и
выяснять от вас только по ТЗ выглядит как усилий минимум часов на 10, а для опытного человека это и будет весь ваш бюджет.
Я пока не выбрал исполнителя, так что можно и пообсуждать заказ, благо, форум это позволяет. "В споре рождается истина" :)
А денежку я согласен платить только тому, кто согласен взяться за работу:)

micscr 30.05.2022 09:00

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

Поэтому и валятся ваши исполнители, чуток поняв задачу.
Т.е. они как и вы, что то там начали, но продолжить не в силах, даже несмотря на такую прорву времени как 3 мес, которые у вас есть.

MallSerg 30.05.2022 16:50

Этот товарищь всплывал полгода назад на форуме sql.ru где ему дали вполне конструктивную критику и объясняли почему то что он хочет таким способом реализовать не получиться.

Приведенный код яркий пример реализации паттерна да придет спаситель.
https://www.youtube.com/watch?v=aKPbB_TfTR4

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

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

Ну и в целях общего развития необходимо научится использовать критику в свою пользу.
небольшая лекция - https://coub.com/view/2eqj35


Часовой пояс GMT +3, время: 05:05.