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

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

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


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