package org.sugarj;
import static org.sugarj.common.ATermCommands.isApplication;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.spoofax.interpreter.terms.IStrategoTerm;
import org.sugarj.common.path.Path;
public class PrologLanguage extends AbstractBaseLanguage {
private PrologLanguage() { }
private static PrologLanguage instance = new PrologLanguage();
public static PrologLanguage getInstance() {
return instance;
}
@Override
public String getVersion() {
return "prolog-0.1a";
}
@Override
public String getLanguageName() {
return "Prolog";
}
@Override
public AbstractBaseProcessor createNewProcessor() {
return new PrologProcessor();
}
@Override
public String getBinaryFileExtension() {
return null;
}
@Override
public String getBaseFileExtension() {
return "pro";
}
@Override
public String getSugarFileExtension() {
return "sugp";
}
@Override
public List<Path> getPackagedGrammars() {
List<Path> grammars = new LinkedList<Path>(super.getPackagedGrammars());
grammars.add(ensureFile("org/sugarj/languages/SugarProlog.def"));
grammars.add(ensureFile("org/sugarj/languages/Prolog.def"));
return Collections.unmodifiableList(grammars);
}
@Override
public Path getInitEditor() {
return ensureFile("org/sugarj/prolog/init/initEditor.serv");
}
@Override
public String getInitEditorModuleName() {
return "org/sugarj/prolog/init/initEditor";
}
@Override
public Path getInitGrammar() {
return ensureFile("org/sugarj/prolog/init/initGrammar.sdf");
}
@Override
public String getInitGrammarModuleName() {
return "org/sugarj/prolog/init/initGrammar";
}
@Override
public Path getInitTrans() {
return ensureFile("org/sugarj/prolog/init/InitTrans.str");
}
@Override
public String getInitTransModuleName() {
return "org/sugarj/prolog/init/InitTrans";
}
@Override
public boolean isExtensionDecl(IStrategoTerm decl) {
return isApplication(decl, "ExtensionBody");
}
@Override
public boolean isImportDecl(IStrategoTerm decl) {
return isApplication(decl, "ModuleImport");
}
@Override
public boolean isBaseDecl(IStrategoTerm decl) {
return isApplication(decl, "NonUnitClause")
|| isApplication(decl, "UnitClause")
|| isApplication(decl, "Query")
|| isApplication(decl, "Command")
|| isApplication(decl, "ModuleReexport")
|| isNamespaceDec(decl);
}
public boolean isNamespaceDec(IStrategoTerm decl) {
return isApplication(decl, "ModuleDec") || isApplication(decl, "SugarModuleDec");
}
@Override
public boolean isPlainDecl(IStrategoTerm decl) {
return isApplication(decl, "PlainDec");
}
}