希望这里有一些EpochX框架方面的专家...我不确定用户组是否仍处于活动状态。

我正在尝试在其BNF语法表示中实现简单的递归,并乐于解决以下问题:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -9
    at java.lang.String.substring(String.java:1911)
    at org.epochx.epox.EpoxParser.parse(EpoxParser.java:235)
    at org.epochx.epox.EpoxParser.parse(EpoxParser.java:254)
    at org.epochx.tools.eval.EpoxInterpreter.eval(EpoxInterpreter.java:89)
    at org.epochx.ge.model.epox.SAGE.getFitness(SAGE.java:266)
    at org.epochx.ge.representation.GECandidateProgram.getFitness(GECandidateProgram.java:304)
    at org.epochx.stats.StatField$7.getStatValue(StatField.java:97)
    at org.epochx.stats.Stats.getStat(Stats.java:134)
    at org.epochx.stats.StatField$8.getStatValue(StatField.java:117)
    at org.epochx.stats.Stats.getStat(Stats.java:134)
    at org.epochx.stats.Stats.getStats(Stats.java:162)
    at org.epochx.stats.Stats.print(Stats.java:194)
    at org.epochx.stats.Stats.print(Stats.java:178)
    at org.epochx.ge.model.epox.Tester$1.onGenerationEnd(Tester.java:41)
    at org.epochx.life.Life.fireGenerationEndEvent(Life.java:634)
    at org.epochx.core.InitialisationManager.initialise(InitialisationManager.java:207)
    at org.epochx.core.RunManager.run(RunManager.java:166)
    at org.epochx.core.Model.run(Model.java:147)
    at org.epochx.ge.model.GEModel.run(GEModel.java:82)
    at org.epochx.ge.model.epox.Tester.main(Tester.java:55)
Java Result: 1


我的简单语法的结构如下,其中将终端分别传递给评估函数:

  public static final String GRAMMAR_FRAGMENT = "<program> ::= <node>\n"
          + "<node> ::= <s_list>\n"
          + "<s_list> ::= <s> | <s> <s_list>\n"
          + "<s> ::= FUNCTION( <terminal> )\n"
          + "<terminal> ::= ";




编辑:终端创建-

// Generate the input sequences.
inputValues = BoolUtils.generateBoolSequences(4);

argNames = new String[4];
argNames[0] = "void";
argNames[1] = "bubbleSort";
argNames[2] = "int*";
argNames[3] = "numbers";


...

// Evaluate all possible inputValues.

    for (final boolean[] vars: inputValues) {
        // Convert to object array.
        final Boolean[] objVars = ArrayUtils.toObject(vars);

        Boolean result = null;
        try {
                      interpreter.eval(program.getSourceCode(),
                    argNames, objVars);
                      score = (double)program.getParseTreeDepth();
        } catch (final MalformedProgramException e) {
            // Assign worst possible fitness and stop evaluating.
            score = 0;
            break;
        }
    }

最佳答案

stacktrace显示问题实际上出在EpoxParser中,这意味着它不是语法错误的语法,而是无法解析生成的程序。

因为您使用的是EpoxInterpreter,所以生成的程序将被解析为Epox程序。 Epox是用于指代EpochX的树表示使用的语言的名称(一种损坏的Lisp形式,您可以在其中添加自己的文字/函数)。解析需要使用S-Expression格式,并尝试标识每个函数和终端,并构建由等效的Node对象组成的树(请参阅org.epochx.epox。*包)。然后可以评估该树以运行该程序。

但是在Epox中没有内置函数FUNCTION,也没有任何已知的文字“ void”,“ bubbleSort”,“ int *”或“ numbers”。因此,解析失败。因此,您需要将这些构造添加到EpoxParser中,以便它知道如何将其解析为节点。您可以使用declareFunctiondeclareLiteraldeclareVariable方法执行此操作(请参见JavaDoc中的EpoxParser http://www.epochx.org/javadoc/1.4/)。

08-16 18:53