/******************************************************************************* * Copyright (c) 2007, 2008 Edgar Espina. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.deved.antlride.core.model; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; public interface IOptions extends IModelElement { String AST_LABEL_TYPE = "ASTLabelType"; String BACKTRACK = "backtrack"; String OUTPUT = "output"; public enum EOptions { E_AST_LABEL_TYPE(AST_LABEL_TYPE, GrammarType.COMBINED, GrammarType.PARSER, GrammarType.TREE_PARSER), E_BACKTRACK(BACKTRACK), E_FILTER("filter", GrammarType.LEXER), E_K("k"), E_GREEDY("greedy"), E_LANGUAGE("language"), E_MEMOIZE("memoize"), E_OUTPUT(OUTPUT, GrammarType.COMBINED, GrammarType.PARSER, GrammarType.TREE_PARSER), E_REWRITE("rewrite"), E_SUPER_CLASS("superClass"), E_TOKEN_VOCAB("tokenVocab", GrammarType.PARSER, GrammarType.TREE_PARSER), E_TOKEN_LABEL_TYPE("TokenLabelType"); private String optionName; private GrammarType[] supportedGrammars; private EOptions(String optionName, GrammarType... supportedGrammars) { this.optionName = optionName; this.supportedGrammars = supportedGrammars; } static public String[] getMissingBlockOptions(IOptions options) { Collection<String> stringOptions = collectOptions(options); Collection<String> missingOptions = new ArrayList<String>(); EOptions[] optionValues = { E_K, E_GREEDY, E_MEMOIZE, E_BACKTRACK }; IGrammar grammar = options.getAdapter(IGrammar.class); GrammarType grammarType; if (grammar != null && (grammarType = grammar.getGrammarType()) != null) { for (EOptions option : optionValues) { if (option.isValidOption(grammarType) && (!stringOptions.contains(option.optionName))) { missingOptions.add(option.optionName); } } } String[] result = new String[missingOptions.size()]; missingOptions.toArray(result); missingOptions.clear(); return result; } static public String[] getMissingGrammarOptions(IOptions options) { Collection<String> stringOptions = collectOptions(options); Collection<String> missingOptions = new ArrayList<String>(); EOptions[] optionValues = values(); IGrammar grammar = options.getAdapter(IGrammar.class); GrammarType grammarType; if (grammar != null && (grammarType = grammar.getGrammarType()) != null) { for (EOptions option : optionValues) { if (option.isValidOption(grammarType) && (!stringOptions.contains(option.optionName))) { missingOptions.add(option.optionName); } } } String[] result = new String[missingOptions.size()]; missingOptions.toArray(result); missingOptions.clear(); return result; } static private Collection<String> collectOptions(IOptions options) { Collection<String> stringOptions = Collections.emptyList(); if (options != null && options.getOptions() != null && options.getOptions().length > 0) { stringOptions = new ArrayList<String>(); IOption[] optionsArray = options.getOptions(); for (int i = 0; i < optionsArray.length; i++) { IOptionName optionName = optionsArray[i].getName(); if (optionName != null) stringOptions.add(optionName.getElementName()); } } return stringOptions; } public boolean isValidOption(GrammarType grammarType) { if (supportedGrammars == null || supportedGrammars.length == 0) return true; for (GrammarType gt : supportedGrammars) { if (gt == grammarType) return true; } return false; } public String optionName() { return optionName; } } IOption findOption(String name); IOption[] getOptions(); int length(); }