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; /** * @author Sebastian Erdweg <seba at informatik uni-marburg de> */ public class HaskellLanguage extends AbstractBaseLanguage { private HaskellLanguage() { } private static HaskellLanguage instance = new HaskellLanguage(); public static HaskellLanguage getInstance() { return instance; } /** * @see org.sugarj.AbstractBaseLanguage#createNewProcessor() */ @Override public AbstractBaseProcessor createNewProcessor() { return new HaskellProcessor(); } @Override public String getVersion() { return "haskell-0.1a"; } @Override public String getLanguageName() { return "Haskell"; } @Override public String getBinaryFileExtension() { return "o"; } @Override public String getSugarFileExtension() { return "shs"; } @Override public String getBaseFileExtension() { return "hs"; } @Override public List<Path> getPackagedGrammars() { List<Path> grammars = new LinkedList<Path>(super.getPackagedGrammars()); grammars.add(ensureFile("org/sugarj/languages/SugarHaskell.def")); grammars.add(ensureFile("org/sugarj/languages/Haskell.def")); return Collections.unmodifiableList(grammars); } @Override public Path getInitEditor() { return ensureFile("org/sugarj/haskell/initEditor.serv"); } @Override public String getInitEditorModuleName() { return "org/sugarj/haskell/initEditor"; } @Override public Path getInitGrammar() { return ensureFile("org/sugarj/haskell/initGrammar.sdf"); } @Override public String getInitGrammarModuleName() { return "org/sugarj/haskell/initGrammar"; } @Override public Path getInitTrans() { return ensureFile("org/sugarj/haskell/initTrans.str"); } @Override public String getInitTransModuleName() { return "org/sugarj/haskell/initTrans"; } @Override public boolean isExtensionDecl(IStrategoTerm decl) { if (isApplication(decl, "ExtensionBody")) return true; return false; } @Override public boolean isImportDecl(IStrategoTerm decl) { return isApplication(decl, "Import"); } @Override public boolean isBaseDecl(IStrategoTerm decl) { return isApplication(decl, "HaskellBody") || isNamespaceDec(decl); } public boolean isNamespaceDec(IStrategoTerm decl) { return isApplication(decl, "ModuleDec"); } @Override public boolean isPlainDecl(IStrategoTerm decl) { if (isApplication(decl, "PlainDec")) return true; return false; } }