2014-10-08 1 views
0

Я пишу грамматику Xtext, которая может получить доступ к документации, объявленной перед функциями.Xtext Grammar mixins приводят к ошибке ввода Guice

Наша текущая грамматика определяет hidden(ML_COMMENT, SL_COMMENT,...) с:

ML_COMMENT: '/*' -> '*/' 
SL_COMMENT: '//' -> EOL 

я теперь создал второй проект XText со следующей грамматикой:

grammar my.DocumentationGrammar with my.OriginalGrammar hidden(WS, FUNCTION_BODY, EOL, SL_COMMENT) 

import "http://www.originalGrammar.my" 

generate documentationGrammar "http://www.documentationGrammar.my" 

/* Parser rules */ 
TranslationUnit: 
    eds+=DoxExternalDefinition* 
; 

DoxExternalDefinition: 
    def = Definition 
    | lib = CtrlLibUsage 
    | comment=ML_COMMENT 
; 

FunctionDefinition: 
    aml=AccessModifiersList ts=TypeSpecifier? f=Function '(' pl=ParameterTypeList? ')' /* cs=CompoundStatement */ // the compound statement is ignored 
; 

//terminal DOXYGEN_COMMENT: ML_COMMENT; 
terminal FUNCTION_BODY: '{' -> '}'; 

Я создал зависимость в плагин и добавил этот до

bean = StandaloneSetup { 
    scanClassPath = true 
    platformUri = "${runtimeProject}/.." 
    // The following two lines can be removed, if Xbase is not used. 
    registerGeneratedEPackage = "org.eclipse.xtext.xbase.XbasePackage" 
    registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel" 

    // we need to register the super genmodel 
    registerGeneratedEPackage = "my.OriginalGrammar.OriginalGrammarPackage" 
    registerGenModelFile = "platform:/resource/my.OriginalGrammar/model/generated/OriginalGrammar.genmodel" 
} 

Теперь в моем третьем плагине p roject, я хочу получить доступ к этому парсеру в автономном режиме. Таким образом, я создал следующий Parser файл (на основе этого примера: http://davehofmann.de/blog/?p=101):

import java.io.IOException; 
import java.io.Reader; 
import java.nio.file.Path; 

import org.eclipse.emf.common.util.URI; 
import org.eclipse.emf.ecore.EObject; 
import org.eclipse.emf.ecore.resource.Resource; 
import org.eclipse.xtext.parser.IParseResult; 
import org.eclipse.xtext.parser.IParser; 
import org.eclipse.xtext.parser.ParseException; 
import org.eclipse.xtext.resource.XtextResource; 
import org.eclipse.xtext.resource.XtextResourceSet; 

import my.DocumentationGrammar.DocumentationGrammarStandaloneSetup; 

import com.google.inject.Inject; 
import com.google.inject.Injector; 

public class DoxygenParser { 

    @Inject 
    private IParser parser; 
    private Injector injector; 

    public DoxygenParser() { 
     setupParser(); 
    } 

    private void setupParser() {  
     injector = new DocumentationGrammarStandaloneSetup().createInjectorAndDoEMFRegistration(); 
     injector.injectMembers(this); 

    } 

    /** 
    * Parses data provided by an input reader using Xtext and returns the root node of the resulting object tree. 
    * @param reader Input reader 
    * @return root object node 
    * @throws IOException when errors occur during the parsing process 
    */ 
    public EObject parse(Reader reader) throws IOException 
    { 
     IParseResult result = parser.parse(reader); 
     if(result.hasSyntaxErrors()) 
     { 
      throw new ParseException("Provided input contains syntax errors."); 
     } 
     return result.getRootASTElement(); 
    } 
} 

Однако, когда я пытаюсь запустить его, я получаю Guice ошибки Инъекции сказать, что

com.google.inject.ProvisionException: Guice provision errors: 
1) Error injecting constructor, org.eclipse.emf.common.util.WrappedException: java.lang.RuntimeException: Cannot create a resource for 'classpath:/my/documentationGrammar/DocumentationGrammar.xtextbin'; a registered resource factory is needed 

Я знаю, что парсер «должен» быть правильным, поскольку, когда я использую OriginalGrammarStandaloneSetup, он работает отлично.

ответ

2

Вы должны убедиться, что ваш подъязык также вызывает автономную настройку вашего суперязыка. Обычно это генерируется в классе DocumentationGrammarStandaloneSetupGenerated, но, пожалуйста, убедитесь, что это было правильно настроено с помощью Xtext. В конце концов, там должно быть что-то вроде

if (!Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().containsKey("xtextbin")) 
    Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
       "xtextbin", new BinaryGrammarResourceFactoryImpl()); 

в callchain из createInjectorAndDoEMFRegistration метода вашей установки в.