Я ищу абстрактное представление синтаксического дерева, которое может использоваться для общих императивных языков (Java, C, python, ruby и т. Д.). Я хотел бы, чтобы это было как можно ближе к источнику (в отличие от LLVM). Я нашел Rose онлайн, но он способен обрабатывать только C и Fortran. Это существует?абстрактное синтаксическое дерево для императивных языков
ответ
Вы не найдете «один» универсальный АСТ, который может представлять многие языки. Люди ищут 50 лет.
Существенная причина в том, что узел AST неявно представляет точную семантику языка оператора, который он кодирует, а разные языки имеют разную семантику для того, что, по-видимому, является одним и тем же оператором.
Например, оператор «+» в современном Fortran добавит целые числа, реалы, сложные значения и кусочки массивов таких вещей. Java «+» добавит целые числа, реалы и клей-строки вместе. Если бы я написал «a + b» в «universal AST», как бы вы знали, какой семантический эффект соответствует закодированному AST?
Что вы можете сделать, это создать систему, в которой АСТ для разных языков представлены равномерно, чтобы вы могли обмениваться инфраструктурой инструментов на многих языках. Это делается многими Program Transformation Systems (PTS), где вы предоставляете грамматику (или выбираете ее из доступной библиотеки), а PTS анализирует и строит AST, используя свое единообразное представление. Большинство PTS предоставляют дополнительную поддержку для анализа и преобразования кода.
Итак, все, что вам нужно, это PTS и некоторый пот, чтобы определить грамматику. Это действительно не так; получение грамматического права для реального языка на самом деле довольно сложно. Хуже того, есть много до Life After Parsing, потому что вам нужно значение символов и дополнительных выводов, таких как управление и анализ потока данных. Таким образом, вам нужны полные интерфейсы (например, синтаксический анализ, разрешение имени/типа, анализ потока, ...) или столько, сколько вы можете получить, если вы не хотите отвлекаться на несколько месяцев, прежде чем начать свою настоящую работу.
Что это означает на практике, вы хотите, чтобы найти инструмент, который обрабатывает языки, представляющие интерес для вас, со зрелыми передними концами уже доступны:
- Rose (вы уже это нашли) рукоятка C, C++ и Fortran. Он не имеет встроенной возможности синтаксического анализа; его передние концы выполнены на заказ. Поэтому трудно распространяться на другие языки. Но он обладает хорошими возможностями анализа потока и предоставляет средства для преобразования кода с помощью ручных команд AST Walks/smashes.
Clang ручки C и C++. Clang также использует встроенные в руки передние концы. Он также может преобразовать код, опять же вручную написанными AST walks/smashes, с небольшим количеством поддержки соответствия шаблону. Насколько я понимаю, вы должны использовать LLVM часть Clang для анализа потока.
Наше DMS Software Reengineering Toolkit имеет полный фронт для C, C++, Java и COBOL, а также полный парсер для многих других языков, таких как Python. DMS обеспечивает анализ на основе шаблонов и преобразование источника в источник. Он работает непосредственно из грамматики (см. Один для Oberon, Nicklaus Wirth's latest language). (Я не знаю какого-либо инструмента, который обрабатывает Ruby, который классно трудно разобрать, я понимаю, что его грамматика неоднозначна, а DMS хорошо справляется с двусмысленными грамматиками).
- 1. Parser и абстрактное синтаксическое дерево
- 2. Как построить абстрактное синтаксическое дерево
- 3. Как получить абстрактное синтаксическое дерево из ParseResults
- 4. AST (абстрактное синтаксическое дерево) в Netbeans
- 5. python: получить абстрактное синтаксическое дерево импортируемой функции?
- 6. Анализ кода взлома в абстрактное синтаксическое дерево
- 7. Как уменьшить дерево синтаксического анализа в абстрактное синтаксическое дерево?
- 8. Как создать абстрактное синтаксическое дерево для * (b + c) * d
- 9. Как разработать AST (абстрактное синтаксическое дерево) для XPath?
- 10. Как показать абстрактное синтаксическое дерево грамматики в бизоне?
- 11. анализ кода JavaScript, абстрактное синтаксическое дерево и прочее
- 12. Абстрактное синтаксическое дерево в C++: classes vs. structs
- 13. Абстрактное синтаксическое дерево в компиляторе: как точно представлять функцию?
- 14. LR (1) разобрать прямо на абстрактное синтаксическое дерево
- 15. Как получить абстрактное синтаксическое дерево программы `c` в` GCC`
- 16. Как пропустить типизированное абстрактное синтаксическое дерево в компиляторе OCaml
- 17. Как объяснить абстрактное синтаксическое дерево прикованных операций сравнения?
- 18. Синтаксический разметки в абстрактное синтаксическое дерево с помощью регулярного выражения
- 19. Как перевести LR (1) Разбор в абстрактное синтаксическое дерево?
- 20. Представление множественного прохода Абстрактное синтаксическое дерево (AST) в C++?
- 21. Интерпретатор бэкэнда, как вы проходите свое абстрактное синтаксическое дерево?
- 22. код генерации JUnit на основе абстрактное синтаксическое дерево ходьбы
- 23. Преимущества компиляторов для функциональных языков над компиляторами для императивных языков
- 24. Здание Аннотация Синтаксическое дерево
- 25. Абстрактное дерево против дерева парсеров
- 26. Как генерировать AST (абстрактное синтаксическое дерево) для исходного кода Python с использованием antlr
- 27. Срок заказа для комплекса Аннотация Синтаксическое дерево
- 28. Преобразование файла, содержащего абстрактное дерево
- 29. Есть ли способ получить AST (абстрактное синтаксическое дерево) блока кода в Java, а не всего класса?
- 30. Мне нужна помощь в построении AST (абстрактное синтаксическое дерево) в файле XML