public void gen_push_lit(SemanticRec lit, String lexeme)
    {
        String type = lit.getDatum(0);
        Type tt = Type.valueOf(type);
        comment("push lexeme: " + lexeme + " type: " + type);
        switch (tt)
        {
        case STRING:
            push("#\"" + lexeme.replaceAll("\\\\(?![nrtv])", "\\\\\\\\") + "\"");
            break;
        case BOOLEAN:
            if (lexeme.equalsIgnoreCase("true"))
            {
                push("#1");
            }
            else
            {
                push("#0");
            }
            break;
        case INTEGER:
            push("#" + lexeme);
            break;
        case FLOAT:
            if (lexeme.toLowerCase().contains("e") && !lexeme.contains(".")) //Workaround to convert from micropascal float to C scanf float
            {
                /*
                 * If the float has an "e" in it but does not have a "." add a ".0" before the "e"
                 * In the current micropascal definition if you have an "e" and a "." it must have a digit after the "." which would be legal in C also
                 */
                int split = lexeme.toLowerCase().indexOf("e");
                String start = lexeme.substring(0, split);
                String end = lexeme.substring(split);
                lexeme = start + ".0" + end;
            }
            push("#" + lexeme);
            break;
        default:
            Parser.semanticError(lexeme + " of type " + tt.toString() + " cannot be pushed onto the stack");

        }
    }