【问题标题】:Make a own interpreter for a Xtext grammar为 Xtext 语法制作自己的解释器
【发布时间】:2017-04-14 14:46:56
【问题描述】:

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

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

我的最后一个问题是,如果您知道一个教程或更好的方法来实现 Xtext 语法的解释器并且所有这些都可以一起工作?我试图理解乌龟的例子,但我什么都不懂。

谢谢!!!

【问题讨论】:

    标签: java eclipse interpreter dsl xtext


    【解决方案1】:

    嗯,这是一个很难给出一般答案的问题。这在很大程度上取决于您的口译员做什么以及它如何提供反馈。即使是逐行工作也可能根本没有意义,而是简单地迭代模型内容。您可以想象当用户在文件中按 Enter 键时在“自动编辑”中执行此操作。这就是 xtext 附带的算术示例所做的。或者您可以使用编辑器切换视图 - 这就是乌龟示例所做的 (https://github.com/xtext/seven-languages-xtext/blob/c04e8d56e362bfb8d6163f4b001b22ab878686ca/languages/org.xtext.tortoiseshell.lib/src/org/xtext/tortoiseshell/lib/view/TortoiseView.xtend)。或者您可以简单地通过右键单击上下文菜单(和/或快捷方式)调用 eclipse 命令。这是一个小 sn-p 如何构建一个在打开文件上工作的 Eclipse 命令处理程序。 (取自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> 
    

    【讨论】:

      猜你喜欢
      • 2011-03-08
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      相关资源
      最近更新 更多