繁体   English   中英

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

[英]Java parser, dynamically declared n-dimensional array of arrays

我目前正在尝试用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”,String [] mooBranch。 我也希望Parse函数是一个递归函数,并返回String的一个分支。

现在,我唯一的问题是这需要动态声明数组的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];

因为这仅足以嵌套两次(或使用更多[]在有限的时间内),并且用户应该能够根据需要嵌套功能多次。

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

范例:

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

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

如果要保留在当前正在使用的相同路径上,并且如果要表示类似旧的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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM