Проблемы синтаксического дерева

Issue #299 resolved
Oleg Sychev repo owner created an issue

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)

  1. Oleg Sychev reporter
    Первая задача - сделать человеческое дерево выражения, в котором были бы только узлы
    операций и операндов, без дополнительных промежуночных узлов. Т.е. для 1+2 узел expr_plus
    и его дети number, plus, number (лексемы).
    

    Reported by oasychev on 2014-08-29 13:15:00

  2. Former user Account Deleted
    Попробовал поправить.
    

    Reported by mamontov.dp on 2014-09-02 16:35:17

  3. Oleg Sychev reporter
    Сама структура для выражений вроде бы нормальная. Но вот я получил странное дерево для
     выражения "a<(2+3)*3.6E5 && b | 7" - почему-то верхним узлом является не логическое
    И, а побитовое ИЛИ. Проверьте приоритеты операций в парсере!
    

    Reported by oasychev on 2014-11-11 21:38:28

  4. Oleg Sychev reporter
    Попытка задать сложное определение переменной с хитрым типом потерпела полный провал:
    для "const unsigned short int const * a[15];" дерево получилось вообще несвязным, без
    общей верхней вершины. Посмотрите, глюки в парсере или в отображении дерева? Но глюки
    точно есть.
    

    Reported by oasychev on 2014-11-11 21:41:26

  5. Former user 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

  6. Former user 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

  7. Former user Account Deleted
    Портировал построение на d3. Проблем быть не должно.
    

    Reported by mamontov.dp on 2014-12-07 10:03:25

  8. Former user Account Deleted
    В процессе исправления и переделывания просмотра дерева сломался тест typedef_1
    

    Reported by mamontov.dp on 2014-12-08 06:47:08

  9. Former user Account Deleted
    Тест try...catch также сломался. 
    

    Reported by mamontov.dp on 2014-12-08 07:50:03

  10. Former user 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

  11. Former user Account Deleted
    Тесты начали работать, но не покрыта тестами работа с шаблонными типами, их использованием
    внутри локальных типов при объединении классов. Также визуализатор, к сожалению, оставляет
    желать лучшего.
    

    Reported by mamontov.dp on 2014-12-11 20:08:13

  12. Former user Account Deleted
    Тесты заработали. Визуализатор исправлен. Также добавлена поддержка комментариев и тест
    на неё. Что сделано не очень, пока:
    
    Препроцессором стрингизируется и конкатенируются имена типов, числа и идентификаторов
    Не поддерживаются указатели на методы и функции
    Не поддерживаются сложные аргументы в шаблонах (шаблоны шаблонов)
    Не поддерживается совпадение имени переменных и типов
    В стрингификации не поддерживается полноценная замена токенов с учетом определенных
    макросов в программе, они просто ведут себя как идентификаторы
    Не очень хорошая поддержка #define, #include. - просто собираются в одну лексему.
    

    Reported by mamontov.dp on 2014-12-16 09:52:42

  13. Former user Account Deleted
    Подкорректировал работу парсера - теперь появились указатели на методы и функции, а
    также сложные параметры шаблонов.
    
    Осталось:
    
    Не поддерживается совпадение имени переменных и типов - сложное, разные компиляторы
    ведут себя по-разному, так что, думаю, можно и не делать.
    
    Работа препроцессора - здесь все сложнее, так как препроцессор по идее преобразовыватет
    поток ввода лексем. По идее, можно выделять данные препроцессора на этапе лексического
    разбора, а на этапе синтаксического, собирать подставленные данные, помечая то, что
    было подставлено. Тем не менее, мне кажется это слишком сложным и нецелесообразным
    для решаемой задачи.
    
    Предлагаю вытолкнуть изменения парсера как минимум в мой репозиторий formallangs, а
    все связанные с парсером проблемы закрыть (за исключением, небось, этой, потому что
    могут вскрыться проблемы, связанные с генерацией описаний).
    

    Reported by mamontov.dp on 2014-12-27 10:31:30

  14. Oleg Sychev reporter
    Препроцессор должен работать заранее. Но я думаю это нам особо не нужно на данном этапе.
    

    Reported by oasychev on 2014-12-28 00:25:32

  15. Oleg Sychev reporter

    Дмитрий, как у нас с ЧПУ по всему дереву теперь (как в первом сообщении указывается)? Все в порядке?

  16. Log in to comment