/* * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * $Id$ * * */ #include "mem/slicc/main.hh" #include "mem/slicc/symbols/StateMachine.hh" #include "mem/slicc/generator/mif_gen.hh" #include "mem/slicc/generator/html_gen.hh" #include "mem/slicc/generator/fileio.hh" #include "mem/slicc/ast/DeclListAST.hh" #include "mem/slicc/symbols/Type.hh" #include "mem/slicc/symbols/SymbolTable.hh" #include "mem/slicc/symbols/Event.hh" #include "mem/slicc/symbols/State.hh" #include "mem/slicc/symbols/Action.hh" #include "mem/slicc/symbols/Transition.hh" // -- Main conversion functions void printDotty(const StateMachine& sm, ostream& out); void printTexTable(const StateMachine& sm, ostream& out); DeclListAST* g_decl_list_ptr; DeclListAST* parse(string filename); int main(int argc, char *argv[]) { cerr << "SLICC v0.3" << endl; if (argc < 5) { cerr << " Usage: generator.exec files ... " << endl; exit(1); } // The path we should place the generated code string code_path(argv[1]); code_path += "/"; // The path we should place the generated html string html_path(argv[2]); html_path += "/"; string ident(argv[3]); string html_generate(argv[4]); Vector decl_list_vec; // Parse cerr << "Parsing..." << endl; for(int i=5; ifindMachines(); } // Generate Code cerr << "Generator pass 2..." << endl; for(int i=0; igenerate(); delete decl_list_ptr; } // Generate C/C++ files cerr << "Writing C files..." << endl; { // Generate the name of the protocol ostringstream sstr; sstr << "// Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__< "; out << t.getNextStateShorthand() << "[label=\""; out << t.getEventShorthand() << "/" << t.getActionShorthands() << "\"]" << endl; } } out << "}" << endl; } void printTexTable(const StateMachine& sm, ostream& out) { const Transition* trans_ptr; int stateIndex, eventIndex; string actions; string nextState; out << "%& latex" << endl; out << "\\documentclass[12pt]{article}" << endl; out << "\\usepackage{graphics}" << endl; out << "\\begin{document}" << endl; // out << "{\\large" << endl; out << "\\begin{tabular}{|l||"; for(eventIndex=0; eventIndex < sm.numEvents(); eventIndex++) { out << "l"; } out << "|} \\hline" << endl; for(eventIndex=0; eventIndex < sm.numEvents(); eventIndex++) { out << " & \\rotatebox{90}{"; out << sm.getEvent(eventIndex).getShorthand(); out << "}"; } out << "\\\\ \\hline \\hline" << endl; for(stateIndex=0; stateIndex < sm.numStates(); stateIndex++) { out << sm.getState(stateIndex).getShorthand(); for(eventIndex=0; eventIndex < sm.numEvents(); eventIndex++) { out << " & "; trans_ptr = sm.getTransPtr(stateIndex, eventIndex); if (trans_ptr == NULL) { } else { actions = trans_ptr->getActionShorthands(); // FIXME: should compare index, not the string if (trans_ptr->getNextStateShorthand() != sm.getState(stateIndex).getShorthand() ) { nextState = trans_ptr->getNextStateShorthand(); } else { nextState = ""; } out << actions; if ((nextState.length() != 0) && (actions.length() != 0)) { out << "/"; } out << nextState; } } out << "\\\\" << endl; } out << "\\hline" << endl; out << "\\end{tabular}" << endl; // out << "}" << endl; out << "\\end{document}" << endl; }