2014-10-08 25 views
0

我在寫一個Xtext語法,它可以訪問在函數之前聲明的文檔。Xtext語法mixin導致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,我想以獨立的方式訪問這個解析器。所以,我創建了下面的解析器文件(基於這個例子: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(); 
    } 
} 

然而,當我嘗試運行它,我收到吉斯注入錯誤說

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。