Читайте небинарное выражение с пользовательскими функциями - PullRequest
0 голосов
/ 18 мая 2018

Я хочу прочитать в математических функциях и интерпретировать их.До сих пор я работал с бинарными выражениями и использовал метод Infix to Prefix для чтения моей строки (например, 4 * 3 + 1).

Однако, тем временем, я хочу читать и более сложные выражения, которые не переводятся вдвоичное дерево.

Некоторые примеры:

  1. max (x_1, x_2, x_3, x_4, x_5) + max (y_1, y_2)
  2. round (интерполировать (x_1, x, y), 2)
  3. пользовательская функция (x, y, z) + 4

У меня есть некоторые проблемы, чтобы найти способ перевести данную строку в недвоичное дерево,Как было бы хорошим способом сделать это, есть ли известные методы?Так как мне нужно поддерживать некоторые собственные пользовательские функции, я не могу использовать любую существующую библиотеку.

Я не ожидаю никакого кода, меня интересует теория, делающая это.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Смотрите на ваши пользовательские недвоичные функции так же, как вы смотрите на двоичные выражения.

Например, 2 + 3 * 4 переводится в + (* (3,4), 2) // +и * здесь только имена функций

Вы можете смешивать в пользовательской функции:

Например, ^ 3 + Макс (a, b, c) * 2 переводится в: + (^ (a, 3), * (2, Max (a, b, c))

В вашем интерпретаторе определите, что означают + (), ^ (), Max (), your_custom_function () и какие параметры (т. Е. Childузлы в дереве), чтобы ожидать. Дерево не будет двоичным, но это не меняет способ его создания и обхода.

0 голосов
/ 18 мая 2018

Обычно вам нужно определить грамматику (в данном случае очень простую), которая определяет правила синтаксического анализа вашего текста, а затем сгенерировать синтаксический анализатор, основанный на этой грамматике, через одну из различных библиотек, которыесуществовать.Для такой простой грамматики Antlr , безусловно, преувеличено.Есть серия статей здесь о написании "Написание парсера рекурсивного спуска" или если вы ищете peg (семейство парсеров грамматики) в nuget, вы найдете множествореализации.

Обратите внимание, что эта отрасль информатики довольно обширна ... Вы можете начать отсюда лексеры против парсеров для теоретической части.

...