希望这里有一些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中,以便它知道如何将其解析为节点。您可以使用declareFunction
,declareLiteral
和declareVariable
方法执行此操作(请参见JavaDoc中的EpoxParser http://www.epochx.org/javadoc/1.4/)。