Search in sources :

Example 6 with ILanguageComponent

use of org.metaborg.core.language.ILanguageComponent in project spoofax by metaborg.

the class JSGLRParseService method parse.

@Override
public ISpoofaxParseUnit parse(ISpoofaxInputUnit input, IProgress progress, ICancel cancel) throws ParseException {
    final FileObject source = input.source();
    final ILanguageImpl langImpl;
    final ILanguageImpl base;
    if (input.dialect() != null) {
        langImpl = input.dialect();
        base = input.langImpl();
    } else {
        langImpl = input.langImpl();
        base = null;
    }
    final String text = input.text();
    final ITermFactory termFactory = termFactoryService.get(langImpl, null, false);
    final IParserConfig config;
    JSGLRParserConfiguration parserConfig = input.config();
    if (parserConfig == null) {
        parserConfig = defaultParserConfig;
    }
    if (parserConfig.completion) {
        config = getCompletionParserConfig(langImpl, input);
    } else {
        config = getParserConfig(langImpl, input);
    }
    try {
        logger.trace("Parsing {}", source);
        JSGLRVersion version = jsglrVersion(input);
        final JSGLRI<?> parser;
        boolean dataDependentParsing = false;
        for (ILanguageComponent component : langImpl.components()) {
            if (component.config().dataDependent()) {
                dataDependentParsing = true;
            }
        }
        if (version == JSGLRVersion.v2) {
            if (dataDependentParsing) {
                parser = new JSGLR2I(config, termFactory, langImpl, null, source, text, true);
            } else {
                parser = new JSGLR2I(config, termFactory, langImpl, null, source, text, false);
            }
        } else {
            if (base != null) {
                parser = new JSGLR1I(config, termFactory, base, langImpl, source, text);
            } else {
                parser = new JSGLR1I(config, termFactory, langImpl, null, source, text);
            }
        }
        final ParseContrib contrib = parser.parse(parserConfig);
        if (version == JSGLRVersion.v2) {
            if (contrib.valid)
                logger.info("Valid JSGLR2 parse");
            else
                logger.info("Invalid JSGLR2 parse");
        }
        final ISpoofaxParseUnit unit = unitService.parseUnit(input, contrib);
        return unit;
    } catch (IOException | InvalidParseTableException | ParseTableReadException e) {
        throw new ParseException(input, e);
    }
}
Also used : ISpoofaxParseUnit(org.metaborg.spoofax.core.unit.ISpoofaxParseUnit) ParseContrib(org.metaborg.spoofax.core.unit.ParseContrib) JSGLRVersion(org.metaborg.core.config.JSGLRVersion) IOException(java.io.IOException) ILanguageImpl(org.metaborg.core.language.ILanguageImpl) FileObject(org.apache.commons.vfs2.FileObject) ParseException(org.metaborg.core.syntax.ParseException) ITermFactory(org.spoofax.interpreter.terms.ITermFactory) ILanguageComponent(org.metaborg.core.language.ILanguageComponent) InvalidParseTableException(org.spoofax.jsglr.client.InvalidParseTableException) ParseTableReadException(org.spoofax.jsglr2.parsetable.ParseTableReadException)

Example 7 with ILanguageComponent

use of org.metaborg.core.language.ILanguageComponent in project spoofax by metaborg.

the class JSGLRParseService method getParserConfig.

public IParserConfig getParserConfig(ILanguageImpl lang, ISpoofaxInputUnit input) throws ParseException {
    IParserConfig config = parserConfigs.get(lang);
    if (config == null) {
        final ITermFactory termFactory = termFactoryService.getGeneric().getFactoryWithStorageType(IStrategoTerm.MUTABLE);
        final SyntaxFacet facet = lang.facet(SyntaxFacet.class);
        FileObject parseTable = null;
        boolean incrementalPTGen = false;
        for (ILanguageComponent component : lang.components()) {
            if (component.config().sdfEnabled() && component.config().sdf2tableVersion() == Sdf2tableVersion.incremental) {
                incrementalPTGen = true;
            }
        }
        if (facet.parseTable == null) {
            try {
                boolean multipleTables = false;
                for (ILanguageComponent component : lang.components()) {
                    if (component.config().sdfEnabled()) {
                        if (component.config().parseTable() != null) {
                            if (multipleTables) {
                                logger.error("Different components are specifying multiple parse tables.");
                                throw new ParseException(input);
                            }
                            parseTable = component.location().resolveFile(component.config().parseTable());
                            multipleTables = true;
                        }
                    }
                }
            } catch (FileSystemException e) {
                logger.error("Parse table not found or sdf is not enabled for this language.");
                throw new ParseException(input, e);
            }
        } else {
            parseTable = facet.parseTable;
        }
        try {
            if (parseTable == null || !parseTable.exists()) {
                logger.error("Parse table not found or sdf is not enabled for this language.");
                throw new ParseException(input);
            }
        } catch (FileSystemException e) {
            logger.error("Parse table not found or sdf is not enabled for this language.");
            throw new ParseException(input, e);
        }
        final IParseTableProvider provider;
        JSGLRVersion version = jsglrVersion(input);
        if (version == JSGLRVersion.v2) {
            provider = new JSGLR2FileParseTableProvider(parseTable, termFactory);
        } else {
            final ParseTable referenceParseTable = referenceParseTables.get(lang);
            if (referenceParseTable != null && incrementalPTGen) {
                provider = new JSGLR1IncrementalParseTableProvider(parseTable, termFactory, referenceParseTable);
            } else {
                provider = new JSGLR1FileParseTableProvider(parseTable, termFactory);
            }
        }
        config = new ParserConfig(Iterables.get(facet.startSymbols, 0), provider);
        parserConfigs.put(lang, config);
    }
    return config;
}
Also used : ParseTable(org.metaborg.sdf2table.parsetable.ParseTable) JSGLRVersion(org.metaborg.core.config.JSGLRVersion) FileSystemException(org.apache.commons.vfs2.FileSystemException) FileObject(org.apache.commons.vfs2.FileObject) ParseException(org.metaborg.core.syntax.ParseException) ITermFactory(org.spoofax.interpreter.terms.ITermFactory) ILanguageComponent(org.metaborg.core.language.ILanguageComponent)

Example 8 with ILanguageComponent

use of org.metaborg.core.language.ILanguageComponent in project spoofax by metaborg.

the class JSGLRParseService method invalidateCache.

@Override
public void invalidateCache(ILanguageImpl impl) {
    boolean incrementalPTGen = false;
    org.spoofax.jsglr.client.ParseTable pt = null;
    for (ILanguageComponent component : impl.components()) {
        if (component.config().sdfEnabled() && component.config().sdf2tableVersion() == Sdf2tableVersion.incremental) {
            incrementalPTGen = true;
        }
    }
    logger.debug("Storing reference parse table for {}", impl);
    if (parserConfigs.get(impl) != null && incrementalPTGen) {
        try {
            pt = (org.spoofax.jsglr.client.ParseTable) parserConfigs.get(impl).getParseTableProvider().parseTable();
            if (pt != null && pt.getPTgenerator() != null && pt.getPTgenerator().getParseTable() != null) {
                referenceParseTables.put(impl, pt.getPTgenerator().getParseTable());
            }
        } catch (IOException e) {
            logger.error("Could not save reference parse table for incremental parse table generation.");
        }
    }
    if (completionParserConfigs.get(impl) != null && incrementalPTGen) {
        try {
            pt = (org.spoofax.jsglr.client.ParseTable) completionParserConfigs.get(impl).getParseTableProvider().parseTable();
            if (pt != null && pt.getPTgenerator() != null && pt.getPTgenerator().getParseTable() != null) {
                referenceCompletionParseTables.put(impl, pt.getPTgenerator().getParseTable());
            }
        } catch (IOException e) {
            logger.error("Could not save reference completion parse table for incremental parse table generation.");
        }
    }
    logger.debug("Removing cached parse table for {}", impl);
    parserConfigs.remove(impl);
    completionParserConfigs.remove(impl);
}
Also used : IOException(java.io.IOException) ILanguageComponent(org.metaborg.core.language.ILanguageComponent)

Example 9 with ILanguageComponent

use of org.metaborg.core.language.ILanguageComponent in project spoofax by metaborg.

the class JSGLRParseService method getCompletionParserConfig.

public IParserConfig getCompletionParserConfig(ILanguageImpl lang, ISpoofaxInputUnit input) throws ParseException {
    IParserConfig config = completionParserConfigs.get(lang);
    if (config == null) {
        final ITermFactory termFactory = termFactoryService.getGeneric().getFactoryWithStorageType(IStrategoTerm.MUTABLE);
        final SyntaxFacet facet = lang.facet(SyntaxFacet.class);
        FileObject completionParseTable = null;
        boolean incrementalPTGen = false;
        for (ILanguageComponent component : lang.components()) {
            if (component.config().sdfEnabled() && component.config().sdf2tableVersion() == Sdf2tableVersion.incremental) {
                incrementalPTGen = true;
            }
        }
        if (facet.completionParseTable == null) {
            try {
                boolean multipleTables = false;
                for (ILanguageComponent component : lang.components()) {
                    if (component.config().sdfEnabled()) {
                        if (component.config().completionsParseTable() != null) {
                            if (multipleTables) {
                                logger.error("Different components are specifying multiple completion parse tables.");
                                throw new ParseException(input);
                            }
                            completionParseTable = component.location().resolveFile(component.config().completionsParseTable());
                            multipleTables = true;
                        }
                    }
                }
            } catch (FileSystemException e) {
                logger.error("Completion parse table not found or sdf is not enabled for this language.");
                throw new ParseException(input, e);
            }
        } else {
            completionParseTable = facet.completionParseTable;
        }
        try {
            if (completionParseTable == null || !completionParseTable.exists()) {
                logger.error("Completion parse table not found or sdf is not enabled for this language.");
                throw new ParseException(input);
            }
        } catch (FileSystemException e) {
            logger.error("Completion parse table not found or sdf is not enabled for this language.");
            throw new ParseException(input, e);
        }
        final IParseTableProvider provider;
        final ParseTable referenceParseTable = referenceCompletionParseTables.get(lang);
        if (referenceParseTable != null && incrementalPTGen) {
            provider = new JSGLR1IncrementalParseTableProvider(completionParseTable, termFactory, referenceParseTable);
        } else {
            provider = new JSGLR1FileParseTableProvider(completionParseTable, termFactory);
        }
        config = new ParserConfig(Iterables.get(facet.startSymbols, 0), provider);
        completionParserConfigs.put(lang, config);
    }
    return config;
}
Also used : ParseTable(org.metaborg.sdf2table.parsetable.ParseTable) FileSystemException(org.apache.commons.vfs2.FileSystemException) FileObject(org.apache.commons.vfs2.FileObject) ParseException(org.metaborg.core.syntax.ParseException) ITermFactory(org.spoofax.interpreter.terms.ITermFactory) ILanguageComponent(org.metaborg.core.language.ILanguageComponent)

Example 10 with ILanguageComponent

use of org.metaborg.core.language.ILanguageComponent in project spoofax by metaborg.

the class TermFactoryService method getTypesmartContext.

private TypesmartContext getTypesmartContext(ILanguageImpl impl) {
    TypesmartContext context = implMergedTypesmartContexts.get(impl);
    if (context == null) {
        context = TypesmartContext.empty();
        for (ILanguageComponent component : impl.components()) {
            context = context.merge(getTypesmartContext(component));
        }
        implMergedTypesmartContexts.put(impl, context);
    }
    return context;
}
Also used : ILanguageComponent(org.metaborg.core.language.ILanguageComponent) TypesmartContext(org.spoofax.terms.typesmart.TypesmartContext)

Aggregations

ILanguageComponent (org.metaborg.core.language.ILanguageComponent)40 FileObject (org.apache.commons.vfs2.FileObject)26 ILanguageImpl (org.metaborg.core.language.ILanguageImpl)24 Test (org.junit.Test)12 LanguageIdentifier (org.metaborg.core.language.LanguageIdentifier)11 LanguageVersion (org.metaborg.core.language.LanguageVersion)11 MetaborgTest (org.metaborg.core.test.MetaborgTest)11 IStrategoTerm (org.spoofax.interpreter.terms.IStrategoTerm)9 ITermFactory (org.spoofax.interpreter.terms.ITermFactory)9 HybridInterpreter (org.strategoxt.HybridInterpreter)9 IStrategoString (org.spoofax.interpreter.terms.IStrategoString)8 ILanguage (org.metaborg.core.language.ILanguage)7 MetaborgException (org.metaborg.core.MetaborgException)6 IContext (org.metaborg.core.context.IContext)5 Nullable (javax.annotation.Nullable)4 MetaborgRuntimeException (org.metaborg.core.MetaborgRuntimeException)4 ICompletion (org.metaborg.core.completion.ICompletion)4 IStrategoList (org.spoofax.interpreter.terms.IStrategoList)4 IOException (java.io.IOException)3 FileSystemException (org.apache.commons.vfs2.FileSystemException)3