package parser; import java.util.HashMap; import java.util.Map; import parser.Matcher; import grammar.Expression; import source.Source; /******************************************************************************* * Analyze the performance of a grammar. */ public class StatisticsReporter extends Matcher { /****************************************************************************/ public StatisticsReporter(final Source source) { super(source); } /****************************************************************************/ public static class ExprInfo { public int successes; public int failures; public int memoedSuccesses; public int memoedFailures; } /****************************************************************************/ public static class PosInfo { public int invocations; } /****************************************************************************/ final public Map<Expression, ExprInfo> exprInfos = new HashMap<>(); /****************************************************************************/ final public Map<Integer, PosInfo> posInfos = new HashMap<>(); /****************************************************************************/ @Override public boolean visitChild(Expression child) { ExprInfo exprInfo = exprInfos.get(child); if (exprInfo == null) { exprInfo = new ExprInfo(); exprInfos.put(child, exprInfo); } PosInfo posInfo = posInfos.get(stream.position); if (posInfo == null) { posInfo = new PosInfo(); posInfos.put(stream.position, posInfo); } posInfo.invocations += 1; boolean memoed = memo.get(stream.position, child) != null; boolean success = super.visitChild(child); if (success) { exprInfo.successes += 1; if (memoed) { exprInfo.memoedSuccesses += 1; } } else { exprInfo.failures += 1; if (memoed) { exprInfo.memoedFailures += 1; } } return success; } /****************************************************************************/ public void report() { for (Map.Entry<Expression, ExprInfo> e : exprInfos.entrySet()) { ExprInfo info = e.getValue(); System.out.println(e.getKey() + " : " + (info.successes - info.memoedSuccesses) + " : " + (info.failures - info.memoedFailures) + " : " + info.memoedSuccesses + " : " + info.memoedFailures); } for (Map.Entry<Integer, PosInfo> e : posInfos.entrySet()) { PosInfo info = e.getValue(); System.out.println(e.getKey() + " : " + source().where(e.getKey()) + " : " + info.invocations ); } } }