为 Xtext 语法制作自己的解释器
Make a own interpreter for a Xtext grammar
我有一个用 Xtext 编写的语法,我可以在其中从 plugin.xml 启动 eclipse 应用程序并测试我的语法。现在我需要做一个解释器来启动我的 DSL 代码。
我用 class 解释器制作了一个包,但我不知道如何访问在 eclipse 编辑器中打开的文件以供启动。
另一方面,我认为解释器逐行读取编辑器中的文件和 运行 句子,这样对吗?
我的最后一个问题是,您是否知道实现 Xtext 语法解释器并协同工作的教程或更好的方法?我试图理解 Tortoise 示例,但我什么都不懂。
谢谢!!!
好吧,这是一个很难给出一般性答案的问题。这在很大程度上取决于您的口译员做什么以及它如何提供反馈。即使逐行工作也可能根本没有意义,而只是简单地遍历模型内容。您可以想象当用户在文件中按回车键时在 "autoedit" 上执行此操作。这就是 xtext 附带的算术示例所做的。或者您可以使用编辑器切换视图 - 这就是乌龟示例所做的 (https://github.com/xtext/seven-languages-xtext/blob/c04e8d56e362bfb8d6163f4b001b22ab878686ca/languages/org.xtext.tortoiseshell.lib/src/org/xtext/tortoiseshell/lib/view/TortoiseView.xtend). Or you could simply have a eclipse command that you call via rightclick from context menu (and or a shortcut). Here is a small snippet how to build a Eclipse Command Handler that works on a open file. (taken from 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>
我有一个用 Xtext 编写的语法,我可以在其中从 plugin.xml 启动 eclipse 应用程序并测试我的语法。现在我需要做一个解释器来启动我的 DSL 代码。
我用 class 解释器制作了一个包,但我不知道如何访问在 eclipse 编辑器中打开的文件以供启动。 另一方面,我认为解释器逐行读取编辑器中的文件和 运行 句子,这样对吗?
我的最后一个问题是,您是否知道实现 Xtext 语法解释器并协同工作的教程或更好的方法?我试图理解 Tortoise 示例,但我什么都不懂。
谢谢!!!
好吧,这是一个很难给出一般性答案的问题。这在很大程度上取决于您的口译员做什么以及它如何提供反馈。即使逐行工作也可能根本没有意义,而只是简单地遍历模型内容。您可以想象当用户在文件中按回车键时在 "autoedit" 上执行此操作。这就是 xtext 附带的算术示例所做的。或者您可以使用编辑器切换视图 - 这就是乌龟示例所做的 (https://github.com/xtext/seven-languages-xtext/blob/c04e8d56e362bfb8d6163f4b001b22ab878686ca/languages/org.xtext.tortoiseshell.lib/src/org/xtext/tortoiseshell/lib/view/TortoiseView.xtend). Or you could simply have a eclipse command that you call via rightclick from context menu (and or a shortcut). Here is a small snippet how to build a Eclipse Command Handler that works on a open file. (taken from 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>