Итак, вот потенциальная часть ответа. Я не понимаю, почему не используют массив и регулярные выражения, но почему бы и нет
вот код, который вам нужно реализовать, но описание вашего языка довольно плохое, это не LL (1), поэтому у вас есть проблема для обработки разницы между концом и концом, если ... другая проблема заключается в том, что вы нет конечного разделителя для инструкции while, может быть, и end в то время как вам поможет?
Этот вид реализации очень тяжелый и Я явно не рекомендую такие вещи !! но это было забавно принять вызов ^^
public class MainIndent {
public static enum Tokens {
start("start", 1), end("end", -1), write("write", 0), end_if("end if", -1), read("read", 0), _if("if", 1),
_do("do", 1), _while("while", 1);
private final String keyword;
private final int policy;
Tokens(String keyword, int policy) {
this.keyword = keyword;
this.policy = policy;
}
public int getPolicy() {
return policy;
}
public String getKeyword() {
return keyword;
}
}
public static String parse(String input, String indent) {
String remaining = input;
String parsed = "";
int nbIndent = 0;
int doCount = 0;
while (!remaining.isEmpty()) {
Tokens tokens = getNextToken(remaining);
Tokens nextTokens = getNextToken(remaining.substring(tokens.getKeyword().length()));
int indexOf;
if (nextTokens == null) {
parsed += createIndent(indent, nbIndent+tokens.getPolicy()) + remaining + "\n";
remaining = "";
} else {
if (tokens == Tokens.end_if && (nextTokens == Tokens.end || nextTokens == Tokens.end_if)) {
indexOf = tokens.getKeyword().length()
+ remaining.substring(tokens.getKeyword().length()).indexOf(nextTokens.getKeyword());
} else {
indexOf = remaining.indexOf(nextTokens.getKeyword());
}
int lastIndent = nbIndent;
if (tokens == Tokens._do) {
doCount++;
nbIndent++;
} else if (tokens == Tokens._while && doCount > 0) {
doCount--;
nbIndent--;
lastIndent--;
} else {
if (tokens.getPolicy() < 0) {
lastIndent--;
}
nbIndent += tokens.getPolicy();
}
parsed += createIndent(indent, lastIndent) + remaining.substring(0, indexOf) + "\n";
remaining = remaining.substring(indexOf).trim();
}
System.out.println(parsed);
System.out.println(remaining);
}
return parsed;
}
private static String createIndent(String indent, int nbIndent) {
String output = "";
for (int i = 0; i < nbIndent; i++) {
output += indent;
}
return output;
}
public static void main(String[] args) {
System.out.println(corrIndent(
" start write \"enter your name\" read name\n write \"enter your age\" read age if age==100 then do write \"you stink\" while age!=100 end if while something if something do something while something end if end "));
}
public static String corrIndent(String pseudocode2) {
return corrIndent(pseudocode2, " ");
}
public static String corrIndent(String pseudocode2, String indent) {
String remainingStringtoParse = clearwhiteSpace(pseudocode2); // this will remove all current indentation
return parse(remainingStringtoParse, indent);
}
private static Tokens getNextToken(String input2) {
int startIndex = input2.indexOf(Tokens.start.getKeyword());
startIndex = startIndex == -1 ? input2.length() : startIndex;
int writeIndex = input2.indexOf(Tokens.write.getKeyword());
writeIndex = writeIndex == -1 ? input2.length() : writeIndex;
int readIndex = input2.indexOf(Tokens.read.getKeyword());
readIndex = readIndex == -1 ? input2.length() : readIndex;
int ifIndex = input2.indexOf(Tokens._if.getKeyword());
ifIndex = ifIndex == -1 ? input2.length() : ifIndex;
int doIndex = input2.indexOf(Tokens._do.getKeyword());
doIndex = doIndex == -1 ? input2.length() : doIndex;
int whileIndex = input2.indexOf(Tokens._while.getKeyword());
whileIndex = whileIndex == -1 ? input2.length() : whileIndex;
int endIndex = input2.indexOf(Tokens.end.getKeyword());
endIndex = endIndex == -1 ? input2.length() : endIndex;
int endifIndex = input2.indexOf(Tokens.end_if.getKeyword());
endifIndex = endifIndex == -1 ? input2.length() : endifIndex;
if (startIndex < endIndex && startIndex < endifIndex && startIndex < writeIndex && startIndex < readIndex
&& startIndex < ifIndex && startIndex < doIndex && startIndex < whileIndex) {
return Tokens.start;
} else if (writeIndex < readIndex && writeIndex < ifIndex && writeIndex < doIndex && writeIndex < whileIndex
&& writeIndex < endIndex && writeIndex < endifIndex) {
return Tokens.write;
} else if (readIndex < ifIndex && readIndex < doIndex && readIndex < whileIndex && readIndex < endIndex
&& readIndex < endifIndex) {
return Tokens.read;
} else if (ifIndex < doIndex && ifIndex < whileIndex && ifIndex < endIndex && ifIndex < endifIndex) {
return Tokens._if;
} else if (doIndex < whileIndex && doIndex < endIndex && doIndex < endifIndex) {
return Tokens._do;
} else if (whileIndex < endIndex && whileIndex < endifIndex) {
return Tokens._while;
} else if (endIndex < endifIndex) {
return Tokens.end;
} else if (endifIndex != input2.length()) {
return Tokens.end_if;
} else {
return null;
}
}
private static String clearwhiteSpace(String pseudocode) {
String remainingStringtoParse = pseudocode;
String parsedString = "";
while (remainingStringtoParse.length() > 0) {
remainingStringtoParse = removeHeadWhiteSpace(remainingStringtoParse);
int nextWhiteSpaceIndex = getNextWhiteSpaceIndex(remainingStringtoParse);
parsedString += remainingStringtoParse.substring(0,
nextWhiteSpaceIndex == -1 ? remainingStringtoParse.length() : nextWhiteSpaceIndex)
+ (nextWhiteSpaceIndex == -1 ? "" : " ");
remainingStringtoParse = nextWhiteSpaceIndex == -1 ? ""
: remainingStringtoParse.substring(nextWhiteSpaceIndex);
}
return parsedString;
}
private static int getNextWhiteSpaceIndex(String remainingStringtoParse) {
int whitespace = 0;
while (remainingStringtoParse.length() > whitespace
&& !isWhiteSpace(remainingStringtoParse.charAt(whitespace))) {
whitespace++;
}
return remainingStringtoParse.length() == whitespace ? -1 : whitespace;
}
private static String removeHeadWhiteSpace(String pseudocode) {
int whitespace = 0;
while (pseudocode.length() > whitespace && isWhiteSpace(pseudocode.charAt(whitespace))) {
whitespace++;
}
return pseudocode.length() == whitespace ? "" : pseudocode.substring(whitespace);
}
private static boolean isWhiteSpace(char charAt) {
return Character.isWhitespace(charAt);
}
}