Сообщение Re[18]: кадровики совсем рехнулись от 01.12.2018 21:03
Изменено 01.12.2018 21:16 Somescout
Re[18]: кадровики совсем рехнулись
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Somescout, Вы писали:
S>>когда мне говорят LL/LR/RL/прочая хрень, для меня это просто буквы (и мне не сильно интересно лезть разбирать что это такое), но если меня попросят сделать парсер алгебраических выражений, я его сделаю
НС>Можно раскрыть как? Регексами, да?
Зачем извращаться: сделать регэкспами парсер учитывающий приоритет операций наверно можно, но это уже эзотерическое программирование.
Буду исходить из того что парсить требуется простую арифметику из чисел, операторов и скобок.
Сначала напишу токенизатор.
Парсить буду рекурсивно. Первый вызов парсера помечается как корневой.
Примерно так.
НС>Здравствуйте, 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/прочая хрень, для меня это просто буквы (и мне не сильно интересно лезть разбирать что это такое), но если меня попросят сделать парсер алгебраических выражений, я его сделаю
НС>Можно раскрыть как? Регексами, да?
Зачем извращаться: сделать регэкспами парсер учитывающий приоритет операций наверно можно, но это уже эзотерическое программирование.
Буду исходить из того что парсить требуется простую арифметику из чисел, операторов и скобок.
Сначала напишу токенизатор.
Парсить буду рекурсивно. Первый вызов парсера помечается как корневой.
Примерно так.
ЗЫ. Регэкспами, при здравом размышлении, интересный вариант — quick and dirty, но будет работать.
НС>Здравствуйте, 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, но будет работать.