Files
CSJavaCC/csjavacc/parser/Options.java
2023-05-14 16:56:30 +02:00

519 lines
17 KiB
Java

/*
* Copyright © 2002 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* California 95054, U.S.A. All rights reserved. Sun Microsystems, Inc. has
* intellectual property rights relating to technology embodied in the product
* that is described in this document. In particular, and without limitation,
* these intellectual property rights may include one or more of the U.S.
* patents listed at http://www.sun.com/patents and one or more additional
* patents or pending patent applications in the U.S. and in other countries.
* U.S. Government Rights - Commercial software. Government users are subject
* to the Sun Microsystems, Inc. standard license agreement and applicable
* provisions of the FAR and its supplements. Use is subject to license terms.
* Sun, Sun Microsystems, the Sun logo and Java are trademarks or registered
* trademarks of Sun Microsystems, Inc. in the U.S. and other countries. This
* product is covered and controlled by U.S. Export Control laws and may be
* subject to the export or import laws in other countries. Nuclear, missile,
* chemical biological weapons or nuclear maritime end uses or end users,
* whether direct or indirect, are strictly prohibited. Export or reexport
* to countries subject to U.S. embargo or to entities identified on U.S.
* export exclusion lists, including, but not limited to, the denied persons
* and specially designated nationals lists is strictly prohibited.
*/
package csjavacc.parser;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* A class with static state that stores all option information.
*/
public class Options {
/**
* Limit subclassing to derived classes.
*/
protected Options() {
}
/**
* A mapping of option names (Strings) to values (Integer, Boolean, String).
* This table is initialized by the main program. Its contents defines the
* set of legal options. Its initial values define the default option
* values, and the option types can be determined from these values too.
*/
protected static Map optionValues = null;
/**
* Convenience method to retrieve integer options.
*/
protected static int intValue(final String option) {
return ((Integer) optionValues.get(option)).intValue();
}
/**
* Convenience method to retrieve boolean options.
*/
protected static boolean booleanValue(final String option) {
return ((Boolean) optionValues.get(option)).booleanValue();
}
/**
* Convenience method to retrieve string options.
*/
protected static String stringValue(final String option) {
return (String) optionValues.get(option);
}
/**
* Keep track of what options were set as a command line argument. We use
* this to see if the options set from the command line and the ones set in
* the input files clash in any way.
*/
private static Set cmdLineSetting = null;
/**
* Keep track of what options were set from the grammar file. We use this to
* see if the options set from the command line and the ones set in the
* input files clash in any way.
*/
private static Set inputFileSetting = null;
/**
* Initialize for JavaCC
*/
public static void init() {
optionValues = new HashMap();
cmdLineSetting = new HashSet();
inputFileSetting = new HashSet();
optionValues.put("LOOKAHEAD", new Integer(1));
optionValues.put("CHOICE_AMBIGUITY_CHECK", new Integer(2));
optionValues.put("OTHER_AMBIGUITY_CHECK", new Integer(1));
optionValues.put("STATIC", Boolean.TRUE);
optionValues.put("DEBUG_PARSER", Boolean.FALSE);
optionValues.put("DEBUG_LOOKAHEAD", Boolean.FALSE);
optionValues.put("DEBUG_TOKEN_MANAGER", Boolean.FALSE);
optionValues.put("ERROR_REPORTING", Boolean.TRUE);
optionValues.put("CS_UNICODE_ESCAPE", Boolean.FALSE);
optionValues.put("UNICODE_INPUT", Boolean.FALSE);
optionValues.put("IGNORE_CASE", Boolean.FALSE);
optionValues.put("USER_TOKEN_MANAGER", Boolean.FALSE);
optionValues.put("USER_CHAR_STREAM", Boolean.FALSE);
optionValues.put("BUILD_PARSER", Boolean.TRUE);
optionValues.put("BUILD_TOKEN_MANAGER", Boolean.TRUE);
optionValues.put("TOKEN_MANAGER_USES_PARSER", Boolean.FALSE);
optionValues.put("SANITY_CHECK", Boolean.TRUE);
optionValues.put("FORCE_LA_CHECK", Boolean.FALSE);
optionValues.put("COMMON_TOKEN_ACTION", Boolean.FALSE);
optionValues.put("CACHE_TOKENS", Boolean.FALSE);
optionValues.put("KEEP_LINE_COLUMN", Boolean.TRUE);
optionValues.put("OUTPUT_DIRECTORY", ".");
}
/**
* Determine if a given command line argument might be an option flag.
* Command line options start with a dash (-).
*
* @param opt
* The command line argument to examine.
* @return True when the argument looks like an option flag.
*/
public static boolean isOption(final String opt) {
return opt != null && opt.length() > 1 && opt.charAt(0) == '-';
}
public static void setInputFileOption(Object nameloc, Object valueloc,
String name, int value) {
String s = name.toUpperCase();
if (!optionValues.containsKey(s)) {
CSJavaCCErrors.warning(nameloc, "Bad option name \"" + name
+ "\". Option setting will be ignored.");
return;
}
Object Val = optionValues.get(s);
if (Val != null) {
if (!(Val instanceof Integer) || value <= 0) {
CSJavaCCErrors.warning(valueloc, "Bad option value \"" + value
+ "\" for \"" + name
+ "\". Option setting will be ignored.");
return;
}
if (inputFileSetting.contains(s)) {
CSJavaCCErrors.warning(nameloc, "Duplicate option setting for \""
+ name + "\" will be ignored.");
return;
}
if (cmdLineSetting.contains(s)) {
if (((Integer) Val).intValue() != value) {
CSJavaCCErrors.warning(nameloc, "Command line setting of \""
+ name + "\" modifies option value in file.");
}
return;
}
}
optionValues.put(s, new Integer(value));
inputFileSetting.add(s);
}
public static void setInputFileOption(Object nameloc, Object valueloc,
String name, boolean value) {
String s = name.toUpperCase();
if (!optionValues.containsKey(s)) {
CSJavaCCErrors.warning(nameloc, "Bad option name \"" + name
+ "\". Option setting will be ignored.");
return;
}
Object Val = optionValues.get(s);
if (Val != null) {
if (!(Val instanceof Boolean)) {
CSJavaCCErrors.warning(valueloc, "Bad option value \"" + value
+ "\" for \"" + name
+ "\". Option setting will be ignored.");
return;
}
if (inputFileSetting.contains(s)) {
CSJavaCCErrors.warning(nameloc, "Duplicate option setting for \""
+ name + "\" will be ignored.");
return;
}
if (cmdLineSetting.contains(s)) {
if (((Boolean) Val).booleanValue() != value) {
CSJavaCCErrors.warning(nameloc, "Command line setting of \""
+ name + "\" modifies option value in file.");
}
return;
}
}
optionValues.put(s, (value ? Boolean.TRUE : Boolean.FALSE));
inputFileSetting.add(s);
}
public static void setInputFileOption(Object nameloc, Object valueloc,
String name, String value) {
String s = name.toUpperCase();
if (!optionValues.containsKey(s)) {
CSJavaCCErrors.warning(nameloc, "Bad option name \"" + name
+ "\". Option setting will be ignored.");
return;
}
Object Val = optionValues.get(s);
if (Val != null) {
if (!(Val instanceof String)) {
CSJavaCCErrors.warning(valueloc, "Bad option value \"" + value
+ "\" for \"" + name
+ "\". Option setting will be ignored.");
return;
}
if (inputFileSetting.contains(s)) {
CSJavaCCErrors.warning(nameloc, "Duplicate option setting for \""
+ name + "\" will be ignored.");
return;
}
if (cmdLineSetting.contains(s)) {
if (!Val.equals(value)) {
CSJavaCCErrors.warning(nameloc, "Command line setting of \""
+ name + "\" modifies option value in file.");
}
return;
}
}
optionValues.put(s, value);
inputFileSetting.add(s);
}
/**
*
* @param arg
*/
public static void setCmdLineOption(String arg) {
String s = arg.toUpperCase();
int index = 0;
String name;
Object Val;
while (index < s.length() && s.charAt(index) != '='
&& s.charAt(index) != ':') {
index++;
}
if (index < 2 || index >= s.length() - 1) {
if (index == s.length()) {
if (s.length() > 3 && s.charAt(1) == 'N' && s.charAt(2) == 'O') {
name = s.substring(3);
Val = Boolean.FALSE;
} else {
name = s.substring(1);
Val = Boolean.TRUE;
}
} else {
System.err.println("Warning: Bad option \"" + arg
+ "\" will be ignored.");
return;
}
} else {
if (s.substring(index + 1).equals("TRUE")) {
Val = Boolean.TRUE;
} else if (s.substring(index + 1).equals("FALSE")) {
Val = Boolean.FALSE;
} else {
try {
int i = Integer.parseInt(s.substring(index + 1));
if (i <= 0) {
System.err.println("Warning: Bad option value in \""
+ arg + "\" will be ignored.");
return;
}
Val = new Integer(i);
} catch (NumberFormatException e) {
Val = arg.substring(index + 1);
if (arg.length() > index + 2) {
// i.e., there is space for two '"'s in value
if (arg.charAt(index + 1) == '"'
&& arg.charAt(arg.length() - 1) == '"') {
// remove the two '"'s.
Val = arg.substring(index + 2, arg.length() - 1);
}
}
}
}
name = s.substring(1, index);
}
if (!optionValues.containsKey(name)) {
System.err.println("Warning: Bad option \"" + arg
+ "\" will be ignored.");
return;
}
Object valOrig = optionValues.get(name);
if (Val.getClass() != valOrig.getClass()) {
System.err.println("Warning: Bad option value in \"" + arg
+ "\" will be ignored.");
return;
}
if (cmdLineSetting.contains(name)) {
System.err.println("Warning: Duplicate option setting \"" + arg
+ "\" will be ignored.");
return;
}
optionValues.put(name, Val);
cmdLineSetting.add(name);
}
public static void normalize() {
if (getDebugLookahead() && !getDebugParser()) {
if (cmdLineSetting.contains("DEBUG_PARSER")
|| inputFileSetting.contains("DEBUG_PARSER")) {
CSJavaCCErrors
.warning("True setting of option DEBUG_LOOKAHEAD overrides false setting of option DEBUG_PARSER.");
}
optionValues.put("DEBUG_PARSER", Boolean.TRUE);
}
}
/**
* Find the lookahead setting.
*
* @return The requested lookahead value.
*/
public static int getLookahead() {
return intValue("LOOKAHEAD");
}
/**
* Find the choice ambiguity check value.
*
* @return The requested choice ambiguity check value.
*/
public static int getChoiceAmbiguityCheck() {
return intValue("CHOICE_AMBIGUITY_CHECK");
}
/**
* Find the other ambiguity check value.
*
* @return The requested other ambiguity check value.
*/
public static int getOtherAmbiguityCheck() {
return intValue("OTHER_AMBIGUITY_CHECK");
}
/**
* Find the static value.
*
* @return The requested static value.
*/
public static boolean getStatic() {
return booleanValue("STATIC");
}
/**
* Find the debug parser value.
*
* @return The requested debug parser value.
*/
public static boolean getDebugParser() {
return booleanValue("DEBUG_PARSER");
}
/**
* Find the debug lookahead value.
*
* @return The requested debug lookahead value.
*/
public static boolean getDebugLookahead() {
return booleanValue("DEBUG_LOOKAHEAD");
}
/**
* Find the debug tokenmanager value.
*
* @return The requested debug tokenmanager value.
*/
public static boolean getDebugTokenManager() {
return booleanValue("DEBUG_TOKEN_MANAGER");
}
/**
* Find the error reporting value.
*
* @return The requested error reporting value.
*/
public static boolean getErrorReporting() {
return booleanValue("ERROR_REPORTING");
}
/**
* Find the Java unicode escape value.
*
* @return The requested Java unicode escape value.
*/
public static boolean getCSUnicodeEscape() {
return booleanValue("CS_UNICODE_ESCAPE");
}
/**
* Find the unicode input value.
*
* @return The requested unicode input value.
*/
public static boolean getUnicodeInput() {
return booleanValue("UNICODE_INPUT");
}
/**
* Find the ignore case value.
*
* @return The requested ignore case value.
*/
public static boolean getIgnoreCase() {
return booleanValue("IGNORE_CASE");
}
/**
* Find the user tokenmanager value.
*
* @return The requested user tokenmanager value.
*/
public static boolean getUserTokenManager() {
return booleanValue("USER_TOKEN_MANAGER");
}
/**
* Find the user charstream value.
*
* @return The requested user charstream value.
*/
public static boolean getUserCharStream() {
return booleanValue("USER_CHAR_STREAM");
}
/**
* Find the build parser value.
*
* @return The requested build parser value.
*/
public static boolean getBuildParser() {
return booleanValue("BUILD_PARSER");
}
/**
* Find the build token manager value.
*
* @return The requested build token manager value.
*/
public static boolean getBuildTokenManager() {
return booleanValue("BUILD_TOKEN_MANAGER");
}
/**
* Find the token manager uses parser value.
*
* @return The requested token manager uses parser value;
*/
public static boolean getTokenManagerUsesParser(){
return booleanValue("TOKEN_MANAGER_USES_PARSER");
}
/**
* Find the sanity check value.
*
* @return The requested sanity check value.
*/
public static boolean getSanityCheck() {
return booleanValue("SANITY_CHECK");
}
/**
* Find the force lookahead check value.
*
* @return The requested force lookahead value.
*/
public static boolean getForceLaCheck() {
return booleanValue("FORCE_LA_CHECK");
}
/**
* Find the common token action value.
*
* @return The requested common token action value.
*/
public static boolean getCommonTokenAction() {
return booleanValue("COMMON_TOKEN_ACTION");
}
/**
* Find the cache tokens value.
*
* @return The requested cache tokens value.
*/
public static boolean getCacheTokens() {
return booleanValue("CACHE_TOKENS");
}
/**
* Find the keep line column value.
*
* @return The requested keep line column value.
*/
public static boolean getKeepLineColumn() {
return booleanValue("KEEP_LINE_COLUMN");
}
/**
* Find the output directory.
*
* @return The requested output directory.
*/
public static File getOutputDirectory() {
return new File(stringValue("OUTPUT_DIRECTORY"));
}
}