2017-04-13 4 views
0

J'ai une grammaire en Xtext, où je peux lancer une application eclipse depuis le fichier plugin.xml et tester ma grammaire. Maintenant, j'ai besoin de faire un interprète pour être en mesure de lancer mon code de mon DSL.Faire son propre interprète pour une grammaire Xtext

J'ai fait un paquet avec un interprète de classe mais je ne sais pas comment accéder au fichier ouvert dans l'éditeur eclipse pour être lancé. D'autre part, je pense que l'interprète lit ligne par ligne le fichier dans l'éditeur et exécute la phrase, est-ce exact?

Ma dernière question est, si vous connaissez un tutoriel ou une meilleure façon de mettre en œuvre un interpréteur pour une grammaire Xtext et tous travailler ensemble? J'essaie de comprendre l'exemple de tortue mais je ne comprends rien.

Merci !!!

Répondre

1

Eh bien c'est une question qui est tout à fait impossible de donner une réponse générale à. Cela dépend fortement de ce que fait votre interprète et de la façon dont il donne son avis. Même travailler ligne par ligne peut ne pas avoir de sens du tout au lieu de simplement parcourir le contenu du modèle. Vous pouvez imaginer de faire cela sur "autoedit" lorsque l'utilisateur frappe entrer dans le fichier. C'est ce que fait votre exemple d'arithmétique livré avec xtext. Ou vous pouvez basculer une vue avec l'éditeur - c'est ce que fait l'exemple de tortue (https://github.com/xtext/seven-languages-xtext/blob/c04e8d56e362bfb8d6163f4b001b22ab878686ca/languages/org.xtext.tortoiseshell.lib/src/org/xtext/tortoiseshell/lib/view/TortoiseView.xtend). Ou vous pourriez simplement avoir une commande eclipse que vous appelez via un clic droit depuis le menu contextuel (et ou un raccourci). Voici un petit extrait comment construire un gestionnaire de commandes Eclipse qui fonctionne sur un fichier ouvert. (Extrait de 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; 
    } 

} 

Il essentiellement des clous vers le bas pour appeler XtextEditor.getDocument(). ReadOnly() qui vous donne accès à la ressource xtext et vous pouvez travailler avec elle.

et ici son enregistrement (s)

<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>