Кто может посоветовать литературу по синтаксическим деревьям?
Добрый день.
Есть самописная консольная тулза, со своим языком запросов. Есть задача: написать либу для создания запросов к тулзе на C#. Я знаю как сделать ExpressionTree на C#, представляю как запилить синтаксический узел в Roslyn. Как реализовать подобный механизм для собственного языка?
Грубо говоря, есть запрос "Get fullLine from storage Trash where Source is "Universe" and inputDate moreThan 2016-07-12".
Нужна либа, которая позволяет генерить запросы в виде
Query.New.
GetAll().From("Trash")
.Filter("Source", FilterType.Equal, "Universe")
.Filter("inputDate", FilterType.MoreThan, new DateTime(2016,7,12))
.Result;
Если получится как-то вкрутить LINQ - вообще шикарно. Что-то вроде
var query = Storage.Where(row => row.Source == "Universe")
.Where(row => row.inputDate > new DateTime(2016,7,12))
.ToList();
Куда копать? Понадобятся ли мне для решения синтаксические деревья? Если да, какую литературу посоветуете?
Sharp: Поглядел, спасибо. Насколько я понял, там создается ExpressionTree на клиенте, оборачивается, перекидывается на сервер, там разворачивается и выполняется средствами EF или просто IEnumerable.
Мне же надо, чтоб на выходе просто строка была, содержащая запрос.
Но за идею спасибо, EntityFramework ведь генерит запросы к MS SQL, и наверняка там есть преобразования Func в текстовый вид.
Понадобятся ли мне для решения синтаксические деревья? Если да, какую литературу посоветуете?
Есть классическая книжка Ахо, Ульман "Теория синтаксического анализа, перевода и компиляции".
Фактически тебе нужен транслятор с одного языка на другой. Из книжки не научишься, но для развития нужно знать теорию, тем более, если нужно такое делать. Методом угадайки там не получится написать, так как это имеет многоступенчатую структуру, где всё надо делать по порядку.
https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D...
Для наглядности расставим скобки
((Get fullLine) from (storage Trash)) where ((Source is "Universe") and (inputDate moreThan 2016-07-12))
Переводим в польскую
((fullLine Get) (Trash storage ) from ) ((Source "Universe" is) (inputDate 2016-07-12 moreThan ) and ) where
Полученная запись легко может быть преобразована в нужный код раскручиванием стека
Александр Таратин обратная польская поможет мне конвертировать запрос в ExpressionTree. Я решаю обратную задачу: мне нужны C# конструкции, которые конвертируются в запрос.
Oxoron: Я вас понимаю, но в шарп тоже можно, если немного подумать. По этому принципу работают все декомпиляторы Java и AS3 - разворачивают стек байт кода вирт машины в исходный код.