Вопросы дизайна оценки выражения - PullRequest
4 голосов
/ 04 февраля 2009

Я моделирование системы для оценки выражений. Теперь операнды в этих выражениях могут быть одного из нескольких типов, включая некоторые примитивные типы .NET. При определении моего класса Expression я хочу получить некоторую степень безопасности типов и, следовательно, не хочу использовать «объект» для типа объекта операнда, поэтому я рассматриваю определение абстрактного базового класса операнда, в котором ничего нет, и создание подкласса для каждый тип операнда. Что вы думаете об этом?

Кроме того, только некоторые типы операндов имеют смысл с другими. И, наконец, только некоторые операторы имеют смысл с определенными операндами. Я не могу придумать, как реализовать эти правила во время компиляции, поэтому я думаю, что мне придется выполнять эти проверки во время выполнения.

Любые идеи о том, как я мог бы сделать это лучше?

Ответы [ 4 ]

2 голосов
/ 04 февраля 2009

Я не уверен, есть ли это в языках на основе C, однако в Java есть несколько пакетов, которые действительно имеют для этого смысл.

Компилятор JavaCC или компилятор Java позволяет вам определять язык (например, ваши выражения) и создавать соответствующие классы Java. Несколько более удобным, если не более экспериментальным и академическим пакетом является DemeterJ - он позволяет очень легко указать язык выражений и поставляется с библиотекой для определения посетителей и стратегий для работы над сгенерированной структурой классов. Если бы вы могли позволить себе переключиться на Java, я мог бы попробовать это. В противном случае я бы искал клон C # одной из этих технологий.

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

Обновление: на самом деле это выглядит так, как будто некоторые из этих вещей перенесены на технологию .NET, хотя я не использовал их, поэтому я не уверен, в какой форме это может быть:

http://www.ccs.neu.edu/home/lieber/inside-impl.html

удачи!

1 голос
/ 04 февраля 2009

Как насчет Expression в 3,5? Недавно я написал синтаксический анализатор / компилятор выражений, используя это.

1 голос
/ 04 февраля 2009

Я недавно построил оценщик динамических выражений. Что я нашел эффективным, так это создание, как вы предложили, базового операнда со значимыми производными классами (NumericOperand, StringOperand, DateOperand и т. Д.). В зависимости от вашей реализации, дженерики также могут иметь смысл (Operand).

Благодаря реализации шаблона Visitor вы можете выполнять любые виды проверки, которые вам нравятся.

У меня была особая потребность развернуть собственное решение, но уже есть много вариантов обработки выражений. Возможно, вы захотите взглянуть на некоторые из них для вдохновения или чтобы не изобретать велосипед заново.

0 голосов
/ 29 октября 2010

Я нашел хороший подход для обработки типов объектов с помощью фреймворка EXPRESSIONOASIS. Они используют пользовательскую структуру данных для переноса типов объектов. Поэтому после анализа операнда с помощью регулярных выражений и заданных выражений они определяют тип и сохраняют этот тип как свойство универсального класса, который можно использовать в любое время для получения типа.

http://code.google.com/p/expressionoasis/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...