xtext: связь между AST, метамоделью и деревом синтаксического анализа

Может ли кто-нибудь объяснить мне связь между деревом синтаксического анализа, AST и метамоделью. На данный момент я знаю, что xtext выводит метамодель EMF Ecore из грамматики и генерирует синтаксический анализатор с помощью antlr. Но как тогда он будет разобран: входные данные сначала проходят через лексер, а затем синтаксический анализатор создает дерево синтаксического анализа из правил синтаксического анализатора, верно? И из дерева синтаксического анализа Xtext также создает AST? За что? И какое назначение в данном случае у метамодели? Я немного запутался во всех определениях.


person ph09    schedule 19.01.2013    source источник


Ответы (1)


Вы правы насчет трехэтапной процедуры синтаксического анализа: сначала лексер начинает с входного потока, затем создается дерево синтаксического анализа на основе Antlr, наконец, Xtext генерирует AST на основе EMF из дерева синтаксического анализа. Первые два шага естественны для любого парсера (генератора), третий шаг требует пояснений. Я начну немного длинное объяснение с некоторой мотивацией, затем коротко расскажу о метамоделях и ЭДС в целом.

Во-первых, сгенерированные парсеры не поддерживают разрешение идентификаторов (необходимо для обработки переменных или вызовов функций), эти функции необходимо добавлять вручную, поэтому практически для всех языков необходим шаг постобработки, закодированный вручную, для которого требуется расширение уже существующее дерево разбора.

Во-вторых, EMF предоставляет хороший, типобезопасный API для своих моделей вместе с мощным рефлексивным API, который позволяет создавать очень общие, но полезные компоненты, упрощающие обработку моделей (например, генераторы кода, такие как Acceleo или один из аспектов Xtend, инструменты преобразования модели, такие как ATL, ETL, VIATRA2). Я не могу точно сказать, в чем разница между API дерева синтаксического анализа Antlr и EMF, но я работал с API генератора парсеров LPG, и, на мой взгляд, с EMF работать проще.

Более того, использование EMF позволяет повторно использовать богатую функциональность Xtext вместе с другими редакторами на основе EMF, такими как графические редакторы на основе GMF. См. основную идею в предыдущей презентации EclipseCon: TMF встречает GMF — сочетание текстового и графического моделирования.

В общем, если нам нужно расширить наше дерево синтаксического анализа информацией о разрешении, повторное использование уже используемой парадигмы может облегчить интеграцию нашего языка с другими инструментами.

EMF опирается на концепцию метамоделирования: мы должны определить набор элементов, которые можно использовать в моделях, вместе с дополнительными ограничениями, такими как информация о связности. Эта концепция аналогична определениям схем для XML (например, DTD или SML Schema) — у нас есть единый способ описания моделей. Xtext работает вместе с EMF несколькими способами:

  • Прежде всего, на основе грамматики он генерирует и регистрирует метамодель EMF, которую можно использовать в любом инструментальном средстве на основе EMF.
  • Затем конечным результатом процесса синтаксического анализа является модель EMF, которую можно читать и изменять с помощью API EMF — изменения сериализуются обратно в текстовую форму.

Надеюсь, ответ был достаточно ясен. Не стесняйтесь запрашивать дополнительные разъяснения, если это необходимо.

person Zoltán Ujhelyi    schedule 23.01.2013
comment
Большое спасибо за это описание! В документации Xtext говорится о четырехэтапном процессе синтаксического анализа, состоящем из: 1. Лексирования 2. Парсинга 3. Связывания 4. Проверка Теперь я знаю о первых двух шагах. На этапе связывания, я думаю, будет создана ссылка между элементами модели. Но как насчет этапа проверки? - person ph09; 25.01.2013
comment
На этапе проверки созданная модель EMF проверяется с помощью инструментов EMF. Если вы используете декларативный валидатор, он выполняется на этом этапе. - person Zoltán Ujhelyi; 25.01.2013