Проблемы синтаксического дерева
Originally reported on Google Code with ID 299
Сделать осмысленные наименования узлов синтаксического дерева С++ так, чтобы по ним
можно было бы создать классы и написать простенький интерпретатор без заморочек. Т.е.
не должно быть никаких узлов типа expr_prec_8 которые непойми что. Должен быть там
epxr_plus, epxr_mul и т.д.
Промежуточные непонятные узлы могут присутствовать, но для всех операций, операторов
и т.д. должны быть явные родительские узлы с человеко-понятным типом. Классы самом
создавать не нужно - не сложно написать фабрику, которая в зависимости от типа будет
создавать объекты разных классов.
Reported by oasychev
on 2014-07-30 13:37:52
Comments (19)
-
reporter -
Account Deleted Попробовал поправить.
Reported by
mamontov.dp
on 2014-09-02 16:35:17 -
reporter Сама структура для выражений вроде бы нормальная. Но вот я получил странное дерево для выражения "a<(2+3)*3.6E5 && b | 7" - почему-то верхним узлом является не логическое И, а побитовое ИЛИ. Проверьте приоритеты операций в парсере!
Reported by
oasychev
on 2014-11-11 21:38:28 -
reporter Попытка задать сложное определение переменной с хитрым типом потерпела полный провал: для "const unsigned short int const * a[15];" дерево получилось вообще несвязным, без общей верхней вершины. Посмотрите, глюки в парсере или в отображении дерева? Но глюки точно есть.
Reported by
oasychev
on 2014-11-11 21:41:26 -
Account Deleted Исправлено в специальном клоне (https://code.google.com/r/mamontovdp-formallangs2-cppparser/source/browse). Скорее всего в ближайшее время найду библиотеку для визуализации графов и попробую сделать страницу для тестирования на edu.vstu.org. Дополнительные тесты все равно надо делать - даже беглая пробежка показала, что были конструкции, которые учтены не были.
Reported by
mamontov.dp
on 2014-12-05 20:00:01 -
Account Deleted http://edu.vstu.org/blocks/formal_langs/parsertests/visualize.php Сделал несложную визуализацию построенного дерева. Правда думаю, надо в будущем перейти на d3 - go.js для визуализации в продакшне не подходит, так как платный.
Reported by
mamontov.dp
on 2014-12-06 21:01:19 -
Account Deleted Портировал построение на d3. Проблем быть не должно.
Reported by
mamontov.dp
on 2014-12-07 10:03:25 -
Account Deleted В процессе исправления и переделывания просмотра дерева сломался тест typedef_1
Reported by
mamontov.dp
on 2014-12-08 06:47:08 -
Account Deleted Тест try...catch также сломался.
Reported by
mamontov.dp
on 2014-12-08 07:50:03 -
Account Deleted class_with_constructor_destructor.txt class_with_outer_definition_of_constructor_and_destructor.txt struct_with_one_field_and_complex_definition.txt empty_enum.txt union.txt enum_with_one_value.txt enum_with_three_values.txt enum_with_numerical_data.txt nested_namespace_with_related.txt nested_classes.txt print_arguments.txt Эти тесты тоже выводят бессвязные деревья. В основном из-за того, что просмотр типов теперь работает по-другому.
Reported by
mamontov.dp
on 2014-12-08 08:30:08 -
Account Deleted Тесты начали работать, но не покрыта тестами работа с шаблонными типами, их использованием внутри локальных типов при объединении классов. Также визуализатор, к сожалению, оставляет желать лучшего.
Reported by
mamontov.dp
on 2014-12-11 20:08:13 -
Account Deleted Тесты заработали. Визуализатор исправлен. Также добавлена поддержка комментариев и тест на неё. Что сделано не очень, пока: Препроцессором стрингизируется и конкатенируются имена типов, числа и идентификаторов Не поддерживаются указатели на методы и функции Не поддерживаются сложные аргументы в шаблонах (шаблоны шаблонов) Не поддерживается совпадение имени переменных и типов В стрингификации не поддерживается полноценная замена токенов с учетом определенных макросов в программе, они просто ведут себя как идентификаторы Не очень хорошая поддержка #define, #include. - просто собираются в одну лексему.
Reported by
mamontov.dp
on 2014-12-16 09:52:42 -
Account Deleted Подкорректировал работу парсера - теперь появились указатели на методы и функции, а также сложные параметры шаблонов. Осталось: Не поддерживается совпадение имени переменных и типов - сложное, разные компиляторы ведут себя по-разному, так что, думаю, можно и не делать. Работа препроцессора - здесь все сложнее, так как препроцессор по идее преобразовыватет поток ввода лексем. По идее, можно выделять данные препроцессора на этапе лексического разбора, а на этапе синтаксического, собирать подставленные данные, помечая то, что было подставлено. Тем не менее, мне кажется это слишком сложным и нецелесообразным для решаемой задачи. Предлагаю вытолкнуть изменения парсера как минимум в мой репозиторий formallangs, а все связанные с парсером проблемы закрыть (за исключением, небось, этой, потому что могут вскрыться проблемы, связанные с генерацией описаний).
Reported by
mamontov.dp
on 2014-12-27 10:31:30 -
reporter Препроцессор должен работать заранее. Но я думаю это нам особо не нужно на данном этапе.
Reported by
oasychev
on 2014-12-28 00:25:32 -
reporter Дмитрий, как у нас с ЧПУ по всему дереву теперь (как в первом сообщении указывается)? Все в порядке?
-
reporter - changed component to CorrectWriting
- edited description
-
Да, считаю, что всё в порядке.
-
Менять статус не могу, извините.
-
reporter - changed status to resolved
- Log in to comment
Reported by
oasychev
on 2014-08-29 13:15:00