Информация об изменениях

Сообщение Re[18]: кадровики совсем рехнулись от 01.12.2018 21:03

Изменено 01.12.2018 21:16 Somescout

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

НС>Здравствуйте, 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
   Если токен следующей операции это закрывающая скобка, то извлекаем токен (скобку) и возвращаем левый операнд
   если нет либо если конец выражения, то возвращаем результат


Примерно так.
Re[18]: кадровики совсем рехнулись
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, 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, но будет работать.