/* * xtc - The eXTensible Compiler * Copyright (C) 2007 IBM Corp. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ package xtc.lang.blink; import java.io.CharArrayWriter; import java.io.StringReader; import java.io.StringWriter; import xtc.lang.JavaEntities; import xtc.parser.Result; import xtc.parser.SemanticValue; import xtc.tree.GNode; import xtc.tree.Node; import xtc.tree.Printer; import xtc.util.Runtime; import xtc.lang.jeannie.AstSimplifier; /** * Static helper routines related to Blink. * This is a good place to put code that is useful for more than one visitor. * * @author Martin Hirzel * @version $Revision: 1.2 $ */ public final class Utilities { public static String debuggerAstToString(final GNode ast) { final CharArrayWriter writer = new CharArrayWriter(); final CommandAstPrinter printer = new CommandAstPrinter(new Printer(writer)); printer.dispatch(ast); return writer.toString(); } /** * Parse the input as a debugger command, and analyze the resulting AST. If * either the parse or the analysis fails, return a message String. If neither * fails, return an AST Node. If the input contains an embedded expression, * the language argument determines whether it is "C" or "Java". The analyzer * annotates each node in the AST with the language for that node. It also * looks up variables and annotates them with their remapping based on the * current file and line number, where available. */ public static Object debuggerParseAndAnalyze(final String language, final String input) { final Object result; { Node ast = null; String msg = null; try { ast = debuggerStringToAst(language, input); final StringWriter stringWriter = new StringWriter(); final CommandAstAnalyzer ana = new CommandAstAnalyzer(newRuntime()); ana._runtime.setErrConsole(new Printer(stringWriter)); ana.dispatch(ast); msg = stringWriter.toString(); } catch (final Exception e) { msg = e.getMessage(); } result = (null == msg || "".equals(msg)) ? ast : msg; } assert null != result; if (result instanceof Node) CommandAstAnalyzer.assertAllNodesHaveLanguage((Node)result); return result; } public static GNode debuggerStringToAst(final String language, final String input) throws Exception { final CommandParser parser = new CommandParser(new StringReader(input), "<input>", input.length()); final Result parseResult = "C".equals(language) ? parser.pCCommand(0) : parser.pJavaCommand(0); if (parseResult.hasValue()) { final SemanticValue val = (SemanticValue) parseResult; if (val.index != input.length()) parser.signal(parseResult.parseError()); final GNode ast = (GNode) val.value; return (GNode) new AstSimplifier(language).dispatch(ast); } parser.signal(parseResult.parseError()); return null; } public static Runtime newRuntime() { final Runtime runtime = new Runtime(); runtime.dir("in", Runtime.INPUT_DIRECTORY, true, "").setValue(Runtime.INPUT_DIRECTORY, JavaEntities.TEMP_DIR); runtime.bool("markAST", "optionMarkAST", true, "Mark AST nodes with types.").setValue("optionMarkAST", true); runtime.bool("strict", "optionStrict", true, "Enforce strict C99 compliance.").setValue("optionStrict", true); runtime.bool("pedantic", "optionPedantic", false, "Enforce strict C99 compliance.").setValue("optionPedantic", true); runtime.word("jniCall", "jniCall", false, "Calling conventions qualifier to C JNI functions.").setValue("jniCall", ""); runtime.initDefaultValues(); return runtime; } private Utilities() { assert false; } }