Pull to refresh

Comments 23

UFO just landed and posted this here

Если к этому добавить еще и невыразительность языка C++, например методы stoi(), stod(), empty()

Это не С++.

По поводу статьи:

Вы изобрели lex и yacc.

Хуже. Автор написал этот код вручную, когда мог использовать lex/yacc, чтобы получить исходники парсера. Кроме того, как уже писали выше, для арифметики есть обратная польская запись (Reversed Polish Notation - RPN).

во всех нормальных компиляторах рукописные парсеры и лексеры

UFO just landed and posted this here

Lex - да, yacc - нет. Это автомат со стеком.

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

Если к этому добавить еще и невыразительность языка C++

Поэтому далее мы напишем программу на... (барабанная дробь) C++.

Если уж решили писать разбор синтаксиса какого-то кода на с++, то используйте также наследование и полиморфизм, а не пачки switch caseов. И как верно уже сказали - вы переизобрели flex + bison / lex + yacc. И, кстати, дерево выражение не всегда бинарное. Например if (expression) { statements } else { statements } имеет три листа.

Про мусор в начале статьи я уж и не говорю.

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

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

На втором курсе на ассемблере написал программу, которая с клавиатуры считывала строку с формулой и и числами и преобразовывала это все соотв вызовы. Поддерживались комплексные числа (ради них эта прога и писалась, т.к. вручную считать лабы и курсачи по ТОЭ задалбывался).

Это был 1992 год. Компьютер БК-0010.01, архитектура PDP-11. И про интернет я еще не знал.

А я видел, к сожалению. Даже могу сказать где — в свежевыложенном коде игры Lugaru.

Народ, соберитесь.
Увидел оценку, прочитал первый абзац, и сразу в коментарии - а тут как-то тухловато. Болеют все, что ли?

Я слышал, что программирование на с++ вызывает необратимое изменение мозга.

Причём, судя по всему, в правильную сторону - ставят оценку и молча идут заниматься делом вместо разведения тухлых срачей.

Засада. Пойду прочитаю про очередную победу Go на Rust-ом. Эти за косой взгляд в холивар лезут.

Для хранения и вычисления арифметического выражения вовсе не обязательно использовать дерево — достаточно линейного списка с постфиксной записью. Это также позволит объединять несколько выражений через временные переменные. Вводить специальные сущности для функции/оператора/числа/etc также не обязательно — достаточно определить один базовый класс «ВычислительнаяЕдиница», наследниками которого являются и функции, и операторы, и числа. Разница с обычным подходом в том, что например синус — это не глобальная процедура или метод статического класса, а экземпляр класса, который помимо перегруженного метода «Вычислить» сохраняет результат этого вычисления у себя в свойствах, а не в глобальном стеке.

Можно пойти ещё дальше и реализовать полноценную data-flow диаграмму, которая также прекрасно помещается в линейный список. Дополнительным бонусом к этому будет возможность у функций иметь не только несколько входов, но и несколько выходов, а также возможность прозрачной реализации «грязных» функций, то есть с внутренним состоянием (типа линий задержек, фильтров, связи с внешним миром и т.д.).

Вам бы, сударь, в Комсомольской правде печататься)

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

Что такое, товарищи, дебют и что такое, товарищи, идея?Дебют, товарищи, это quasi una fantasia. А что такое, товарищи, значит идея? Идея, товарищи, – это человеческая мысль, облеченная в логическую шахматную форму.

Смысл статьи: мы не будем изучать работы Ахо, Гриса, мы не хотим понимать yacc, мы будем делать велосипеды отбросив любой опыт предыдущих поколений по созданию велосипедов.

Вы просто взяли и пересказали первые главы любой книжки по написанию компиляторов, и даже не упомянули, что грамматика записана в форме Бэкуса-Наура

Sign up to leave a comment.

Articles