Files
VisualSapfor/src/Common/Utils/Validators/DVMHelpParser.java

235 lines
11 KiB
Java

package Common.Utils.Validators;
import Common.Utils.Utils;
import GlobalData.Compiler.Compiler;
import GlobalData.CompilerEnvironment.CompilerEnvironment;
import GlobalData.CompilerOption.CompilerOption;
import java.util.Arrays;
public class DVMHelpParser {
public static HelpParserState state;
public static String t_line;
public static String line;
//-
public static OptionState optionState;
public static CompilerOption option;
//-
public static int spacesCounter;
public static CompilerEnvironment environment;
public static EnvironmentState environmentState;
//-
public static String descriptionLine = "";
//-
public static Compiler compiler = null;
public static String[] banned_options = new String[]{
"-o",
"-c",
"-f90",
"-FI"
};
public static void ResetOption() {
optionState = OptionState.SearchName;
option = null;
descriptionLine = "";
}
public static void TryConfirmOptionDescriptionLine() {
if (option != null && !descriptionLine.isEmpty()) {
option.description.add(descriptionLine.trim());
descriptionLine = "";
}
}
public static void TryConfirmOption() {
if ((option != null) && (!compiler.options.containsKey(option.name))) {
if (!descriptionLine.isEmpty())
option.description.add(descriptionLine.trim());
option.CheckParameterVariants();
if (!Arrays.asList(banned_options).contains(option.name)) {
compiler.options.put(option.name, option);
}
ResetOption();
}
}
public static void ResetEnvironment() {
environmentState = EnvironmentState.SearchName;
spacesCounter = 0;
environment = null;
descriptionLine = "";
}
public static void TryConfirmEnvironmentDescriptionLine() {
if (environment != null && !descriptionLine.isEmpty()) {
environment.description.add(descriptionLine.trim());
descriptionLine = "";
}
}
public static void TryConfirmEnvironment() {
if ((environment != null) && (!compiler.environments.containsKey(environment.name))) {
if (!descriptionLine.isEmpty())
environment.description.add(descriptionLine.trim());
environment.CheckDefaults();
compiler.environments.put(environment.name, environment);
ResetEnvironment();
}
}
public static void ReadOptions(Compiler compiler_in) {
compiler = compiler_in;
String[] lines = compiler.helpText.split("\n");
state = HelpParserState.Search;
for (String line_ : lines) {
line = line_; //нужна для окружения. там пробелы нужно считать сразу.
t_line = Utils.remove(line_.trim(), "\r");
switch (state) {
case Search:
switch (t_line) {
case "Output and debugging options:":
case "Convertation options:":
case "Optimization options:":
state = HelpParserState.OptionsChapter;
ResetOption();
break;
case "Environment variables":
state = HelpParserState.EnvironmentsChapterHeader;
break;
}
break;
case EnvironmentsChapterHeader:
state = HelpParserState.EnvironmentsChapter;
ResetEnvironment();
break;
case OptionsChapter:
if (t_line.isEmpty()) {
TryConfirmOption();
state = HelpParserState.Search;
} else {
char[] symbols = t_line.toCharArray();
//- Новая строка.
optionState = OptionState.SearchName;
//-
for (char c : symbols) {
switch (optionState) {
case SearchName:
switch (c) {
case '-':
TryConfirmOption();
//-
option = new CompilerOption();
option.name += c;
optionState = OptionState.Name;
break;
default:
descriptionLine += c;
optionState = OptionState.Description;
break;
}
break;
case Name:
switch (c) {
case '<':
optionState = OptionState.Parameter;
break;
case ' ':
case '=':
case '\t':
option.parameterSeparator += c;
optionState = OptionState.SearchParameter;
break;
default:
option.name += c;
break;
}
break;
case SearchParameter:
if (c == '<') {
optionState = OptionState.Parameter;
} else {
option.parameterSeparator = "";
optionState = OptionState.Description;
descriptionLine += c;
}
break;
case Parameter:
if (c == '>') {
optionState = OptionState.SearchDescription;
} else {
option.parameterName += c;
}
break;
case SearchDescription:
if (c != ' ') {
descriptionLine += c;
optionState = OptionState.Description;
}
break;
case Description:
descriptionLine += c;
break;
}
}
//-
TryConfirmOptionDescriptionLine();
}
break;
case EnvironmentsChapter:
if (t_line.isEmpty()) {
TryConfirmEnvironment();
state = HelpParserState.Search;
} else {
char[] symbols = line.toCharArray();
//- Новая строка.
environmentState = EnvironmentState.SearchName;
spacesCounter = 0;
//-
for (char c : symbols) {
switch (environmentState) {
case SearchName:
if (c == ' ') {
if (spacesCounter++ > 4) {
//имя нам уже не встретится. это строка описания.
environmentState = EnvironmentState.Description;
}
} else if (Character.isLetter(c)) {
if (spacesCounter == 4) {
TryConfirmEnvironment();
environment = new CompilerEnvironment();
environment.name += c;
environmentState = EnvironmentState.Name;
}
} else {
descriptionLine += c;
environmentState = EnvironmentState.Description;
}
break;
case Name:
//в имени окружения пробелов быть не может. ждем описания.
if (c == ' ') {
environmentState = EnvironmentState.SearchDescription;
} else if (Character.isLetterOrDigit(c) || c == '_') {
//буквы цифры и подчеркивания - имя продолжается.
environment.name += c;
} else {
descriptionLine += c;
environmentState = EnvironmentState.Description;
}
break;
case SearchDescription:
if (c == ' ') {
//игнорируем.
} else {
descriptionLine += c;
environmentState = EnvironmentState.Description;
}
break;
case Description:
descriptionLine += c;
break;
}
TryConfirmOptionDescriptionLine();
}
//-
TryConfirmEnvironmentDescriptionLine();
}
break;
}
}
}
//------------------------------------------------------------------------------------>>
}