2015-11-08 78 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-developing-plugin) –

+0

謝謝阿列克謝!這個問題是全面和具體的,來自我對xText的一些實驗。所以,它有點不同。 – Pankesh

回答

0

您不需要整合XText和ANTLR; XText already uses ANTLR用於實際解析。

+0

Alexey我知道xTexT使用ANTLR。但是,對我來說 - 我怎麼能與ANTLR解析器集成失蹤。你能幫我解決這個問題,使用一個簡單的例子嗎?這會幫助我很多。 – Pankesh

0

Xtext基於Antlr。所以不需要集成Antlr和Xtext。 我建議你在Eclipse上創建Xtext項目並使用mwe2文件生成工件。然後在src-gen文件夾中,您可以找到從您的Xtext語法生成的Antlr語法。

如果你想從你的Xtext語法生成代碼,你可以使用Xtend。它已經提供了你需要的一切。參見:https://eclipse.org/Xtext/documentation/207_template.html

否則,如果您已經有antlr語法和生成器,則需要(重新)將它寫入Xtext。

+0

感謝您的回答!我已經用StringTemplate編寫了ANTLR語法和代碼生成器。我的問題是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文件中。該文件包含在名爲「YourDslName」Generator.xtend的「src」文件夾中的包「generator」中。只需在「doGenerate」方法中添加代碼即可。 – Gaetan