From f3a454ae5fe3fe1d539775e3ab1538bf774f5b0d Mon Sep 17 00:00:00 2001 From: gsv Date: Fri, 19 Apr 2024 12:49:08 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=2012.?= =?UTF-8?q?=20=D0=9F=D1=80=D0=BE=20=D0=BF=D0=B0=D1=80=D1=81=D0=B5=D1=80.?= =?UTF-8?q?=20=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=8F?= =?UTF-8?q?=D0=B7=D1=8B=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/task12.md | 272 +++++++++++++++++------------------------------- 1 file changed, 97 insertions(+), 175 deletions(-) diff --git a/tasks/task12.md b/tasks/task12.md index 7d2da7983..7581ae06a 100644 --- a/tasks/task12.md +++ b/tasks/task12.md @@ -4,252 +4,182 @@ * **Жёсткий дедлайн**: 21.12.2022, 23:59 * Полный балл: 5 -## Описание абстрактного синтаксиса языка - -``` -prog = List - -stmt = - bind of var * expr - | print of expr - -val = - String of string - | Int of int - | // а здесь пространство для творчества - -expr = - Var of var // переменные - | Val of val // константы - | Set_start of Set * expr // задать множество стартовых состояний - | Set_final of Set * expr // задать множество финальных состояний - | Add_start of Set * expr // добавить состояния в множество стартовых - | Add_final of Set * expr // добавить состояния в множество финальных - | Get_start of expr // получить множество стартовых состояний - | Get_final of expr // получить множество финальных состояний - | Get_reachable of expr // получить все пары достижимых вершин - | Get_vertices of expr // получить все вершины - | Get_edges of expr // получить все рёбра - | Get_labels of expr // получить все метки - | Map of lambda * expr // классический map - | Filter of lambda * expr // классический filter - | Load of path // загрузка графа - | Intersect of expr * expr // пересечение языков - | Concat of expr * expr // конкатенация языков - | Union of expr * expr // объединение языков - | Star of expr // замыкание языка (звезда Клини) - | Smb of expr // единичный переход - -lambda = - // а здесь пространство для творчества +## Конкретный синтаксис ``` +prog = stmt* -Выразительные возможности лямбды должны позволять решать такие задачи как получение достижимых вершин, получение вершин из которых достижимы некоторые, получение пар вершин, между которыми существует путь, удовлетворяющий ограничению. +stmt = bind | add | remove | declare -Пример запроса в некотором гипотетическом конкретном синтаксисе. +declare = VAR 'is' 'graph' -``` -let g' = load graph "wine" +bind = 'let' VAR '=' expr -let g = set start of (set finals of g' to (vertices of g')) to {0..100} +remove = 'remove' ('vertex' | 'edge' | 'vertices') expr 'from' VAR -let l1 = "l1" | "l2" +add = 'add' ('vertex' | 'edge') expr 'to' VAR -let q1 = ("type" | l1)* -let q2 = "sub_class_of" | l1 | q2 +expr = NUM | CHAR | VAR | edge_expr | set_expr | regexp | select -let res1 = g & q1 -let res2 = g & q2 +set_expr = '[' expr (',' expr)* ']' -print res1 +edge_expr = '(' expr ',' expr ',' expr ')' -let s = start set of g +regexp = CHAR | VAR | '(' regexp ')' | (regexp '|' regexp) | (regexp '^' range) | (regexp '.' regexp) | (regexp '&' regexp) -let vertices1 = filter (fun v -> v in s) (map (fun ((u_g,u_q1),l,(v_g,v_q1)) -> u_g) (get edges of res1)) -let vertices2 = filter (fun v -> v in s) (map (fun ((u_g,u_q2),l,(v_g,v_q2)) -> u_g) (get edges of res2)) -let vertices = vertices1 & vertices2 +range = '[' NUM '..' NUM? ']' -print vertices +select = v_filter? v_filter? 'return' VAR (',' VAR)? 'where' VAR 'reachable' 'from' VAR 'in' VAR 'by' expr -``` +v_filter = 'for' VAR 'in' expr -## Правила вывода типов - -Константы типизируются очевидным образом. - -Тип переменной определяется типом выражения, с которым она связана. -``` -[b(v)] => t -_________________ -[Var (v)](b) => t -``` - -Загрузить можно только автомат. -``` -_________________________ -[Load (p)](b) => FA -``` +VAR = [a..z]+[a..z 0..1]* +NUM = [1..9]+[0..9]* +CHAR = '"' [a..z] '"' -Установка финальных состояний, а так же добавление стартовых и финальных типизируется аналогично типизации установки стартовых, которая приведена ниже. ``` -[s](b) => Set ; [e](b) => FA -___________________________________ -[Set_start (s, e)](b) => FA - -[s](b) => Set ; [e](b) => RSM -____________________________________ -[Set_start (s, e)](b) => RSM +Пример запроса. ``` +let g is graph -Получение финальных типизируется аналогично получению стартовых, правила для которого приведены ниже. -``` -[e](b) => FA -____________________________ -[Get_start (e)](b) => Set +add edge (1, "a", 2) to g +add edge (2, "a", 3) to g +add edge (3, "a", 1) to g +add edge (1, "c", 0) to g +add edge (0, "b", 4) to g +add edge (4, "b", 0) to g +let q = "a"^[1..3] . q . "b"^[2..3] | "c" -[e](b) => RSM -____________________________ -[Get_start (e)](b) => Set +let r1 = for v in [2] return u where u reachable from v in g by q -``` - -``` -[e](b) => FA -__________________________________ -[Get_reachable (e)](b) => Set +add edge (0, "d", 5) to g - -[e](b) => RSM -__________________________________ -[Get_reachable (e)](b) => Set - -``` +let r2 = for v in [2,3] return u,v where u reachable from v in g by (q . "d") ``` -[e](b) => FA -_______________________________ -[Get_vertices (e)](b) => Set +## Правила вывода типов -[e](b) => RSM -_______________________________ -[Get_vertices (e)](b) => Set - - -[e](b) => FA -______________________________________ -[Get_edges (e)](b) => Set - - -[e](b) => RSM -______________________________________ -[Get_edges (e)](b) => Set - -[e](b) => FA -__________________________________ -[Get_labels (e)](b) => Set - - -[e](b) => RSM -__________________________________ -[Get_labels (e)](b) => Set - -``` +Константы типизируются очевидным образом. -Правила для ```map``` и ```filter``` традиционные. +Тип переменной определяется типом выражения, с которым она связана. ``` -[f](b) => t1 -> t2 ; [q](b) => Set -_______________________________________ -[Map (f,q)](b) => Set - - -[f](b) => t1 -> bool ; [q](b) => Set -________________________________________ -[Filter (f,q)](b) => Set +[b(v)] => t +_________________ +[Var (v)](b) => t ``` Пересечение для двух КС не определено. + ``` -[e1](b) => FA ; [e2](b) => FA +[e1](b) => FA ; [e2](b) => FA ______________________________________ -[Intersect (e1, e2)](b) => FA +[Intersect (e1, e2)](b) => FA -[e1](b) => FA ; [e2](b) => RSM +[e1](b) => FA ; [e2](b) => RSM _______________________________________ -[Intersect (e1, e2)](b) => RSM +[Intersect (e1, e2)](b) => RSM -[e1](b) => RSM ; [e2](b) => FA +[e1](b) => RSM ; [e2](b) => FA _______________________________________ -[Intersect (e1, e2)](b) => RSM +[Intersect (e1, e2)](b) => RSM ``` Остальные операции над автоматами типизируются согласно формальных свойств классов языков. ``` -[e1](b) => FA ; [e2](b) => FA +[e1](b) => FA ; [e2](b) => FA _____________________________________ -[Concat (e1, e2)](b) => FA +[Concat (e1, e2)](b) => FA -[e1](b) => FA ; [e2](b) => RSM +[e1](b) => FA ; [e2](b) => RSM ______________________________________ -[Concat (e1, e2)](b) => RSM +[Concat (e1, e2)](b) => RSM -[e1](b) => RSM ; [e2](b) => FA +[e1](b) => RSM ; [e2](b) => FA ______________________________________ -[Concat (e1, e2)](b) => RSM +[Concat (e1, e2)](b) => RSM -[e1](b) => RSM ; [e2](b) => RSM +[e1](b) => RSM ; [e2](b) => RSM ______________________________________ -[Concat (e1, e2)](b) => RSM +[Concat (e1, e2)](b) => RSM ``` ``` -[e1](b) => FA ; [e2](b) => FA +[e1](b) => FA ; [e2](b) => FA ______________________________________ -[Union (e1, e2)](b) => FA +[Union (e1, e2)](b) => FA -[e1](b) => FA ; [e2](b) => RSM +[e1](b) => FA ; [e2](b) => RSM _______________________________________ -[Union (e1, e2)](b) => RSM +[Union (e1, e2)](b) => RSM -[e1](b) => RSM ; [e2](b) => FA +[e1](b) => RSM ; [e2](b) => FA _______________________________________ -[Union (e1, e2)](b) => RSM +[Union (e1, e2)](b) => RSM -[e1](b) => RSM ; [e2](b) => RSM +[e1](b) => RSM ; [e2](b) => RSM _______________________________________ -[Union (e1, e2)](b) => RSM +[Union (e1, e2)](b) => RSM ``` ``` -[e](b) => FA +[e](b) => FA ______________________ -[Star (e)](b) => FA +[Repeat (e)](b) => FA -[e](b) => RSM +[e](b) => RSM ______________________ -[Star (e)](b) => RSM +[Repeat (e)](b) => RSM ``` ``` -[e](b) => string +[e](b) => char ________________________ -[Smb (e)](b) => FA +[Smb (e)](b) => FA + +``` + +Запрос возвращает множество (вершин или пар вершин) + +``` +[e](b) => Set +_______________________________ +[VFilter (v, e)](b) => Set + + +[q](b) => RSM, [ret](b) => int +_____________________________________________________ +[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set + + +[q](b) => FA, [ret](b) => int +_____________________________________________________ +[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set + + +[q](b) => FA, [ret](b) => int * int +____________________________________________________________ +[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set + + +[q](b) => RSM, [ret](b) => int * int +____________________________________________________________ +[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set ``` @@ -265,17 +195,9 @@ _____________________________________ ``` -Загрузить можно только автомат и у него все вершины будут стартовыми и финальными. - -``` -[p](b1) => s,b2 ; read_fa_from_file s => fa -_____________________________________ -[Load (p)](b1) => (fa | fa.start = fa.vertices, fa.final = fa.vertices), b1 - -``` +Результатом исполнения программы является словарь, где ключ --- имя переменной в связывании, у которого в правой части select, а значение --- результат вычисления соответствующего запроса. ## Задача -Решение задачи оформляется в виде .md файла в репозитории. Как вариант --- сделать описание языка частью readme. В качестве примера описания языка можно использовать, например, [спецификацию F#](https://fsharp.org/specs/language-spec/4.1/FSharpSpec-4.1-latest.pdf) или [спецификацию Java](https://docs.oracle.com/javase/specs/jls/se11/html/index.html). - - [ ] Расширить абстрактный синтаксис в местах, указанных в его описании (```val```, ```lambda```) - - [ ] Описать конкретный синтаксис языка запросов в виде грамматики (на основе получившегося абстрактного синтаксиса). При необходимости выделить лексическую спецификацию (описание лексики). Постарайтесь, чтобы, с одной стороны, синтаксис был достаточно уникальным, но с другой, достаточно разумным и на получившемся языке можно было писать без сильной боли. - - [ ] Привести примеры скриптов на получившемся языке. Не забыть описать, что же эти скрипты делают. +- [ ] С использованием ANTLR реализовать синтаксический анализатор предложенного выше языка. А именно, реализовать функцию, которая принимает строку и возвращает дерево разбора. +- [ ] Реализовать функцию, которая по дереву разбора возвращает количество узлов в нём. +- [ ] Реализовать функцию, которая по дереву разбора строит строку, которая была разобрана. From f2623ba624561dc3c08c395965619c7e1b9293d5 Mon Sep 17 00:00:00 2001 From: gsv Date: Fri, 19 Apr 2024 14:20:06 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BD=D1=83=D0=BC=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8E?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87.=20=D0=A3=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/task10.md | 48 +++-- tasks/{task11_bonus.md => task10_bonus.md} | 2 +- tasks/task11.md | 234 +++++++++++++++++---- tasks/task12.md | 221 ++----------------- tasks/task13.md | 16 -- tasks/task14.md | 26 --- tasks/task_CYK.md | 19 -- 7 files changed, 257 insertions(+), 309 deletions(-) rename tasks/{task11_bonus.md => task10_bonus.md} (98%) delete mode 100644 tasks/task13.md delete mode 100644 tasks/task14.md delete mode 100644 tasks/task_CYK.md diff --git a/tasks/task10.md b/tasks/task10.md index dd5513a06..e52dd806f 100644 --- a/tasks/task10.md +++ b/tasks/task10.md @@ -1,16 +1,40 @@ -# Задача 11. Тензорный алгоритм решения задачи достижимости с КС ограничениями +# Задача 10. Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями -* **Мягкий дедлайн**: 27.11.2022, 23:59 -* **Жёсткий дедлайн**: 30.11.2022, 23:59 -* Полный балл: 5 +* **Мягкий дедлайн**: !!!, 23:59 +* **Жёсткий дедлайн**: !!!, 23:59 +* Полный балл: 19 ## Задача -- [ ] Реализовать **функцию**, основанную на тензорном алгоритме, решающую задачу достижимости между всеми парами вершин для заданного графа и заданной КС грамматики. - - Результат работы функции --- множество троек вида (вершина, нетерминал, вершина). - - Предусмотрите возможность получать граф из различных источников в различных форматах. - - Предусмотрите возможность получать грамматику из различных источников (из файла, как результат работы других функций). - - Для преобразования грамматики в РКА использовать результаты предыдущих работ. - - Для реализации матричных операций использовать [sciPy](https://docs.scipy.org/doc/scipy/reference/sparse.html). -- [ ] На основе предыдущей функции реализовать функцию, позволяющую решать задачу достижимости для заданного набора стартовых и финальных вершин, и заданного нетерминала. -- [ ] Добавить необходимые тесты. +Задача посвящена анализу производительности различных алгоритмов решения задачи достижимости между всеми парами вершин с контекстно-свободными ограничениями: алгоритма Хеллингса, матричного алгоритма, тензорного алгоритма. В ходе анализа необходимо ответить на следующие вопросы. +- Какой из трёх указанных алгоритмов обладает лучшей производительностью? +- Имеет ли смысл для решения задачи достижимости с регулярными ограничениями использовать алгоритмы для КС ограничений (ведь регулярные --- частный случай КС) или всё же лучше использовать специализированные алгоритмы для регулярных ограничений? + +Решение данной задачи оформляется как Python notebook. Для того, чтобы обеспечить возможность проверки, необходимо сделать notebook самодостаточным: в него должны быть включены все действия, необходимые для воспроизведения эксперимента. Также в notebook размещается отчет и анализ результатов ваших экспериментов в текстовом виде. Отчет сопровождается диаграммами, таблицами, картинками, если это необходимо для объяснения результатов. + +Решением является не просто код, но отчёт об экспериментальном исследовании, который должен являться связанным текстом и содержать (как минимум) следующие разделы: +- Постановка задачи +- Описание исследуемых решений +- Описание набора данных для экспериментов + - Графы + - Запросы +- Описание эксперимента + - Оборудование + - Что и как замерялось, как эти измерения должны помочь ответить на поставленные вопросы +- Результаты экспериментов + - Графики, таблицы +- Анализ результатов экспериментов + - Ответы на поставленные вопросы, аргументация ответов + +- [ ] Создать Python notebook, подключить необходимые зависимости. +- [ ] Подключить необходимые решения из предыдущих работ. +- [ ] Сформировать набор данных. + - [ ] Выбрать некоторые графы из [набора](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/index.html). Не забудьте обосновать, почему выбрали именно эти графы. Обратите внимание, что в наборе есть графы и грамматики для различных прикладных задач (анализ RDF, анализ указателей в С, анализ Java-программ). Рекомендуется выбирать графы, относящиеся к различным областям. + - [ ] В качестве запросов предлагается использовать грамматики из раздела "Canonical grammars" в описании соответствующего графа ([пример](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/data/taxonomy_hierarchy.html#canonical-grammars)). +- [ ] Сформулировать этапы эксперимента. Что нужно сделать, чтобы ответить на поставленные вопросы? Почему? +- [ ] Провести необходимые эксперименты, замеры +- [ ] Оформить результаты экспериментов +- [ ] Провести анализ результатов + - [ ] Ответить на поставленные вопросы + - [ ] Аргументировать ответы (пользуясь полученными результатами экспериментов) +- [ ] Не забыть опубликовать notebook в репозитории diff --git a/tasks/task11_bonus.md b/tasks/task10_bonus.md similarity index 98% rename from tasks/task11_bonus.md rename to tasks/task10_bonus.md index 52f52b4c5..1c8ebec69 100644 --- a/tasks/task11_bonus.md +++ b/tasks/task10_bonus.md @@ -1,4 +1,4 @@ -# Задача 12. Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями +# Задача 10. Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями * **Мягкий дедлайн**: 11.12.2022, 23:59 * **Жёсткий дедлайн**: 14.12.2022, 23:59 diff --git a/tasks/task11.md b/tasks/task11.md index 1d09fbbe9..531248c16 100644 --- a/tasks/task11.md +++ b/tasks/task11.md @@ -1,40 +1,202 @@ -# Задача 12. Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями +# Задача 11. Язык запросов к графам -* **Мягкий дедлайн**: 11.12.2022, 23:59 -* **Жёсткий дедлайн**: 14.12.2022, 23:59 +* **Жёсткий дедлайн**: 15.05.2024, 23:59 * Полный балл: 10 -## Задача +## Конкретный синтаксис +``` +prog = stmt* + +stmt = bind | add | remove | declare + +declare = VAR 'is' 'graph' + +bind = 'let' VAR '=' expr + +remove = 'remove' ('vertex' | 'edge' | 'vertices') expr 'from' VAR + +add = 'add' ('vertex' | 'edge') expr 'to' VAR + +expr = NUM | CHAR | VAR | edge_expr | set_expr | regexp | select + +set_expr = '[' expr (',' expr)* ']' + +edge_expr = '(' expr ',' expr ',' expr ')' + +regexp = CHAR | VAR | '(' regexp ')' | (regexp '|' regexp) | (regexp '^' range) | (regexp '.' regexp) | (regexp '&' regexp) + +range = '[' NUM '..' NUM? ']' + +select = v_filter? v_filter? 'return' VAR (',' VAR)? 'where' VAR 'reachable' 'from' VAR 'in' VAR 'by' expr + +v_filter = 'for' VAR 'in' expr + +VAR = [a..z]+[a..z 0..1]* +NUM = [1..9]+[0..9]* +CHAR = '"' [a..z] '"' + +``` + +Пример запроса. + +``` +let g is graph + +add edge (1, "a", 2) to g +add edge (2, "a", 3) to g +add edge (3, "a", 1) to g +add edge (1, "c", 0) to g +add edge (0, "b", 4) to g +add edge (4, "b", 0) to g + +let q = "a"^[1..3] . q . "b"^[2..3] | "c" + +let r1 = for v in [2] return u where u reachable from v in g by q + +add edge (0, "d", 5) to g + +let r2 = for v in [2,3] return u,v where u reachable from v in g by (q . "d") + +``` + +## Правила вывода типов + +Константы типизируются очевидным образом. + +Тип переменной определяется типом выражения, с которым она связана. +``` +[b(v)] => t +_________________ +[Var (v)](b) => t +``` + +Пересечение для двух КС не определено. + +``` +[e1](b) => FA ; [e2](b) => FA +______________________________________ +[Intersect (e1, e2)](b) => FA + + +[e1](b) => FA ; [e2](b) => RSM +_______________________________________ +[Intersect (e1, e2)](b) => RSM + + +[e1](b) => RSM ; [e2](b) => FA +_______________________________________ +[Intersect (e1, e2)](b) => RSM + +``` + +Остальные операции над автоматами типизируются согласно формальных свойств классов языков. +``` +[e1](b) => FA ; [e2](b) => FA +_____________________________________ +[Concat (e1, e2)](b) => FA + + +[e1](b) => FA ; [e2](b) => RSM +______________________________________ +[Concat (e1, e2)](b) => RSM + -Задача посвящена анализу производительности различных алгоритмов решения задачи достижимости между всеми парами вершин с контекстно-свободными ограничениями: алгоритма Хеллингса, матричного алгоритма, тензорного алгоритма. В ходе анализа необходимо ответить на следующие вопросы. -- Какой из трёх указанных алгоритмов обладает лучшей производительностью? -- Имеет ли смысл для решения задачи достижимости с регулярными ограничениями использовать алгоритмы для КС ограничений (ведь регулярные --- частный случай КС) или всё же лучше использовать специализированные алгоритмы для регулярных ограничений? - -Решение данной задачи оформляется как Python notebook. Для того, чтобы обеспечить возможность проверки, необходимо сделать notebook самодостаточным: в него должны быть включены все действия, необходимые для воспроизведения эксперимента. Также в notebook размещается отчет и анализ результатов ваших экспериментов в текстовом виде. Отчет сопровождается диаграммами, таблицами, картинками, если это необходимо для объяснения результатов. - -Решением является не просто код, но отчёт об экспериментальном исследовании, который должен являться связанным текстом и содержать (как минимум) следующие разделы: -- Постановка задачи -- Описание исследуемых решений -- Описание набора данных для экспериментов - - Графы - - Запросы -- Описание эксперимента - - Оборудование - - Что и как замерялось, как эти измерения должны помочь ответить на поставленные вопросы -- Результаты экспериментов - - Графики, таблицы -- Анализ результатов экспериментов - - Ответы на поставленные вопросы, аргументация ответов - -- [ ] Создать Python notebook, подключить необходимые зависимости. -- [ ] Подключить необходимые решения из предыдущих работ. -- [ ] Сформировать набор данных. - - [ ] Выбрать некоторые графы из [набора](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/index.html). Не забудьте обосновать, почему выбрали именно эти графы. Обратите внимание, что в наборе есть графы и грамматики для различных прикладных задач (анализ RDF, анализ указателей в С, анализ Java-программ). Рекомендуется выбирать графы, относящиеся к различным областям. - - [ ] В качестве запросов предлагается использовать грамматики из раздела "Canonical grammars" в описании соответствующего графа ([пример](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/data/taxonomy_hierarchy.html#canonical-grammars)). -- [ ] Сформулировать этапы эксперимента. Что нужно сделать, чтобы ответить на поставленные вопросы? Почему? -- [ ] Провести необходимые эксперименты, замеры -- [ ] Оформить результаты экспериментов -- [ ] Провести анализ результатов - - [ ] Ответить на поставленные вопросы - - [ ] Аргументировать ответы (пользуясь полученными результатами экспериментов) -- [ ] Не забыть опубликовать notebook в репозитории +[e1](b) => RSM ; [e2](b) => FA +______________________________________ +[Concat (e1, e2)](b) => RSM + + +[e1](b) => RSM ; [e2](b) => RSM +______________________________________ +[Concat (e1, e2)](b) => RSM + +``` + +``` +[e1](b) => FA ; [e2](b) => FA +______________________________________ +[Union (e1, e2)](b) => FA + + +[e1](b) => FA ; [e2](b) => RSM +_______________________________________ +[Union (e1, e2)](b) => RSM + + +[e1](b) => RSM ; [e2](b) => FA +_______________________________________ +[Union (e1, e2)](b) => RSM + + +[e1](b) => RSM ; [e2](b) => RSM +_______________________________________ +[Union (e1, e2)](b) => RSM + +``` + +``` +[e](b) => FA +______________________ +[Repeat (e)](b) => FA + + +[e](b) => RSM +______________________ +[Repeat (e)](b) => RSM + +``` + +``` +[e](b) => char +________________________ +[Symbol (e)](b) => FA + +``` + +Запрос возвращает множество (вершин или пар вершин) + +``` +[e](b) => Set +_______________________________ +[VFilter (v, e)](b) => Set + + +[q](b) => RSM, [ret](b) => int +_____________________________________________________ +[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set + + +[q](b) => FA, [ret](b) => int +_____________________________________________________ +[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set + + +[q](b) => FA, [ret](b) => int * int +____________________________________________________________ +[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set + + +[q](b) => RSM, [ret](b) => int * int +____________________________________________________________ +[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set + +``` + + +## Динамическая семантика языка запросов + +Связывание переопределяет имя. + +``` +[e](b1) => x,b2 +_____________________________________ +[Bind (v, e)](b1) => (), (b1(v) <= x) + +``` + +Результатом исполнения программы является словарь, где ключ --- имя переменной в связывании, у которого в правой части select, а значение --- результат вычисления соответствующего запроса. + +## Задача +- [ ] С использованием ANTLR реализовать синтаксический анализатор предложенного выше языка. А именно, реализовать функцию, которая принимает строку и возвращает дерево разбора. +- [ ] Реализовать функцию, которая по дереву разбора возвращает количество узлов в нём. +- [ ] Реализовать функцию, которая по дереву разбора строит строку, которая была разобрана. diff --git a/tasks/task12.md b/tasks/task12.md index 7581ae06a..7dbdd1a39 100644 --- a/tasks/task12.md +++ b/tasks/task12.md @@ -1,203 +1,26 @@ -# Задача 13. Язык запросов к графам +# Задача 12. Интерпретатор языка запросов к графам -* **Мягкий дедлайн**: 18.12.2022, 23:59 -* **Жёсткий дедлайн**: 21.12.2022, 23:59 -* Полный балл: 5 +* **Мягкий дедлайн**: <за неделю перед экзаменом>, 23:59 +* **Жёсткий дедлайн**: <день консультации перед экзаменом>, 23:59 +* Полный балл: 20 -## Конкретный синтаксис -``` -prog = stmt* - -stmt = bind | add | remove | declare - -declare = VAR 'is' 'graph' - -bind = 'let' VAR '=' expr - -remove = 'remove' ('vertex' | 'edge' | 'vertices') expr 'from' VAR - -add = 'add' ('vertex' | 'edge') expr 'to' VAR - -expr = NUM | CHAR | VAR | edge_expr | set_expr | regexp | select - -set_expr = '[' expr (',' expr)* ']' - -edge_expr = '(' expr ',' expr ',' expr ')' - -regexp = CHAR | VAR | '(' regexp ')' | (regexp '|' regexp) | (regexp '^' range) | (regexp '.' regexp) | (regexp '&' regexp) - -range = '[' NUM '..' NUM? ']' - -select = v_filter? v_filter? 'return' VAR (',' VAR)? 'where' VAR 'reachable' 'from' VAR 'in' VAR 'by' expr - -v_filter = 'for' VAR 'in' expr - -VAR = [a..z]+[a..z 0..1]* -NUM = [1..9]+[0..9]* -CHAR = '"' [a..z] '"' - -``` - -Пример запроса. - -``` -let g is graph - -add edge (1, "a", 2) to g -add edge (2, "a", 3) to g -add edge (3, "a", 1) to g -add edge (1, "c", 0) to g -add edge (0, "b", 4) to g -add edge (4, "b", 0) to g - -let q = "a"^[1..3] . q . "b"^[2..3] | "c" - -let r1 = for v in [2] return u where u reachable from v in g by q - -add edge (0, "d", 5) to g - -let r2 = for v in [2,3] return u,v where u reachable from v in g by (q . "d") - -``` - -## Правила вывода типов - -Константы типизируются очевидным образом. - -Тип переменной определяется типом выражения, с которым она связана. -``` -[b(v)] => t -_________________ -[Var (v)](b) => t -``` - -Пересечение для двух КС не определено. - -``` -[e1](b) => FA ; [e2](b) => FA -______________________________________ -[Intersect (e1, e2)](b) => FA - - -[e1](b) => FA ; [e2](b) => RSM -_______________________________________ -[Intersect (e1, e2)](b) => RSM - - -[e1](b) => RSM ; [e2](b) => FA -_______________________________________ -[Intersect (e1, e2)](b) => RSM - -``` - -Остальные операции над автоматами типизируются согласно формальных свойств классов языков. -``` -[e1](b) => FA ; [e2](b) => FA -_____________________________________ -[Concat (e1, e2)](b) => FA - - -[e1](b) => FA ; [e2](b) => RSM -______________________________________ -[Concat (e1, e2)](b) => RSM - - -[e1](b) => RSM ; [e2](b) => FA -______________________________________ -[Concat (e1, e2)](b) => RSM - - -[e1](b) => RSM ; [e2](b) => RSM -______________________________________ -[Concat (e1, e2)](b) => RSM - -``` - -``` -[e1](b) => FA ; [e2](b) => FA -______________________________________ -[Union (e1, e2)](b) => FA - - -[e1](b) => FA ; [e2](b) => RSM -_______________________________________ -[Union (e1, e2)](b) => RSM - - -[e1](b) => RSM ; [e2](b) => FA -_______________________________________ -[Union (e1, e2)](b) => RSM - - -[e1](b) => RSM ; [e2](b) => RSM -_______________________________________ -[Union (e1, e2)](b) => RSM - -``` - -``` -[e](b) => FA -______________________ -[Repeat (e)](b) => FA - - -[e](b) => RSM -______________________ -[Repeat (e)](b) => RSM - -``` - -``` -[e](b) => char -________________________ -[Smb (e)](b) => FA - -``` - -Запрос возвращает множество (вершин или пар вершин) - -``` -[e](b) => Set -_______________________________ -[VFilter (v, e)](b) => Set - - -[q](b) => RSM, [ret](b) => int -_____________________________________________________ -[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set - - -[q](b) => FA, [ret](b) => int -_____________________________________________________ -[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set - - -[q](b) => FA, [ret](b) => int * int -____________________________________________________________ -[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set - - -[q](b) => RSM, [ret](b) => int * int -____________________________________________________________ -[Select (vf1, vf2, ret, v1, v2, g, q)](b) => Set - -``` - - -## Динамическая семантика языка запросов - -Связывание переопределяет имя. - -``` -[e](b1) => x,b2 -_____________________________________ -[Bind (v, e)](b1) => (), (b1(v) <= x) - -``` - -Результатом исполнения программы является словарь, где ключ --- имя переменной в связывании, у которого в правой части select, а значение --- результат вычисления соответствующего запроса. ## Задача -- [ ] С использованием ANTLR реализовать синтаксический анализатор предложенного выше языка. А именно, реализовать функцию, которая принимает строку и возвращает дерево разбора. -- [ ] Реализовать функцию, которая по дереву разбора возвращает количество узлов в нём. -- [ ] Реализовать функцию, которая по дереву разбора строит строку, которая была разобрана. +В данной задаче необходимо разработать интерпретатор языка запросов согласно спецификации, разработанной в работе 13. Интерпретатор должен быть консольной утилитой и принимать на вход файл, исполнять его, сообщать в консоль о статусе исполнения (завершилось успешно, завершилось с ошибкой). Обратите внимание, что для "публикации" результатов вычислений в языке предусмотрена функция ```print```. Также обратите внимание на адекватность сообщений об исключительных ситуациях (некорректный вход, проблемы с типизацией и т.д.) + +Так как интерпретатор --- достаточно сложный проект, для него необходима документация. Частью документации будет спецификация языка из работы 13. Дополнительно необходимо задокументировать особенности системы типов, используемые алгоритмы запросов. + +Прежде чем писать код, продумайте его архитектуру. Предусмотрите возможности для тестирования отдельных функций, отдельной функциональности (скажем, тестирование системы типов). + + - [ ] Разработать и описать (в документации) механизм вывода или проверки типов, гарантирующий корректность построения запросов (в частности, что не строится пересечение двух контекстно-свободных языков, или что состояния автоматов задаются значениями допустимых типов). + - Типизация должна быть строгой. + - Типизация может быть как статической, так и динамической. + - Можно использовать как вывод типов, так и проверку типов. + - Работа системы типов должна соответствовать правилам, указанным в постановке задачи 13 и в вашем её решении (возможны тонкости с частями, абстрактный синтаксис для которых требовалось придумать самостоятельно). + - Постарайтесь сделать сообщения об ошибках максимально дружественными к пользователю. + - [ ] Из множества реализованных в предыдущих работах алгоритмов выполнения запросов к графам выбрать те, которые будут использоваться в интерпретаторе. Обосновать свой выбор (зафиксировать в документации). + - [ ] Используя парсер из работы 14, разработанную систему вывода или проверки типов, выбранные алгоритмы, реализовать интерпретатор языка, описанного в работе 13. + - Хотя конечное решение и должно быть консольной утилитой, предусмотрите возможности для тестирования. Например, сделайте так, чтобы вход можно было получить из строки и, например, "перехватить" результаты вычислений для их проверки в тестах. + - Проследите за адекватностью сообщений об ошибках. + - Постарайтесь максимально использовать возможности ANTLR по работе с деревом разбора. + - [ ] Добавить необходимые тесты. Тут, как и с парсером, тестов много не бывает. И, как и с парсером, они должны быть атомарными. При этом и на сложных входах надо не забыть протестировать. diff --git a/tasks/task13.md b/tasks/task13.md deleted file mode 100644 index 7fc37301c..000000000 --- a/tasks/task13.md +++ /dev/null @@ -1,16 +0,0 @@ -# Задача 14. Парсер языка запросов к графам - -* **Мягкий дедлайн**: 25.12.2022, 23:59 -* **Жёсткий дедлайн**: 28.12.2022, 23:59 -* Полный балл: 8 - -## Задача -Используя [ANTLR](https://www.antlr.org/) разработать парсер языка запросов, разработанного в предыдущей домашней работе. - - [ ] Написать лексическую и синтаксическую спецификации для ANTLR, задающие конкретный синтаксис языка, разработанного в предыдущей работе. - - В этот момент неплохо бы добавить в репозиторий инструкции по генерации парсера. - - [ ] Реализовать **функцию** синтаксического анализа, проверяющую, принадлежит вход языку. Постарайтесь абстрагироваться от того, как именно получен исходный текст: прочитан из файла, из строки, с консоли. - - [ ] Расширить процесс сборки на сервере шагом генерации парсера по спецификации. Обратите внимание, что генерируемые по спецификации файлы не выкладываются в репозиторий. - - [ ] Используя генерируемые ANTLR заготовки для работы с деревом (visitor или listener), реализовать **функцию**, генерирующую описание дерева разбора для данного входа в заданный файл в формате [DOT](https://graphviz.org/doc/info/lang.html). - - Постарайтесь абстрагироваться от того, откуда именно получен вход: прочитан из файла, из строки, с консоли. - - Не забывайте, что править сгенерированные по грамматике файлы не стоит. Они генерируются заново при каждой сборке, так что ваши изменения будут потеряны. - - [ ] Добавить необходимые тесты. Обратите внимание, что тесты должны быть маленькими (атомарными). Не надо писать один большой скрипт и отдавать его парсеру. Лучше реализовать набор тестов: по тесту на каждую синтаксическую конструкцию и на её вариации. Далее добавить тесты на некоторые композиции конструкций. Тесты на некорректных входах тоже полезны. В целом же нужно действовать исходя из мысли, что для парсера тестов много не бывает. diff --git a/tasks/task14.md b/tasks/task14.md deleted file mode 100644 index 2a96493ae..000000000 --- a/tasks/task14.md +++ /dev/null @@ -1,26 +0,0 @@ -# Задача 16. Интерпретатор языка запросов к графам - -* **Мягкий дедлайн**: <за неделю перед экзаменом>, 23:59 -* **Жёсткий дедлайн**: <день консультации перед экзаменом>, 23:59 -* Полный балл: 20 - - -## Задача -В данной задаче необходимо разработать интерпретатор языка запросов согласно спецификации, разработанной в работе 13. Интерпретатор должен быть консольной утилитой и принимать на вход файл, исполнять его, сообщать в консоль о статусе исполнения (завершилось успешно, завершилось с ошибкой). Обратите внимание, что для "публикации" результатов вычислений в языке предусмотрена функция ```print```. Также обратите внимание на адекватность сообщений об исключительных ситуациях (некорректный вход, проблемы с типизацией и т.д.) - -Так как интерпретатор --- достаточно сложный проект, для него необходима документация. Частью документации будет спецификация языка из работы 13. Дополнительно необходимо задокументировать особенности системы типов, используемые алгоритмы запросов. - -Прежде чем писать код, продумайте его архитектуру. Предусмотрите возможности для тестирования отдельных функций, отдельной функциональности (скажем, тестирование системы типов). - - - [ ] Разработать и описать (в документации) механизм вывода или проверки типов, гарантирующий корректность построения запросов (в частности, что не строится пересечение двух контекстно-свободных языков, или что состояния автоматов задаются значениями допустимых типов). - - Типизация должна быть строгой. - - Типизация может быть как статической, так и динамической. - - Можно использовать как вывод типов, так и проверку типов. - - Работа системы типов должна соответствовать правилам, указанным в постановке задачи 13 и в вашем её решении (возможны тонкости с частями, абстрактный синтаксис для которых требовалось придумать самостоятельно). - - Постарайтесь сделать сообщения об ошибках максимально дружественными к пользователю. - - [ ] Из множества реализованных в предыдущих работах алгоритмов выполнения запросов к графам выбрать те, которые будут использоваться в интерпретаторе. Обосновать свой выбор (зафиксировать в документации). - - [ ] Используя парсер из работы 14, разработанную систему вывода или проверки типов, выбранные алгоритмы, реализовать интерпретатор языка, описанного в работе 13. - - Хотя конечное решение и должно быть консольной утилитой, предусмотрите возможности для тестирования. Например, сделайте так, чтобы вход можно было получить из строки и, например, "перехватить" результаты вычислений для их проверки в тестах. - - Проследите за адекватностью сообщений об ошибках. - - Постарайтесь максимально использовать возможности ANTLR по работе с деревом разбора. - - [ ] Добавить необходимые тесты. Тут, как и с парсером, тестов много не бывает. И, как и с парсером, они должны быть атомарными. При этом и на сложных входах надо не забыть протестировать. diff --git a/tasks/task_CYK.md b/tasks/task_CYK.md deleted file mode 100644 index 58d5ec754..000000000 --- a/tasks/task_CYK.md +++ /dev/null @@ -1,19 +0,0 @@ -# Задача 8. Алгоритм CYK - -* **Мягкий дедлайн**: 06.11.2022, 23:59 -* **Жёсткий дедлайн**: 09.11.2022, 23:59 -* Полный балл: 5 - -## Алгоритм CYK - -Алгоритм CYK является частным случаем алгоритма Хеллингса: CYK решает задачу проверки выводимости для строки методом динамического программирования. - -В данной задаче необходимо реализовать именно CYK, а не реализовать алгоритм Хеллингса и запустить его на линейном входе (строке). - -## Задача - -- [ ] Реализовать **функцию**, основанную на алгоритме CYK и проверяющую выводимость заданной строки в заданной КС грамматике. - - Обратите внимание, что CYK в классическом варианте работает с грамматикой именно в НФХ (не ОНФХ). Так что если для преобразования в НФХ используется pyformlang, то нужно быть аккуратными с пустыми цепочками. - - Предусмотрите возможность получать грамматику из различных источников (из файла, как результат работы других функций). - - Предусмотрите возможность получать строку из различных источников (из файла, из консоли, из других функций). -- [ ] Добавить необходимые тесты. From c432786605af5ff55e58202319ba289c2e4072fb Mon Sep 17 00:00:00 2001 From: gsv Date: Sat, 20 Apr 2024 08:41:50 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BD=D1=83=D0=BC=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B8=20=D1=84=D0=BE=D1=80=D0=BC=D1=83=D0=BB?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=2010--12.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/task10.md | 8 ++++---- tasks/task10_bonus.md | 11 ++++++----- tasks/task12.md | 21 ++++++++------------- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/tasks/task10.md b/tasks/task10.md index e52dd806f..27508ac69 100644 --- a/tasks/task10.md +++ b/tasks/task10.md @@ -1,14 +1,14 @@ # Задача 10. Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями -* **Мягкий дедлайн**: !!!, 23:59 -* **Жёсткий дедлайн**: !!!, 23:59 +* **Жёсткий дедлайн**: 08.05.2024, 23:59 * Полный балл: 19 ## Задача -Задача посвящена анализу производительности различных алгоритмов решения задачи достижимости между всеми парами вершин с контекстно-свободными ограничениями: алгоритма Хеллингса, матричного алгоритма, тензорного алгоритма. В ходе анализа необходимо ответить на следующие вопросы. +Задача посвящена анализу производительности различных алгоритмов решения задачи достижимости между всеми парами вершин с контекстно-свободными ограничениями: алгоритма Хеллингса, матричного алгоритма, тензорного алгоритма, алгоритма на основе GLL. В ходе анализа необходимо ответить на следующие вопросы. - Какой из трёх указанных алгоритмов обладает лучшей производительностью? - Имеет ли смысл для решения задачи достижимости с регулярными ограничениями использовать алгоритмы для КС ограничений (ведь регулярные --- частный случай КС) или всё же лучше использовать специализированные алгоритмы для регулярных ограничений? +- Как влияет грамматика на производительность тензорного алгоритма и алгоритма на основе GLL? Если зафиксировать язык, то как свойства грамматики (размер, (не)однозначность) влияют на производительность. Решение данной задачи оформляется как Python notebook. Для того, чтобы обеспечить возможность проверки, необходимо сделать notebook самодостаточным: в него должны быть включены все действия, необходимые для воспроизведения эксперимента. Также в notebook размещается отчет и анализ результатов ваших экспериментов в текстовом виде. Отчет сопровождается диаграммами, таблицами, картинками, если это необходимо для объяснения результатов. @@ -30,7 +30,7 @@ - [ ] Подключить необходимые решения из предыдущих работ. - [ ] Сформировать набор данных. - [ ] Выбрать некоторые графы из [набора](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/index.html). Не забудьте обосновать, почему выбрали именно эти графы. Обратите внимание, что в наборе есть графы и грамматики для различных прикладных задач (анализ RDF, анализ указателей в С, анализ Java-программ). Рекомендуется выбирать графы, относящиеся к различным областям. - - [ ] В качестве запросов предлагается использовать грамматики из раздела "Canonical grammars" в описании соответствующего графа ([пример](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/data/taxonomy_hierarchy.html#canonical-grammars)). + - [ ] В качестве запросов предлагается использовать грамматики из раздела "Canonical grammars" в описании соответствующего графа ([пример](https://formallanguageconstrainedpathquerying.github.io/CFPQ_Data/graphs/data/taxonomy_hierarchy.html#canonical-grammars)). При необходимости (например, при ответе на третий вопрос), можно "оптимизировать" грамматику, вручную создав оптимальную RSM. Или же наоборот, преобразовать её в ОНФХ, или сделать её (не)однозначной. - [ ] Сформулировать этапы эксперимента. Что нужно сделать, чтобы ответить на поставленные вопросы? Почему? - [ ] Провести необходимые эксперименты, замеры - [ ] Оформить результаты экспериментов diff --git a/tasks/task10_bonus.md b/tasks/task10_bonus.md index 1c8ebec69..8ff210ea8 100644 --- a/tasks/task10_bonus.md +++ b/tasks/task10_bonus.md @@ -1,14 +1,15 @@ -# Задача 10. Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями +# Задача 10 (бонусная). Экспериментальное исследование алгоритмов решения задачи достижимости с КС ограничениями -* **Мягкий дедлайн**: 11.12.2022, 23:59 -* **Жёсткий дедлайн**: 14.12.2022, 23:59 -* Полный балл: 20 +* **Жёсткий дедлайн**: 08.05.2024, 23:59 +* Полный балл: 25 ## Задача -Задача посвящена анализу производительности различных алгоритмов решения задачи достижимости между всеми парами вершин с контекстно-свободными ограничениями: алгоритма Хеллингса, матричного алгоритма, тензорного алгоритма. В ходе анализа необходимо ответить на следующие вопросы. +Задача посвящена анализу производительности различных алгоритмов решения задачи достижимости между всеми парами вершин с контекстно-свободными ограничениями: алгоритма Хеллингса, матричного алгоритма, тензорного алгоритма, алгоритма, основанного на GLL. В ходе анализа необходимо ответить на следующие вопросы. - Какой из трёх указанных алгоритмов обладает лучшей производительностью? - Имеет ли смысл для решения задачи достижимости с регулярными ограничениями использовать алгоритмы для КС ограничений (ведь регулярные --- частный случай КС) или всё же лучше использовать специализированные алгоритмы для регулярных ограничений? +- Как влияет грамматика на производительность тензорного алгоритма и алгоритма на основе GLL? Если зафиксировать язык, то как свойства грамматики (размер, (не)однозначность) влияют на производительность. + Решение данной задачи оформляется как Python notebook. Для того, чтобы обеспечить возможность проверки, необходимо сделать notebook самодостаточным: в него должны быть включены все действия, необходимые для воспроизведения эксперимента. Также в notebook размещается отчет и анализ результатов ваших экспериментов в текстовом виде. Отчет сопровождается диаграммами, таблицами, картинками, если это необходимо для объяснения результатов. diff --git a/tasks/task12.md b/tasks/task12.md index 7dbdd1a39..91c2da8af 100644 --- a/tasks/task12.md +++ b/tasks/task12.md @@ -6,21 +6,16 @@ ## Задача -В данной задаче необходимо разработать интерпретатор языка запросов согласно спецификации, разработанной в работе 13. Интерпретатор должен быть консольной утилитой и принимать на вход файл, исполнять его, сообщать в консоль о статусе исполнения (завершилось успешно, завершилось с ошибкой). Обратите внимание, что для "публикации" результатов вычислений в языке предусмотрена функция ```print```. Также обратите внимание на адекватность сообщений об исключительных ситуациях (некорректный вход, проблемы с типизацией и т.д.) +В данной задаче необходимо разработать интерпретатор языка запросов, разработанного в предыдущей работе. Для исполнения запросов использовать алгоритмы, реализованные в предыдущих работах. КРоме реализации необходимо предоставить минимальную документацию, поясняющую принятые в процессе реализации решения (например, в readme). -Так как интерпретатор --- достаточно сложный проект, для него необходима документация. Частью документации будет спецификация языка из работы 13. Дополнительно необходимо задокументировать особенности системы типов, используемые алгоритмы запросов. +Обратите внимание, что кроме непосредственно интерпретатора необходимо реализовать вывод типов. Тестирование данной функциональности должно быть возможно в изоляции. Фактически, должна быть реализована отдельная функция, которая по дереву разбора выводит типы и кидает исключение, если программа не можете быть типизирована корректно. -Прежде чем писать код, продумайте его архитектуру. Предусмотрите возможности для тестирования отдельных функций, отдельной функциональности (скажем, тестирование системы типов). - - - [ ] Разработать и описать (в документации) механизм вывода или проверки типов, гарантирующий корректность построения запросов (в частности, что не строится пересечение двух контекстно-свободных языков, или что состояния автоматов задаются значениями допустимых типов). - - Типизация должна быть строгой. - - Типизация может быть как статической, так и динамической. - - Можно использовать как вывод типов, так и проверку типов. - - Работа системы типов должна соответствовать правилам, указанным в постановке задачи 13 и в вашем её решении (возможны тонкости с частями, абстрактный синтаксис для которых требовалось придумать самостоятельно). + - [ ] Реализовать механизм вывода типов, гарантирующий корректность построения запросов (в частности, что не строится пересечение двух контекстно-свободных языков, или что множества вершин задаются значениями допустимых типов). + - Работа системы типов должна соответствовать правилам, указанным предыдущей задаче. - Постарайтесь сделать сообщения об ошибках максимально дружественными к пользователю. - [ ] Из множества реализованных в предыдущих работах алгоритмов выполнения запросов к графам выбрать те, которые будут использоваться в интерпретаторе. Обосновать свой выбор (зафиксировать в документации). - - [ ] Используя парсер из работы 14, разработанную систему вывода или проверки типов, выбранные алгоритмы, реализовать интерпретатор языка, описанного в работе 13. - - Хотя конечное решение и должно быть консольной утилитой, предусмотрите возможности для тестирования. Например, сделайте так, чтобы вход можно было получить из строки и, например, "перехватить" результаты вычислений для их проверки в тестах. - - Проследите за адекватностью сообщений об ошибках. + - [ ] Используя парсер из предыдущей работы, разработанную систему вывода типов, выбранные алгоритмы, реализовать интерпретатор языка, описанного в предыдущей задаче. + - Требуется реализовать функцию, которая по дереву разбора, предоставленному ANTLR, вернёт словарь, содержащий для всех связываний, где в правой части `select`, имя (левую часть связывания) в качестве ключа, а в качестве значения --- результат выполнения соответствующего запроса. + - Проследите за адекватностью сообщений об ошибках. Вам же проще отлаживаться будет. - Постарайтесь максимально использовать возможности ANTLR по работе с деревом разбора. - - [ ] Добавить необходимые тесты. Тут, как и с парсером, тестов много не бывает. И, как и с парсером, они должны быть атомарными. При этом и на сложных входах надо не забыть протестировать. + - [ ] Добавить необходимые тесты. From 49c6e58dbd50cc0c019b9217e4e5a27b7011265d Mon Sep 17 00:00:00 2001 From: gsv Date: Sat, 20 Apr 2024 12:09:42 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/task12.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/task12.md b/tasks/task12.md index 91c2da8af..9fc494c67 100644 --- a/tasks/task12.md +++ b/tasks/task12.md @@ -6,7 +6,7 @@ ## Задача -В данной задаче необходимо разработать интерпретатор языка запросов, разработанного в предыдущей работе. Для исполнения запросов использовать алгоритмы, реализованные в предыдущих работах. КРоме реализации необходимо предоставить минимальную документацию, поясняющую принятые в процессе реализации решения (например, в readme). +В данной задаче необходимо разработать интерпретатор языка запросов, разработанного в предыдущей работе. Для исполнения запросов использовать алгоритмы, реализованные в предыдущих работах. Кроме реализации необходимо предоставить минимальную документацию, поясняющую принятые в процессе реализации решения (например, в readme). Обратите внимание, что кроме непосредственно интерпретатора необходимо реализовать вывод типов. Тестирование данной функциональности должно быть возможно в изоляции. Фактически, должна быть реализована отдельная функция, которая по дереву разбора выводит типы и кидает исключение, если программа не можете быть типизирована корректно.