Задать вопрос
@Oxoron
Шарпер

Кто может посоветовать литературу по синтаксическим деревьям?

Добрый день.
Есть самописная консольная тулза, со своим языком запросов. Есть задача: написать либу для создания запросов к тулзе на 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();

Куда копать? Понадобятся ли мне для решения синтаксические деревья? Если да, какую литературу посоветуете?
  • Вопрос задан
  • 287 просмотров
Подписаться 2 Оценить 3 комментария
Решения вопроса 1
@abcd0x00
Понадобятся ли мне для решения синтаксические деревья? Если да, какую литературу посоветуете?

Есть классическая книжка Ахо, Ульман "Теория синтаксического анализа, перевода и компиляции".

Фактически тебе нужен транслятор с одного языка на другой. Из книжки не научишься, но для развития нужно знать теорию, тем более, если нужно такое делать. Методом угадайки там не получится написать, так как это имеет многоступенчатую структуру, где всё надо делать по порядку.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Madfisht3
Linq использует расширяющие етоды. К примеру System.Linq.Enumerable. что мешает написать свои методы расширяющие?
Ответ написан
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
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
Полученная запись легко может быть преобразована в нужный код раскручиванием стека
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы