Этот вопрос касается построения пользовательских деревьев выражений в .NET с использованием операторов, найденных на С# (или любом другом языке). Я задаю этот вопрос вместе с некоторой справочной информацией.
Для моего управляемого двухфазного 64-битного ассемблера Мне нужна поддержка выражений. Например, можно захотеть собрать:
mystring: DB 'hello, world'
TIMES 64-$+mystring DB ' '
Выражение 64-$+mystring
не должно быть строкой, а действительным действительным выражением с преимуществами синтаксиса и проверки типов и IntelliSense в VS, что-то вроде строк:
64 - Reference.CurrentOffset + new Reference("mystring");
Это выражение не оценивается при его построении. Вместо этого он оценивается позже в моем контексте ассемблера (когда он определяет смещения символа и т.д.)..NET framework (начиная с .NET 3.5) обеспечивает поддержку деревьев выражений, и мне кажется, что он идеально подходит для таких выражений, которые оцениваются позже или где-то еще.
Но я не знаю, как обеспечить, чтобы я мог использовать синтаксис С# (используя +, < <,% и т.д.) для построения дерева выражений. Я хочу предотвратить такие вещи, как:
var expression = AssemblerExpression.Subtract(64,
AssemblerExpression.Add(AssemblerExpression.CurrentOffset(),
AssemblerExpression.Reference("mystring")))
Как бы вы это сделали?
Примечание. Мне нужно дерево выражений, чтобы иметь возможность преобразовать выражение в приемлемое настраиваемое строковое представление и в то же время иметь возможность оценивать его в определенный момент времени, кроме как при его определении.
Объяснение моего примера: 64-$+mystring
. $
- текущее смещение, поэтому это конкретное число, которое неизвестно заранее (но известно во время оценки). mystring
- это символ, который может быть известен или неизвестен во время оценки (например, когда он еще не определен). Вычитание константы C из символа S совпадает с S + -C
. Вычитание двух символов S0 и S1 (S1 - S0
) дает целочисленную разность между двумя значениями символа.
Однако этот вопрос не совсем о том, как оценивать выражения ассемблера, но больше о том, как оценивать любое выражение, в котором есть пользовательские классы (например, символы и $
в примере), и как еще что он может быть довольно напечатан с использованием некоторого посетителя (таким образом, сохраняя дерево). И так как в .NET Framework есть деревья выражений и посетителей, было бы неплохо использовать их, если это возможно.