//-------------------------------------------------------------- // Translation script // // // Searches SQL markup and replaces them by a C++ equivalent // implementation. // // A translation script is an extended-BNF script that allows // generating code in the same time. //-------------------------------------------------------------- // We want to put all scanned characters in the output #implicitCopy // The head of the grammar is the first production rule // encountered inlineCodeExpander ::= // ignore C++ comments and whitespaces between terminals // and non-terminals. #ignore(C++) [ // Jump over strings #readCString | // Handle a SQL markup '<' // The script keeps the position just before '<' => local iStartPosition = $getOutputLocation() - 1$; // from now, scanned tokens aren't put in the output #explicitCopy #readIdentifier:"SQL" // The output file position stands just before '<' // to erase the markup => setOutputLocation(iStartPosition); // Call of a non-terminal that takes in charge of // replacing the markup with C++ code expandSQLMarkup | // If not a string and not a markup, reading of any // character #readChar ]*; // Replaces a SQL markup with the C++ corresponding code expandSQLMarkup ::= => { @DBHandle* db_handle = db_connect(); DBQueryData* db_data = db_query(db_handle, "@ } // Copy of the query in the output #implicitCopy [^'>']* // ignore the end of the markup #explicitCopy '>' => { @"); for (int record = 0; record < db_data->length; record++) { // fetch and process data }@ } ;