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

时间:2015-12-22 07:59:56

标签: java arrays parsing pointers

我目前正在尝试用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];

因为只有两次嵌套(或者有更多[]的有限时间),用户应该可以根据需要多次嵌套功能。

2 个答案:

答案 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。