2015-11-08 11 views
0

Мой текущий проект фокусируется на генерации кода из DSL (то есть спецификации высокого уровня). Более конкретно, разработчики пишут спецификации высокого уровня, и эти спецификации анализируются и генерируют код на Java и Android. Для парсера я использовал грамматику ANTLR и для генерации кода я использовал StringTemplateFiles.xText и ANTLR

Однако разработчик пишет высокоуровневые спецификации в блокноте. Из-за этого я не могу обеспечить подсветку синтаксиса, раскраску и обработку ошибок. Чтобы обеспечить эту поддержку, я думаю использовать xText.

Я имею в виду интегрировать XText следующим образом:

  • Разработчики пишут спецификации высокого уровня в поддержку редактора предоставляют по XText (в основном, я буду писать XText грамматику и генерировать поддержку редактора). Здесь редактор Xtext будет обрабатывать синтаксическую раскраску, подсветку синтаксиса и обработку ошибок.
  • Я буду использовать все эти спецификации как .txt-входы, а затем ANTLR проанализировать эти файлы. И генерировать Java и Android-код.

нужны ваши предложения по следующим вопросам:

(1) Как я могу извлечь файлы, написанные в XText редакторе, и внести свой вклад в ANTLR парсер? ИЛИ (2) Должен ли я придерживаться xText и пытаться интегрировать парсер ANTLR и xtext? (любезно посоветуйте - как я могу интегрировать xtext и ANTLR с простым примером) ИЛИ (3) Должен ли я использовать только ANTLR и StringTemplateFiles и пытаться создать из него плагин Eclipse?

Другие альтернативные предложения также приветствуются.

+0

Возможный дубликат [интеграции ANTLR и XText для разработки плагина] (http://stackoverflow.com/questions/23290093/antlr-and-xtext-integration -for-development-plugin) –

+0

Спасибо, Алексей! Этот вопрос является исчерпывающим и конкретным, полученным из моих экспериментов с xText. Так что это немного по-другому. – Pankesh

ответ

0

Вам не нужно интегрировать XText и ANTLR; XText already uses ANTLR для фактического разбора.

+0

Alexey Я знаю, что xTexT использует ANTLR. Но для меня - как я могу интегрировать с ANSLR-парсером. Не могли бы вы помочь мне решить эту проблему, используя один простой пример? Это очень помогло бы мне. – Pankesh

0

Xtext основан на Antlr. Поэтому нет необходимости интегрировать Antlr и Xtext. Я советую вам создать проект Xtext на Eclipse и сгенерировать артефакты, используя файл mwe2. Затем в папке src-gen вы сможете найти свою грамматику Antlr, созданную из вашей грамматики Xtext.

Если вы хотите сгенерировать код из вашей грамматики Xtext, вы можете использовать Xtend. Он предоставляет уже все, что вам нужно. См.: https://eclipse.org/Xtext/documentation/207_template.html.

В противном случае, если у вас уже есть грамматика antlr и генератор, вам необходимо (переписать) его в Xtext.

+0

Спасибо за ответ! У меня уже есть ANTLR грамматика и генератор кода, написанные в StringTemplate. Мой вопрос заключается в связи между грамматикой xtext (которую я написал из-за хорошей поддержки редактора) и уже написанной грамматикой ANTLR. Как я могу связать эти две части; ANTLR и xtext? – Pankesh

+0

На самом деле, если вы хотите использовать свою собственную грамматику и свой генератор, вам нужно будет разработать внутри своего плагина Xtext: * Действие для запуска генерации кода, * Или вы можете разветвить компонент генерации кода внутри генерируемого генератора класса по Xtext. Но в конце, если вы хотите предоставить завершение, связывание, проверку и т. Д. Вам нужно будет перестроить свою грамматику в Xtext. И если вам нужно изменить свою грамматику, вам нужно будет одновременно поддерживать две грамматики. – Gaetan

+0

@Geetan: Спасибо за ответ! Не могли бы вы помочь мне с небольшим фрагментом кода? Я получаю ваш текст теоретически, но не в кодировании. – Pankesh

0

К примеру:

public class CustomGenerator extends AbstractHandler{ 

@Override 
public Object execute(ExecutionEvent event) throws ExecutionException { 
    ISelection selection = HandlerUtil.getCurrentSelection(event); 

    //If your selection is an IFile 
    //Selection from the Project Explorer 
    if(selection instanceof IStructuredSelection){ 
     IStructuredSelection structuredSelection = (IStructuredSelection) selection; 
     Object element = structuredSelection.getFirstElement(); 
     if(element instanceof IFile){ 
      IFile file = (IFile) element; 
      InputStream contentOfYouFile = ((IFile) element).getContents(); 

      //make your job 
     } 
    } 

    return null; 
} 

}

+0

Но если вы хотите сделать инкрементное поколение, вы можете разветвить свой код внутри файла xtend. Этот файл содержится внутри пакета «generator» в папке «src» с именем «YourDslName» Generator.xtend. Просто добавьте свой код внутри метода «doGenerate». – Gaetan

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

  • Нет связанных вопросов^_^