2009-02-04 5 views
4

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

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

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

+0

Позволь мне знать, если вы застряли - У меня есть рабочий код где-то, что я использовал на прототипе (ссылка) для обработки математики ;-p http://marcgravell.blogspot.com/2009/ 01/above-surface.html –

ответ

1

Как насчет Expression в 3.5? Я недавно написал выражение parser/compiler, используя это.

+0

Я иду по этому пути (деревья выражений). Выражения могут быть написаны очень чисто в LINQ и автоматически превращаются в деревья выражений, которые можно опровергнуть. Все еще пытаясь выработать больше деталей реализации, но некоторые PoC-кодировки выглядят многообещающими! – akshayl

2

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

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

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

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

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

удачи !

1

Недавно я построил динамический анализатор выражений. То, что я нашел эффективным, - это создать, как вы сказали, BaseOperand со значимыми производными классами (NumericOperand, StringOperand, DateOperand и т. Д.). В зависимости от вашей реализации дженерики могут иметь смысл (Операнд).

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

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

0

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

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

Смежные вопросы