Как манипулировать C # AST?

2

Я работаю над проектом школы Reverse Engineering, который требует перевести манипуляции AST скомпилированного проекта С#. Я видел пост "Перевести код С# в AST?" на этом сайте, но он не похож на тот, который я ищу.

Согласно тому, что я знаю, в настоящее время С# не предоставляет библиотечный класс, который делает что-то подобное для Java: http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.cdt.doc. isv/reference/api/org/eclipse/cdt/core/dom/ast/ASTVisitor.html. Если в С# есть такой библиотечный класс, то здесь все решаемо.

Я с кем-то посоветовался, и вот возможные решения. Но у меня также есть проблемы с разработкой решений:

  1. Найдите другой компилятор, который предоставляет библиотеку, которая позволяет использовать его AST для манипуляций. Но я не могу найти такой компилятор.
  2. Используйте ANTLR Parser Generator, чтобы выпустить свой собственный компилятор, который делает это (это будет намного более сложный и длительный процесс). Здесь есть примеры грамматик для разных языков, но не для С# (грамматики написаны на разных языках, включая С#, но не для создания грамматики С#). Следовательно, проблема в том, что я не могу найти грамматику С#.

Какой самый короткий и быстрый способ решения этой проблемы? Если мне действительно нужно выбрать один из вариантов, описанных выше, как мне решить эти проблемы, с которыми я столкнулся.

  • 0
    Мне неясно, хотите ли вы манипулировать AST на C # с помощью C # или просто манипулировать AST, используя какие-либо инструменты вообще. И меня смущает ваше замечание по поводу ANTLR: я думал, что есть грамматика C # 3.0, которую ANTLR может обработать для анализа и построения деревьев C #.
Теги:
antlr
compiler-construction
abstract-syntax-tree

5 ответов

0
Лучший ответ

ANTLR не является хорошим выбором. Теперь я пытаюсь использовать Mono Cecil. Моно Сесил хорош для анализа любых кодов сума, которые могут быть скомпилированы в Common Intermediate Language (CML). Недостатком является то, что он не имеет надлежащей документации.

  • 0
    Почему ANTLR не является хорошим выбором?
4

Я знаю, что ответ для этого был принят давно. Но у меня был подобный вопрос, и я не был уверен в том, что там есть. Я провел небольшое исследование библиотеки NRefactory, которая поставляется как часть SharpDevelop. Он генерирует код AST из С#.

Здесь представлено изображение демонстрационного приложения NRefactory, которое является частью исходного кода SD. Введите некоторый код С#, и он генерирует и отображает AST в древовидной структуре.

Изображение 174551

1

Почему бы вам не попробовать NRefectory. Я видел, как он обсуждался на предмет AST на некоторых форумах SharepDevelop.

Вот статья о CodeProject в отношении этой темы.

0

Я только что ответил на другой поток здесь, в StackOverflow, где я реализовал API для создания и управления AST из исходного кода С#

0

Полный анализатор С# 3.0 доступен с нашим DMS Software Reengineering Toolkit (для краткости DMS). Он был использован для обработки десятков тысяч файлов С#. Он обеспечивает автоматическое построение АСТ, обход деревьев, сопоставление и преобразование структуры синтаксиса и многое другое. Как коммерческий продукт, это может не сработать для студенческого проекта.

ANTLR, возможно, предлагает синтаксический анализатор С#, но я не знаю, полный или надежный, или действительно ли он создает АСТ.

[РЕДАКТИРОВАТЬ 25 января 2010: парсер С# 4.0 теперь доступен для DMS со всеми вышеуказанными свойствами]

[EDIT Май 2016: С# 6.0 парсер доступен для DMS.]

  • 0
    Чтобы уточнить: я хотел сделать что-то, что позволяет мне анализировать в C # файл или каталог с проектом C #, и он сможет построить AST, который позволяет мне манипулировать им. Манипуляции для обратного проектирования кодов C # в UML.
  • 0
    UML имеет множество подмоделей. Создание диаграмм классов из дерева разбора с таблицей символов должно быть довольно простым. Создание диаграмм состояния диаграммы, вероятно, довольно сложно. У нас есть некоторый опыт использования DMS для обработки исходного кода Java в исполняемый файл UML OMG, и это было немного сложно; он нуждался в полном контроле и анализе потока данных. Ни один из последних не доступен с ANTLR или любой известной мне системой синтаксического анализа, за исключением DMS. YMMV.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню