use of org.metaborg.core.config.JSGLRVersion 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.config.JSGLRVersion 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;
}
Aggregations