Суп борщ, мне было нехуй делоть, так что я тут пытаюсь запрограммировать математический парсер отпусти меня чудо трава, мне нужен совет бывалого, как это лучше и проще сделать. Хуйня в том, что парсить нужно например простой пример(строка) "Всего яблок = 1 яблоко + 2 яблока". Пока что я заготовил, это массив переменных со структурой вида:struct varSt{ char name[32]; char type; int ival; float fval; char cval[8];};Где "яблок", "всего яблок", "яблока" это будут имена переменных, заранее рассованные по структуре, значения так же заранее рассованы в каждую цифровую переменную типа int = 1; float = 1.0, char = "1".И вот, есть массив этих переменных, означающий пример "всего яблок = 1 яблоко + (3 яблока - 1 яблоко)" если взять только строковый тип то он будет почти эквивалент {"всего яблок","=","1","яблоко","+","(","3", "яблока","-","1","яблоко",")"}; ну типа массив строк, который нужно вычислить(парсить). Так вот. Как это сделать?
бмп
>>170890586 (OP)Может, ты, мудила, для начала нормально опишешь логику парсинга?
Сажи дауничю
обосцал тугой струёй мать ОПа
>>170890962Как раз логики парсинга ещё нет, за неё и спрашиваю - как покакоть?Пока есть только массив перегруженных переменных в виде структур.
тоесть входная строка уже разбита на переменные.
>>170890586 (OP)Три яблока всего.мимо парсер
>>170891065Опиши че парсить то бля.
>>170891314в оп посте описание. парсить массив строк в фигурных скобках { }.
>>170890586 (OP)Три вещи, которые тебе, долбоебу, нужно прогуглить, чтобы решить задачу:1. Конечный автомат;2. Лексер;3. Парсер.Прежде чем писать, научись думать хотя бы.
>>170890586 (OP)parsing expression grammar, наверное в эту сторону надо смотреть
>>170890586 (OP)> как это лучше и проще сделатьНу, ты, блять, спросил в /б как термоядерный двигатель от звездолета собрать примерно по сложности. Тут разбираться месяц надо. Начинай с грамматик, копать в эту сторону:https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_formhttps://en.wikipedia.org/wiki/Recursive_descent_parser
>>170891416Нахуй сходи, долбоёб. Грош цена твоим советам.
>>170891460Чет сильно сложно, для подсчета яблок.
>>170891460Да я пока думаю над стековой моделью и схлопывающей, в принципе и то и то смогу с нуля без чтения литературы, просто трудозатраты будут нихуёвые, я заебусь.
>>170891535Блять ну а ты как хотел. Парсеры это нихуя не просто. Если примерно понять идею, то простейший рекурсивный написать можно на изи. Или готовую либу поюзать. Но грамматика твоей параши в BNF нужна в любом случае.
ЧТО ЗА ИГРА НА ПИКЕ???? В ДЕТСТВЕ ИГРАЛ НАСТАЛЬГИЯ ПЗДЦ, ПЛС ХЕЛП
>>170890586 (OP)Книгу дракона уже начал читать? «Компиляторы: принципы, технологии и инструменты»
>>170891798>«Компиляторы: принципы, технологии и инструменты»Скоро начну
>>170891384Ааааа. Ну тогда иди нахуй. Потому что не умеют современные технологии нормально парсить текст произввольный. Это нужно какие-нибудь нейроночки присоединять и то это будет работать хуево.
>>170891969Тыб пиздел поменьше, я тут делом занят.
>>1708913841. Гугли что такое лемматизация2. Задумка крайне ебанутая, все равно произвольный текст ты не научишь понимать. Максимум какие-то шаблоны.
>>170892235Задумка научить комплюктер решать такие задачки.ЗАДАЧА:Cумма яблокДАНО:1 яблоко3 яблока2 грушиНАЙТИ:Сумму всех яблокРЕШЕНИЕ:1) Всего яблок = 1 яблоко + 3 яблокаОТВЕТ:Всего яблок = 4
>>170892341Как ты дожил до 10 лет???Ты же должен был уже давно ложкой подавиться, когда суп ел или еще как умереть. Ты же клинически тупой.
>>170892235И чтобы завершить проект осталось совсем немного, научить машину решать. Получается я перевожу задачу из текстовой формы в формальную, а затем парсером вычисляю и выдаю ответ. Но хуйня в том что парсер - это сложно и долго, прощу было бы даже переводить в Си или ассемблер.
>>170892423>12 летний закукарекал.
>>170892341Смотря насколько серьезно тебе нужно это реализовать, можно втупую обойтись регулярками и всякими стандартными библиотеками для поиска в строках. Тогда тупо напиши решение для частного случая а потом сделай для общего, если уж совсем не понимаешь.
>>170890586 (OP)ОП - даун. Решать такие произвольные задачи простым парсингом невозможно.мимо ИИ-энтузиаст
>>170892571Для частного всё просто, 2 + 2 сложить хуйня делов, затык на приоритете скобок. Пути 2 - что то типа рекурсии или отказ от скобок вовсе.
>>170892423орнулбля ваще ору с треда
>>170892669Но представление о том как именно это сделать у меня оч смутное.
>>170892773Так ты вообще написал что-нибудь или в оппосте это все что есть?
Держи набросокhttps://ideone.com/BUgWWI
>>170892921НЕ ОТКРЫВАЙТЕ ПОСОНЫТАМ ВИРУСКОМП ВЗОРВАЛСЯПИШУ С ТАМАГОЧИ
Парсера там нет.Пока я описал концепцию, что мол разбиваю строку на подстроки, подстроки анализирую и парсю, пока вижу 2 варианта парсинга, либо стековый pop add pop либо схлопывающй [num] [op] [num], где в любом случае 2 числа и оператор превращаются в 1 число.
>>170892669Ты забыл FIFO структуры на дереве, и идти с двух сторон. Так можно не только обычные скобки, но и любые лютые математические конструкции парсить . А если ещё сделать базовый класс, и от него сделать наследников для разных конструкций (простые скобки, интегралы и прочая хрень), то получишь охуенный парсер мат. эквэйшэнов. И относительно компактный по размеру кода. И удобно написать собственно вычислитель такой структуры, т.к. все классы наследованы, перегрузить cast-оператор просто.
>>170893257ооп и си несовместимы
Думаю я нашёл способ.Сделаю 3 массиваВ первый насую операторовВо второй первые операндыВ третий вторыеСувать буду по прироритету.Так и операции выполнять будет проще.дааа...
>>170893320а ты сделай ООП с помощью указателей в С,тем более С-Style type casting проще, чем в С++