我目前正在尝试用Java编写一个解析器用于我的程序。我希望程序能够在运行时按名称调用任何函数,如用户指定的那样。所以示例语法看起来像:
foo{boo{sth1,moo{sth2,sth3,sth4}},sth5},zoo{voo{sth6}}
其中foo,boo,moo等是函数,而sths是变量。 {和}之间的所有内容都是要调用的函数的参数列表。因此,在本例中,使用3个变量作为参数调用moo,然后将其返回值作为参数传递给boo函数(以及其他2个变量)。用户应该能够无限次地嵌套此功能。
我已经编写了通过名称调用其他函数的函数,现在我只需要解析器来正确划分输入字符串。我想通过将输入字符串分成" branches"来实现这一点。较小的字符串。每个功能都拥有它自己的"分支"字符串表示它的参数名称。然后每个分支将附加到更高的分支,依此类推。因此,例如,moo函数的分支将包括三个字符串" sth2"," sth3"," sth4"并附加到boo函数的高分支,它将包含" sth1",String [] mooBranch。此外,我希望Parse函数是一个递归函数,并返回一个字符串分支。
现在,我遇到的唯一问题是这需要动态声明n维数组数组。在C ++中你可以使用指针,但Java没有指针类型。我确实知道每个非原始类型的工作方式类似于Java中对象的指针,但是这样的东西似乎不起作用:
String[] branch = new String[x];
branch[0] = new String[y]; //Type mismatch: cannot convert from String[] to String
另请注意,由于我的功能的递归性质,我不能简单地做类似的事情
String[][] branch = new String[x][];
branch[0] = new String[y];
因为只有两次嵌套(或者有更多[]的有限时间),用户应该可以根据需要多次嵌套功能。
答案 0 :(得分:1)
您必须使用我理解的树结构,而不是简单的String
数组。
示例:
class Node {
// Case of a parameter
String parameterName;
// Case of a function call
String functionName;
Node[] functionParameters;
}
您必须增强此快速模型以适应当然的需求。
答案 1 :(得分:0)
如果你想保持你当前正在使用的相同路径,如果你的意思是旧的VB Redim Preserve()方法,它允许你动态添加到一个数组然后你可以试试这个工作的黑客:
public static String[] RedimPreserve(String[] yourArray, int newSize) {
String[] tmp = new String[newSize];
if (yourArray.length != 0) {
System.arraycopy(yourArray, 0, tmp, 0, Math.min(yourArray.length, tmp.length));
}
return tmp;
}
以及如何使用它的示例可能是:
String[] myArray = {}; // Declared empty string array.
// Fill myArray[] with ASCII characters from ASCII 65 to ASCII 126...
int counter = 0;
for (int i = 65; i <= 126; i++) {
myArray = RedimPreserve(myArray, counter + 1);
myArray[counter] = Character.toString ((char) i);
counter++;
}
// Output the new size of myArray[]...
System.out.println(myArray.length);
//Display myArray[] and see its elemental contents...
for (int i = 0; i < myArray.length; i++) {
System.out.println(myArray[i]);
}
这就是为什么 ArrayLists 非常好。你不需要经历这种事情。您可以动态添加到ArrayList。