/******************************************************************************* * Copyright (c) 2007, 2008 Edgar Espina. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.deved.antlride.debug.ui; import java.util.Arrays; import java.util.Collection; import org.deved.antlride.core.model.IGrammar; import org.deved.antlride.core.model.evaluation.EvalElementFactory; import org.deved.antlride.core.model.evaluation.IEvalElement; import org.deved.antlride.core.util.AntlrTextHelper; import org.deved.antlride.debug.model.event.AntlrDebugEvent; import org.deved.antlride.debug.model.event.AntlrDebugEventKind; import org.deved.antlride.debug.model.event.AntlrDebugExceptionEvent; import org.deved.antlride.debug.model.event.AntlrDebugRuleEvent; import org.deved.antlride.debug.model.event.AntlrDebugTokenEvent; public class AntlrDebugParser { public static IEvalElement evaluate(IGrammar owner, AntlrDebugEvent[] elements) { return createGraphModel(owner, Arrays.asList(elements)); } public static IEvalElement createGraphModel(IGrammar owner, Collection<AntlrDebugEvent> elements) { IEvalElement root = null; IEvalElement current = null; int decision = 0; for (AntlrDebugEvent event : elements) { AntlrDebugEventKind kind = event.getEventKind(); // System.out.println(event); switch (kind) { case ENTER_DECISION: decision++; break; case EXIT_DECISION: decision--; break; case CONSUME_TOKEN: { if (decision != 0) { break; } AntlrDebugTokenEvent tokenEvent = (AntlrDebugTokenEvent) event; String tokenDisplayName = tokenEvent.getTokenName(); // boolean isLexerRule = tokenDisplayName.length() >0&& tokenDisplayName.charAt(0) != '\''; // if (isLexerRule) { // IEvalElement evalElement = EvalElementFactory // .createRuleEvalElement(g, current, tokenDisplayName); // root = checkRoot(root, evalElement); // // set current node // current = evalElement; // } IEvalElement evalElement = EvalElementFactory .createTokenEvalElement(owner, current, AntlrTextHelper .unEscapeNewlines(tokenEvent.getText()), tokenEvent.getLine(), tokenEvent.getColumn()); root = checkRoot(root, evalElement); // if (isLexerRule) { // current = current.getParent(); // } } break; case ENTER_RULE: { AntlrDebugRuleEvent ruleEvent = (AntlrDebugRuleEvent) event; IEvalElement evalElement = EvalElementFactory .createRuleEvalElement(owner, current, ruleEvent.getRule()); root = checkRoot(root, evalElement); // set current node current = evalElement; } break; case EXIT_RULE: { if (current != null) { current = current.getParent(); } } break; case EXCEPTION: { if (decision != 0) { break; } AntlrDebugExceptionEvent exEvent = (AntlrDebugExceptionEvent) event; IEvalElement evalElement = EvalElementFactory .createExceptionEvalElement(owner, current, exEvent .getException(), exEvent.getMessage(), exEvent .getLine(), exEvent.getColumn()); root = checkRoot(root, evalElement); } break; } } return root; } private static IEvalElement checkRoot(IEvalElement root, IEvalElement element) { return root == null ? element : root; } }