Re[18]: кадровики совсем рехнулись
От: Somescout  
Дата: 01.12.18 21:03
Оценка: :)
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, Somescout, Вы писали:


S>>когда мне говорят LL/LR/RL/прочая хрень, для меня это просто буквы (и мне не сильно интересно лезть разбирать что это такое), но если меня попросят сделать парсер алгебраических выражений, я его сделаю


НС>Можно раскрыть как? Регексами, да?


Зачем извращаться: сделать регэкспами парсер учитывающий приоритет операций наверно можно, но это уже эзотерическое программирование.
Буду исходить из того что парсить требуется простую арифметику из чисел, операторов и скобок.
Сначала напишу токенизатор.
Парсить буду рекурсивно. Первый вызов парсера помечается как корневой.
1) Если не задан левый операнд, то берём токен с левым операндом
   Если это открывающая скобка, то для получения левого операнда вызываем рекурсивно парсер. 
   left = parser(tokenizer, left:null, root:false)
   Если это число, то оно сразу становится левым операндом
   В ином случае исключение
2) Берём токен с операцией (если это не операция - исключение)
3) Берём токен с правым операндом по тем же правилам, что и левый
4) Подглядываем на следующую операцию, если приоритет её выше чем у нашей, то заменяем правый операнд результатом работы парсера с переданным ему текущим правым операндом
   right = parser(tokenizer, left:right, root:false)
5) применяем операцию к операндам, помещаем результат в левый операнд, если приоритет следующей операции равен приоритету текущей или парсер корневой - переходим к 2
   Если токен следующей операции это закрывающая скобка, то извлекаем токен (скобку) и возвращаем левый операнд
   если нет либо если конец выражения, то возвращаем результат


Примерно так.

ЗЫ. Регэкспами, при здравом размышлении, интересный вариант — quick and dirty, но будет работать.
ARI ARI ARI... Arrivederci!
Отредактировано 01.12.2018 21:16 Somescout . Предыдущая версия . Еще …
Отредактировано 01.12.2018 21:10 Somescout . Предыдущая версия .
Отредактировано 01.12.2018 21:05 Somescout . Предыдущая версия .
Отредактировано 01.12.2018 21:05 Somescout . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.