我正在尝试构建一个简单的解释器。基本上我使用此方法从HashMap
中的字符串中获取ArrayList
的密钥。 HashMap
中的字符串可以以8种不同的可能性(8个关键字)开头。目前我正在使用string.indexOf("something")
来查找关键字字符串,但是当我拥有多个关键字时,这当然不灵活。
ArrayList
中的所有字符串都可以分解为命令+(INSTRUCTIONS)。 COMMANDS映射到HashMap
及其类。所以基本上它是一个两步的情况:第一次通过我需要从字符串中获取第一个单词/标记,然后字符串的其余部分最好在适当的类中进一步分割/标记化。
无论如何,string.indexOf()
可以以某种方式被操纵以返回多个子字符串的索引吗?或者我是否必须寻找其他方法?请指教。
代码如下所示:
public void parseCommands() {
List<String> myString = new ArrayList<String>();
myString.add(new String("# A TPL HELLO WORLD PROGRAM"));
myString.add(new String("# xxx"));
myString.add(new String("STRING myString"));
//myString.add(new String("LET myString= \"HELLO WORLD\""));
//myString.add(new String("PRINTLN myString"));
myString.add(new String("PRINTLN HELLO WORLD"));
myString.add(new String("END"));
System.out.println();
for (String listString : myString)//iterate across arraylist
{
if (listString.startsWith("#", 0))//ignore comments starting with #
{
continue;
}
int firstToken = listString.indexOf("END");
String command = listString;
Directive directive = commandHash.get(command);
if (directive != null) {
directive.execute(listString);
} else {
System.out.println("No mapped command given");
}
}
}
答案 0 :(得分:2)
看起来AL中的每个字符串可以只是命令或命令以及命令的输入。
我认为你可以在这里使用split
方法:
String[] parts = listString.split(" ");
如果parts
的大小是一个,这意味着它只是一个命令,否则parts[0]
是一个命令,其余的是该命令的输入。
用它进行查找:
Directive directive = commandHash.get(parts[0]);
然后,如果返回Directive
,那么
parts
的长度为1,则执行directive.execute()
。parts
的其余部分一起形成输入并执行directive.execute(input)
。如果情况并非如此,也许我没有得到你想说的话。
另外,请参阅String
,它有各种方法可以在这里使用。
<强>更新强>
public interface Directive {
void execute(String input);
}
public class EndDirective implements Directive {
@Override
public void execute(String input) {
// input will be neglected here
// just do whatever you supposed to do
}
}
public class PrintlnDirective implements Directive {
@Override
public void execute(String input) {
// input will be used here
// you might want to check if the input is null here
// and write the code accordingly
System.out.println(input);
}
}
有了这个,当你没有任何输入时你可以directive.execute(null);
,因为你们各自的Directive
要么忽略输入要么使用它(如果它们是空的话,它们也可以处理null期待一些输入。)
答案 1 :(得分:0)
简短的回答是否定的。您可能希望使用String.split(),StreamTokenizer或StringTokenizer。