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);
}
}
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;
}
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);
}
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;
}
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;
}
Aggregations