2015-07-10 2 views
1

Я ищу абстрактное представление синтаксического дерева, которое может использоваться для общих императивных языков (Java, C, python, ruby ​​и т. Д.). Я хотел бы, чтобы это было как можно ближе к источнику (в отличие от LLVM). Я нашел Rose онлайн, но он способен обрабатывать только C и Fortran. Это существует?абстрактное синтаксическое дерево для императивных языков

ответ

-1

Вы не найдете «один» универсальный АСТ, который может представлять многие языки. Люди ищут 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 хорошо справляется с двусмысленными грамматиками).

Смежные вопросы