簡體   English   中英

EpochX框架中的BNF遞歸

[英]BNF recursion in EpochX framework

希望這里有一些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方法(請參見declareVariable的JavaDoc http://www.epochx.org/javadoc/1.4/ )來完成此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM