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

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

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

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

S>>Зачем извращаться: сделать регэкспами парсер учитывающий приоритет операций наверно можно, но это уже эзотерическое программирование.


НС>Да тут рядом предлагали на полном серьезе.


Я на полном серьёзе обдумал, и думаю это возможно. Не за один проход, само собой. Но если несколько раз пройти по выражению, сначала обработав все вложенные скобки
(\([^(].+\))
Заменив их результатом парсинга операций.

Содержимое скобок парсим в два этапа:
1) ([\d*/]+) — умножение и деление, в первую очередь,
2) ([\d+\-]+) — сложение и вычитание.

На выходе получаем число

НС>Как? Или про НКА-ДКА ты все таки слышал?


Нет, я слышал про токенизатор, и думаю что класс, делящий строку на функциональные компоненты для указанного мной примера я напишу и без сакральных знаний.

НС>Ты LL и описал. Только у LL есть определенные проблемки со сложными приоритетами.


Ну я подозревал что во что-то подобное ткну пальцем.

S>>ЗЫ. Регэкспами, при здравом размышлении, интересный вариант — quick and dirty, но будет работать.


НС>Т.е. про классы грамматик ты не в курсе? Огорчу — приоритеты и скобки ты на регексах не распарсишь, это в регулярные грамматики невпихуемо, даже с фиксированным LA.


Регэкспами можно парсить сбалансированные скобки. Я даже делал это for fun — реализация dotNet Regex поддерживает balanced group matching.
Но в данном случае это не нужно, достаточно нескольких итераций упрощения выражения.
Re[20]: кадровики совсем рехнулись
Здравствуйте, Ночной Смотрящий, Вы писали:

S>>Зачем извращаться: сделать регэкспами парсер учитывающий приоритет операций наверно можно, но это уже эзотерическое программирование.


НС>Да тут рядом предлагали на полном серьезе.


Я на полном серьёзе обдумал, и думаю это возможно. Не за один проход, само собой. Но если несколько раз пройти по выражению, сначала обработав все вложенные скобки
(\([^(]+\))
Заменив их результатом парсинга операций.

Содержимое скобок парсим в два этапа:
1) ([\d*/]+) — умножение и деление, в первую очередь,
2) ([\d+\-]+) — сложение и вычитание.

На выходе получаем число

НС>Как? Или про НКА-ДКА ты все таки слышал?


Нет, я слышал про токенизатор, и думаю что класс, делящий строку на функциональные компоненты для указанного мной примера я напишу и без сакральных знаний.

НС>Ты LL и описал. Только у LL есть определенные проблемки со сложными приоритетами.


Ну я подозревал что во что-то подобное ткну пальцем.

S>>ЗЫ. Регэкспами, при здравом размышлении, интересный вариант — quick and dirty, но будет работать.


НС>Т.е. про классы грамматик ты не в курсе? Огорчу — приоритеты и скобки ты на регексах не распарсишь, это в регулярные грамматики невпихуемо, даже с фиксированным LA.


Регэкспами можно парсить сбалансированные скобки. Я даже делал это for fun — реализация dotNet Regex поддерживает balanced group matching.
Но в данном случае это не нужно, достаточно нескольких итераций упрощения выражения.