Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java解析器,动态声明的n维数组_Java_Arrays_Parsing_Pointers - Fatal编程技术网

Java解析器,动态声明的n维数组

Java解析器,动态声明的n维数组,java,arrays,parsing,pointers,Java,Arrays,Parsing,Pointers,我目前正试图用Java为我的程序编写一个解析器。我希望程序能够在运行时按用户指定的名称调用任何函数。因此,示例语法如下所示: foo{boo{sth1,moo{sth2,sth3,sth4}},sth5},zoo{voo{sth6}} 其中foo、boo、moo等为函数,sth为变量。{和}之间的所有内容都是要调用的函数的参数列表。因此,在本例中,使用3个变量作为参数调用moo,然后将其返回值作为参数传递给boo函数(以及其他2个变量)。用户应该能够无限次嵌套此功能 我已经编写了按名称调用其他

我目前正试图用Java为我的程序编写一个解析器。我希望程序能够在运行时按用户指定的名称调用任何函数。因此,示例语法如下所示:

foo{boo{sth1,moo{sth2,sth3,sth4}},sth5},zoo{voo{sth6}}
其中foo、boo、moo等为函数,sth为变量。{和}之间的所有内容都是要调用的函数的参数列表。因此,在本例中,使用3个变量作为参数调用moo,然后将其返回值作为参数传递给boo函数(以及其他2个变量)。用户应该能够无限次嵌套此功能

我已经编写了按名称调用其他函数的函数,现在我只需要解析器正确划分输入字符串。我想通过将输入字符串划分为较小字符串的“分支”来实现这一点。每个函数都有自己的字符串“分支”,这些字符串表示它的参数名。然后每个分支都会连接到更高的分支,以此类推。例如,moo函数的分支将由三个字符串“sth2”、“sth3”、“sth4”组成,并连接到boo函数的较高分支,该分支将包含“sth1”、字符串[]moobrange。我还希望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];

因为它只足以嵌套两次(或有限时间内嵌套[]),并且用户应该能够根据自己的需要嵌套任意次数的功能。

根据我的理解,您必须使用树结构,而不是简单的
字符串
数组

例如:

class Node {
    // Case of a parameter
    String parameterName;
    // Case of a function call
    String functionName;
    Node[] functionParameters;
}

当然,您必须增强此快速模型以调整您的需求。

如果您希望保持当前工作的路径不变,并且,如果您指的是旧的VBRedim 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]);
}
String[]myArray={};//声明的空字符串数组。
//用ASCII 65到ASCII 126之间的ASCII字符填充myArray[]。。。
int计数器=0;
对于(int i=65;i