为Xtext语法创建一个自己的解释器

时间:2017-04-13 22:11:16

标签: java eclipse interpreter dsl xtext

我在Xtext中创建了一个语法,我可以从plugin.xml启动eclipse应用程序并测试我的语法。现在我需要制作一个解释器,以便能够启动我的DSL代码。

我用类解释器创建了一个包,但我不知道如何访问在eclipse编辑器中打开的文件以便启动。 另一方面,我认为解释器在编辑器中逐行读取文件并运行句子,是这样的吗?

我的最后一个问题是,如果你知道一个教程或更好的方法来实现Xtext语法的解释器并且一起工作?我试着理解Tortoise的例子,但我什么都不懂。

感谢!!!

1 个答案:

答案 0 :(得分:1)

这是一个很难给出一般答案的问题。它在很大程度上取决于你的翻译做什么以及它如何提供反馈。即使是逐行工作也可能没有意义,而只是简单地遍历模型内容。当用户点击输入文件时,您可以想象在“自动编辑”上执行此操作。这就是xtext随附的算术示例。或者您可以使用编辑器切换视图 - 这就是乌龟示例所做的(https://github.com/xtext/seven-languages-xtext/blob/c04e8d56e362bfb8d6163f4b001b22ab878686ca/languages/org.xtext.tortoiseshell.lib/src/org/xtext/tortoiseshell/lib/view/TortoiseView.xtend)。或者您可以简单地通过右键单击上下文菜单(和/或快捷方式)来调用eclipse命令。这是一个小代码片段,介绍如何构建适用于打开文件的Eclipse Command Handler。 (取自https://christiandietrich.wordpress.com/2011/10/15/xtext-calling-the-generator-from-a-context-menu/

public class InterpretCodeHandler extends AbstractHandler implements IHandler {

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {

        IEditorPart activeEditor = HandlerUtil.getActiveEditor(event);
        IFile file = (IFile) activeEditor.getEditorInput().getAdapter(IFile.class);
        if (file != null) {
            IProject project = file.getProject();



            if (activeEditor instanceof XtextEditor) {
                ((XtextEditor)activeEditor).getDocument().readOnly(new IUnitOfWork<Boolean, XtextResource>() {

                    @Override
                    public Boolean exec(XtextResource state)
                            throws Exception {
                        // TODO your code here
                        return Boolean.TRUE;
                    }
                });

            }
        }
        return null;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}

它基本上可以调用XtextEditor.getDocument()。readOnly() 这使您可以访问xtext资源,您可以使用它。

以及此处的注册

<extension point="org.eclipse.ui.menus">
    <menuContribution locationURI="popup:#TextEditorContext?after=additions">
        <command commandId="org.xtext.example.mydsl.ui.handler.InterpreterCommand" style="push">
            <visibleWhen checkEnabled="false">
                   <reference definitionId="org.xtext.example.mydsl.MyDsl.Editor.opened"></reference>
            </visibleWhen>
        </command>
    </menuContribution>
</extension>
<extension point="org.eclipse.ui.handlers">
     <handler class="org.xtext.example.mydsl.ui.MyDslExecutableExtensionFactory:org.xtext.example.mydsl.ui.handler.InterpretCodeHandler" commandId="org.xtext.example.mydsl.ui.handler.InterpreterCommand">
     </handler>  
</extension> 
<extension point="org.eclipse.ui.commands">
      <command name="Interpret Code" id="org.xtext.example.mydsl.ui.handler.InterpreterCommand">
      </command>
</extension>