#include "defs.h"

/*  The definition of yysccsid in the banner should be replaced with    */
/*  a #pragma ident directive if the target C compiler supports         */
/*  #pragma ident directives.                                           */
/*                                                                      */
/*  If the skeleton is changed, the banner should be changed so that    */
/*  the altered version can be easily distinguished from the original.  */
/*                                                                      */
/*  The #defines included with the banner are there because they are    */
/*  useful in subsequent code.  The macros #defined in the header or    */
/*  the body either are not useful outside of semantic actions or       */
/*  are conditional.                                                    */

char *banner[] =
{
    "#ifndef lint",
    "static char yysccsid[] = \"@(#)yaccpar     1.9 (Berkeley) 02/21/93\";",
    "#endif",
    "#define YYBYACC 1",
    "#define YYMAJOR 1",
    "#define YYMINOR 9",
    "#define yyclearin (yychar=(-1))",
    "#define yyerrok (yyerrflag=0)",
    "#define YYRECOVERING (yyerrflag!=0)",
    0
};

#if defined(TRIPLISH)
char *includefiles[] =
{
    "#include <pch.cxx>",
    "#pragma hdrstop",
    0
};
#endif // TRIPLISH

char *tables[] =
{
    "extern short yylhs[];",
    "extern short yylen[];",
    "extern short yydefred[];",
    "extern short yydgoto[];",
    "extern short yysindex[];",
    "extern short yyrindex[];",
    "extern short yygindex[];",
    "extern short yytable[];",
    "extern short yycheck[];",
    "#if YYDEBUG",
    "extern char *yyname[];",
    "extern char *yyrule[];",
    "#endif",
    0
};

#if defined(KYLEP_CHANGE)
char *header1[] =
{
    "#ifdef YYSTACKSIZE",
    "#undef YYMAXDEPTH",
    "#define YYMAXDEPTH YYSTACKSIZE",
    "#else",
    "#ifdef YYMAXDEPTH",
    "#define YYSTACKSIZE YYMAXDEPTH",
    "#else",
    "#define YYSTACKSIZE 500",
    "#define YYMAXDEPTH 500",
    "#endif",
    "#endif",
    "#define INITSTACKSIZE 30",
    0
};

char *header2[] =
{
    "{",
    "    friend class YYLEXER;",
    "public:",
    "",
    0
};

char *header3[] = 
{
    "",
    "    ~YYPARSER() {}",
    "",
    "    void ResetParser();             // Use to possibly restart parser",
    "    int  Parse();",
    "",
    "#ifdef YYAPI_VALUETYPE",
    "    YYAPI_VALUETYPE GetParseTree()      // Get result of parse",
    "                    {",
    "                        return yyval;",
    "                    }",
    "#endif",
    "",
    "    void EmptyValueStack( YYAPI_VALUETYPE yylval );",
    "    void PopVs();",
    "",
    "private:",
    "",
    "    int yydebug;",
    "    int yynerrs;",
    "    int yyerrflag;",
    "    int yychar;",
    "    short *yyssp;",
    "    YYSTYPE *yyvsp;",
    "    YYSTYPE yyval;",
    "    YYSTYPE yylval;",
    "    XGrowable<short, INITSTACKSIZE> xyyss;",
    "    CDynArrayInPlace<YYSTYPE> xyyvs;",
    "};",
    "#define yystacksize YYSTACKSIZE",
    0
};

#if defined(TRIPLISH)
char *header4[] = 
{
    "",
    "    ~YYPARSER() {}",
    "",
    "    int  Parse();",
    "",
    "#ifdef YYAPI_VALUETYPE",
    "    CDbRestriction* GetParseTree()          // Get result of parse",
    "    {",
    "        CDbRestriction* pRst = ((YYAPI_VALUETYPE)yyval).pRest;",
    "        _setRst.Remove( pRst );",
    "        Win4Assert( 0 == _setRst.Count() );",
    "        Win4Assert( 0 == _setStgVar.Count() );",
    "        Win4Assert( 0 == _setValueParser.Count() );",
    "        return pRst;",
    "    };",
    "#endif",
    "",
    "    void SetDebug() { yydebug = 1; }",
    "    void EmptyValueStack(YYAPI_VALUETYPE yylval) {}",
    "    void PopVs() { yyvsp--; }",
    "",
    "private:",
    "",
    "    int yydebug;",
    "    int yynerrs;",
    "    int yyerrflag;",
    "    int yychar;",
    "    short *yyssp;",
    "    YYSTYPE *yyvsp;",
    "    YYSTYPE yyval;",
    "    YYSTYPE yylval;",
    "    XGrowable<short, INITSTACKSIZE> xyyss;",
    "    CDynArrayInPlace<YYSTYPE> xyyvs;",
    "};",
    "#define yystacksize YYSTACKSIZE",
    0
};
#endif // TRIPLISH

#else // KYLEP_CHANGE
char *header[] =
{
    "#ifdef YYSTACKSIZE",
    "#undef YYMAXDEPTH",
    "#define YYMAXDEPTH YYSTACKSIZE",
    "#else",
    "#ifdef YYMAXDEPTH",
    "#define YYSTACKSIZE YYMAXDEPTH",
    "#else",
    "#define YYSTACKSIZE 500",
    "#define YYMAXDEPTH 500",
    "#endif",
    "#endif",
    "int yydebug;",
    "int yynerrs;",
    "int yyerrflag;",
    "int yychar;",
    "short *yyssp;",
    "YYSTYPE *yyvsp;",
    "YYSTYPE yyval;",
    "YYSTYPE yylval;",
    "short yyss[YYSTACKSIZE];",
    "YYSTYPE yyvs[YYSTACKSIZE];",
    "#define yystacksize YYSTACKSIZE",
    0
};
#endif // KYLEP_CHANGE

char *body[] =
{
#if defined(KYLEP_CHANGE)
    "#define YYABORT(sc) { EmptyValueStack( yylval ); return ResultFromScode(sc); }",
    "#define YYFATAL QPARSE_E_INVALID_QUERY",
    "#define YYSUCCESS S_OK",
#else
    "#define YYABORT goto yyabort",
#endif // KYLEP_CHANGE
    "#define YYREJECT goto yyabort",
    "#define YYACCEPT goto yyaccept",
#if !defined(KYLEP_CHANGE) // YYERROR is not being used
    "#define YYERROR goto yyerrlab",
#endif
#if defined(KYLEP_CHANGE)
    "int mystrlen(char * str)",
    "{",
    "    Win4Assert( 0 != str );",
    "    int i = 0;",
    "    while ( 0 != str[i] )",
    "        i++;",
    "    return i;        ",
    "}",
    "void YYPARSER::ResetParser()",
    "{",
    "     yynerrs = 0;",
    "    yyerrflag = 0;",
    "    yychar = (-1);",
    "",
    "yyssp = xyyss.Get();",
    "yyvsp = xyyvs.Get();",
    "    *yyssp = 0;",
    "}",
    "",
    "void YYPARSER::PopVs()",
    "{",
    "    if ( NULL != *yyvsp ) ",
    "        DeleteDBQT(*yyvsp);",
    "    yyvsp--;",
    "}",
    "",
    "void YYPARSER::EmptyValueStack( YYAPI_VALUETYPE yylval )",
    "{",
    "    if ( yyvsp != NULL ) ",
    "    {",
    "        if ((*yyvsp != yylval) && (NULL != yylval))",
    "            DeleteDBQT(yylval);",
    "",
    "        unsigned cCount = (unsigned)ULONG_PTR(yyvsp - xyyvs.Get());",
    "        for ( unsigned i=0; i < cCount; i++ )",
    "        {",
    "            if (NULL != xyyvs[i] )",
    "                DeleteDBQT(xyyvs[i]);",
    "        }",
    "    }",
    "",
    "   //@TODO RE-ACTIVATE",
    "   // note:  This was only done to empty any scope arrays",
    "   //      m_pIPSession->SetScopeProperties(m_pICommand);",
    "",
    "        m_pIPTProperties->SetContainsColumn(NULL);",
    "}",
    "",
#endif // KYLEP_CHANGE
#if defined(KYLEP_CHANGE)
    "int YYPARSER::Parse()",
#else
    "int",
    "yyparse()",
#endif // KYLEP_CHANGE
    "{",
    "    register int yym, yyn, yystate;",
    "#if YYDEBUG",
    "    register char *yys;",
    #if !defined(KYLEP_CHANGE)
    "    extern char *getenv();",
    #endif
    "",
    "    if (yys = getenv(\"YYDEBUG\"))",
    "    {",
    "        yyn = *yys;",
    "        if (yyn >= '0' && yyn <= '9')",
    "            yydebug = yyn - '0';",
    "    }",
    "#endif",
    "",
    "    yynerrs = 0;",
    "    yyerrflag = 0;",
    "    yychar = (-1);",
    "",
#if defined(KYLEP_CHANGE)
    "yyssp = xyyss.Get();",
    "yyvsp = xyyvs.Get();",
#else    
    "    yyssp = yyss;",
    "    yyvsp = yyvs;",
#endif    
    "    *yyssp = yystate = 0;",
    "",
    "yyloop:",
    "    if (yyn = yydefred[yystate]) goto yyreduce;",
    "    if (yychar < 0)",
    "    {",
#if defined(KYLEP_CHANGE)
    "        YYAPI_VALUENAME = NULL;",
    "        try",
    "        {",
    "            if ( (yychar = YYLEX(&YYAPI_VALUENAME)) < 0 ) ",
    "                yychar = 0;",
    "        }",
    "        catch (HRESULT hr)",
    "        {",
    "            switch(hr)",
    "            {",
    "            case E_OUTOFMEMORY:",
    "                m_pIPTProperties->SetErrorHResult(DB_E_ERRORSINCOMMAND, MONSQL_OUT_OF_MEMORY);",
    "                YYABORT(E_OUTOFMEMORY);",
    "                break;",
    "",
    "            default:",
    "                YYABORT(QPARSE_E_INVALID_QUERY);",
    "                break;",
    "            }",
    "        }",
#else
    "        if ((yychar = yylex()) < 0) yychar = 0;",
#endif // KYLEP_CHANGE
    "#if YYDEBUG",
    "        if (yydebug)",
    "        {",
    "            yys = 0;",
    "            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
    "            if (!yys) yys = \"illegal-symbol\";",
    "            printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
    "                    YYPREFIX, yystate, yychar, yys);",
    "        }",
    "#endif",
    "    }",
    "    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&",
    "            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
    "    {",
    "#if YYDEBUG",
    "        if (yydebug)",
    "            printf(\"%sdebug: state %d, shifting to state %d\\n\",",
    "                    YYPREFIX, yystate, yytable[yyn]);",
    "#endif",
    #if defined(KYLEP_CHANGE) 
    "        if ( yyssp >= xyyss.Get() + xyyss.Count() - 1 )",
    "        {",
    "            int yysspLoc = (int) ( yyssp - xyyss.Get() );",
    "            xyyss.SetSize((unsigned) (yyssp-xyyss.Get())+2);",
    "            yyssp = xyyss.Get() + yysspLoc;",
    "        }",
    "        if ( yyvsp >= xyyvs.Get() + xyyvs.Size() - 1 )",
    "        {",
    "            int yyvspLoc = (int) ( yyvsp - xyyvs.Get() );",
    "            xyyvs.SetSize((unsigned) (yyvsp-xyyvs.Get())+2); ",
    "            yyvsp = xyyvs.Get() + yyvspLoc;",
    "        }",
    #else        
    "        if (yyssp >= yyss + yystacksize - 1)",
    "        {",
    "            goto yyoverflow;",
    "        }",
    #endif
    "        *++yyssp = yystate = yytable[yyn];",
    "        *++yyvsp = yylval;",
    "        yychar = (-1);",
    "        if (yyerrflag > 0)  --yyerrflag;",
    "        goto yyloop;",
    "    }",
    "    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&",
    "            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
    "    {",
    "        yyn = yytable[yyn];",
    "        goto yyreduce;",
    "    }",
    #if defined(KYLEP_CHANGE) 
    "#ifdef YYERROR_VERBOSE",
    "// error reporting; done before the goto error recovery",
    "{",
    "",
    "    // must be first - cleans m_pIPTProperties",
    "    m_pIPTProperties->SetErrorHResult(DB_E_ERRORSINCOMMAND, MONSQL_PARSE_ERROR);",
    "",
    "    int size = 0, totSize = 0;",
    "    int curr_yychar;",
    "    XGrowable<WCHAR> xMsg;",
    "    for ( curr_yychar =0; curr_yychar<=YYMAXTOKEN; curr_yychar++)",
    "    {",
    "    ",
    "        if ( ( yycheck[yysindex[yystate] + curr_yychar] == curr_yychar ) ||",
    "             ( yycheck[yyrindex[yystate] + curr_yychar] == curr_yychar ) )",
    "        {          ",
    "         ",
    "            char * token_name = yyname[curr_yychar];",
    "            if ( 0 != token_name )",
    "            {",
    "               if ( '_' == token_name[0] )",
    "                   token_name++;",
    "               size = mystrlen(token_name) + 1 ;",
    "               xMsg.SetSize(totSize+size+2); // +2 for \", \"",
    "               if (0 == MultiByteToWideChar(CP_ACP, 0, token_name, size,",
    "                                            xMsg.Get()+totSize, size))",
    "               {",
    "                    break;",
    "               }",
    "               totSize += size-1;",
    "               wcscpy( xMsg.Get()+totSize, L\", \" );",
    "               totSize+=2;",
    "            }",
    "        }",    
    "    }",
    "    // get rid of last comma",
    "    if ( totSize >= 2 ) ",
    "        (xMsg.Get())[totSize-2] = 0;",
    "",
    "    if ( wcslen((YY_CHAR*)m_yylex.YYText()) )",
    "         m_pIPTProperties->SetErrorToken( (YY_CHAR*)m_yylex.YYText() );",
    "    else",
    "         m_pIPTProperties->SetErrorToken(L\"<end of input>\");",
    "    ",
    "    m_pIPTProperties->SetErrorToken(xMsg.Get());",
    "}",
    "#endif //YYERROR_VERBOSE",
    #endif // KYLEP_CHANGE
    "    if (yyerrflag) goto yyinrecovery;",
    #if defined(KYLEP_CHANGE)
    "    yyerror(\"syntax error\");",
    "    ++yynerrs;",
    #else
    "#ifdef lint",
    "    goto yynewerror;",
    "#endif",
    "yynewerror:",
    "    yyerror(\"syntax error\");",
    "#ifdef lint",
    "    goto yyerrlab;",
    "#endif",
    "yyerrlab:",
    "    ++yynerrs;",
    #endif
    "yyinrecovery:",
    "    if (yyerrflag < 3)",
    "    {",
    "        yyerrflag = 3;",
    "        for (;;)",
    "        {",
    "            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&",
    "                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)",
    "            {",
    "#if YYDEBUG",
    "                if (yydebug)",
    "                    printf(\"%sdebug: state %d, error recovery shifting\\",
    " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);",
    "#endif",
    #if defined(KYLEP_CHANGE)
    "                if ( yyssp >= xyyss.Get() + xyyss.Count() - 1 )",
    "                {",
    "                    int yysspLoc = (int) ( yyssp - xyyss.Get() );",
    "                    xyyss.SetSize((unsigned) (yyssp-xyyss.Get())+2);",
    "                    yyssp = xyyss.Get() + yysspLoc;",
    "                }",
    "                if ( yyvsp >= xyyvs.Get() + xyyvs.Size() - 1 )",
    "                {",
    "                    int yyvspLoc = (int) ( yyvsp - xyyvs.Get() );",
    "                    xyyvs.SetSize((unsigned) (yyvsp-xyyvs.Get())+2); ",
    "                    yyvsp = xyyvs.Get() + yyvspLoc;",
    "                }",
    #else
    "                if (yyssp >= yyss + yystacksize - 1)",
    "                {",
    "                    goto yyoverflow;",
    "                }",
    #endif
    "                *++yyssp = yystate = yytable[yyn];",
    "                *++yyvsp = yylval;",
    "                goto yyloop;",
    "            }",
    "            else",
    "            {",
    "#if YYDEBUG",
    "                if (yydebug)",
    "                    printf(\"%sdebug: error recovery discarding state %d\\\n\",",
    "                            YYPREFIX, *yyssp);",
    "#endif",
    #if defined(KYLEP_CHANGE)
    "                if (yyssp <= xyyss.Get()) goto yyabort;",
    #else
    "                if (yyssp <= yyss) goto yyabort;",
    #endif
    "                PopVs();",
    "                --yyssp;",
    "            }",
    "        }",
    "    }",
    "    else",
    "    {",
    "        if (yychar == 0) goto yyabort;",
    "#if YYDEBUG",
    "        if (yydebug)",
    "        {",
    "            yys = 0;",
    "            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
    "            if (!yys) yys = \"illegal-symbol\";",
    "            printf(\"%sdebug: state %d, error recovery discards token %d\
 (%s)\\n\",",
    "                    YYPREFIX, yystate, yychar, yys);",
    "        }",
    "#endif",
    "        yychar = (-1);",
    "        goto yyloop;",
    "    }",
    "yyreduce:",
    "#if YYDEBUG",
    "    if (yydebug)",
    "        printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",",
    "                YYPREFIX, yystate, yyn, yyrule[yyn]);",
    "#endif",
    "    yym = yylen[yyn];",
    "    yyval = yyvsp[1-yym];",
    "    switch (yyn)",
    "    {",
    0
};

char *TriplishBody[] =
{
#if defined(KYLEP_CHANGE)
    "#define YYABORT(sc) { return ResultFromScode(sc); }",
    "#define YYFATAL   E_FAIL",
    "#define YYSUCCESS S_OK",
#else
    "#define YYABORT goto yyabort",
#endif // KYLEP_CHANGE
    "#define YYREJECT goto yyabort",
    "#define YYACCEPT goto yyaccept",
#if !defined(KYLEP_CHANGE) // YYERROR is not being used
    "#define YYERROR goto yyerrlab",
#endif
#if defined(KYLEP_CHANGE)
    "int YYPARSER::Parse()",
#else
    "int",
    "yyparse()",
#endif // KYLEP_CHANGE
    "{",
    "    register int yym, yyn, yystate;",
    "#if YYDEBUG",
    "    register char *yys;",
    #if !defined(KYLEP_CHANGE)
    "    extern char *getenv();",
    #endif
    "",
    "    if (yys = getenv(\"YYDEBUG\"))",
    "    {",
    "        yyn = *yys;",
    "        if (yyn >= '0' && yyn <= '9')",
    "            yydebug = yyn - '0';",
    "    }",
    "#endif",
    "",
    "    yynerrs = 0;",
    "    yyerrflag = 0;",
    "    yychar = (-1);",
    "",
#if defined(KYLEP_CHANGE)
    "yyssp = xyyss.Get();",
    "yyvsp = xyyvs.Get();",
#else    
    "    yyssp = yyss;",
    "    yyvsp = yyvs;",
#endif    
    "    *yyssp = yystate = 0;",
    "",
    "yyloop:",
    "    if (yyn = yydefred[yystate]) goto yyreduce;",
    "    if (yychar < 0)",
    "    {",
#if defined(KYLEP_CHANGE)
    "        try",
    "        {",
    "            if ( (yychar = YYLEX(&YYAPI_VALUENAME)) < 0 ) ",
    "                yychar = 0;",
    "        }",
    "        catch (HRESULT hr)",
    "        {",
    "            switch(hr)",
    "            {",
    "            case E_OUTOFMEMORY:",
    "                YYABORT(E_OUTOFMEMORY);",
    "                break;",
    "",
    "            default:",
    "                YYABORT(E_FAIL);",
    "                break;",
    "            }",
    "        }",
#else
    "        if ((yychar = yylex()) < 0) yychar = 0;",
#endif // KYLEP_CHANGE
    "#if YYDEBUG",
    "        if (yydebug)",
    "        {",
    "            yys = 0;",
    "            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
    "            if (!yys) yys = \"illegal-symbol\";",
    "            printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
    "                    YYPREFIX, yystate, yychar, yys);",
    "        }",
    "#endif",
    "    }",
    "    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&",
    "            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
    "    {",
    "#if YYDEBUG",
    "        if (yydebug)",
    "            printf(\"%sdebug: state %d, shifting to state %d\\n\",",
    "                    YYPREFIX, yystate, yytable[yyn]);",
    "#endif",
    #if defined(KYLEP_CHANGE) 
    "        if ( yyssp >= xyyss.Get() + xyyss.Count() - 1 )",
    "        {",
    "            int yysspLoc = (int) ( yyssp - xyyss.Get() );",
    "            xyyss.SetSize((unsigned) (yyssp-xyyss.Get())+2);",
    "            yyssp = xyyss.Get() + yysspLoc;",
    "        }",
    "        if ( yyvsp >= xyyvs.Get() + xyyvs.Size() - 1 )",
    "        {",
    "            int yyvspLoc = (int) ( yyvsp - xyyvs.Get() );",
    "            xyyvs.SetSize((unsigned) (yyvsp-xyyvs.Get())+2);",
    "            yyvsp = xyyvs.Get() + yyvspLoc;",
    "        }",
    #else        
    "        if (yyssp >= yyss + yystacksize - 1)",
    "        {",
    "            goto yyoverflow;",
    "        }",
    #endif
    "        *++yyssp = yystate = yytable[yyn];",
    "        *++yyvsp = yylval;",
    "        yychar = (-1);",
    "        if (yyerrflag > 0)  --yyerrflag;",
    "        goto yyloop;",
    "    }",
    "    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&",
    "            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
    "    {",
    "        yyn = yytable[yyn];",
    "        goto yyreduce;",
    "    }",
    "    if (yyerrflag) goto yyinrecovery;",
    #if defined(KYLEP_CHANGE)
    "    yyerror(\"syntax error\");",
    "    ++yynerrs;",
    #else
    "#ifdef lint",
    "    goto yynewerror;",
    "#endif",
    "yynewerror:",
    "    yyerror(\"syntax error\");",
    "#ifdef lint",
    "    goto yyerrlab;",
    "#endif",
    "yyerrlab:",
    "    ++yynerrs;",
    #endif
    "yyinrecovery:",
    "    if (yyerrflag < 3)",
    "    {",
    "        yyerrflag = 3;",
    "        for (;;)",
    "        {",
    "            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&",
    "                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)",
    "            {",
    "#if YYDEBUG",
    "                if (yydebug)",
    "                    printf(\"%sdebug: state %d, error recovery shifting\\",
    " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);",
    "#endif",
    #if defined(KYLEP_CHANGE)
    "                if ( yyssp >= xyyss.Get() + xyyss.Count() - 1 )",
    "                {",
    "                    int yysspLoc = (int) ( yyssp - xyyss.Get() );",
    "                    xyyss.SetSize((unsigned) (yyssp-xyyss.Get())+2);",
    "                    yyssp = xyyss.Get() + yysspLoc;",
    "                }",
    "                if ( yyvsp >= xyyvs.Get() + xyyvs.Size() - 1 )",
    "                {",
    "                    int yyvspLoc = (int) ( yyvsp - xyyvs.Get() );",
    "                    xyyvs.SetSize((unsigned) (yyvsp-xyyvs.Get())+2);",
    "                    yyvsp = xyyvs.Get() + yyvspLoc;",
    "                }",
    #else
    "                if (yyssp >= yyss + yystacksize - 1)",
    "                {",
    "                    goto yyoverflow;",
    "                }",
    #endif
    "                *++yyssp = yystate = yytable[yyn];",
    "                *++yyvsp = yylval;",
    "                goto yyloop;",
    "            }",
    "            else",
    "            {",
    "#if YYDEBUG",
    "                if (yydebug)",
    "                    printf(\"%sdebug: error recovery discarding state %d\\n\",",
    "                            YYPREFIX, *yyssp);",
    "#endif",
    #if defined(KYLEP_CHANGE)
    "                if (yyssp <= xyyss.Get()) goto yyabort;",
    #else
    "                if (yyssp <= yyss) goto yyabort;",
    #endif
    "                --yyssp;",
    "                PopVs();",
    "            }",
    "        }",
    "    }",
    "    else",
    "    {",
    "        if (yychar == 0) goto yyabort;",
    "#if YYDEBUG",
    "        if (yydebug)",
    "        {",
    "            yys = 0;",
    "            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
    "            if (!yys) yys = \"illegal-symbol\";",
    "            printf(\"%sdebug: state %d, error recovery discards token %d\
 (%s)\\n\",",
    "                    YYPREFIX, yystate, yychar, yys);",
    "        }",
    "#endif",
    "        yychar = (-1);",
    "        goto yyloop;",
    "    }",
    "yyreduce:",
    "#if YYDEBUG",
    "    if (yydebug)",
    "        printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",",
    "                YYPREFIX, yystate, yyn, yyrule[yyn]);",
    "#endif",
    "    yym = yylen[yyn];",
    "    yyval = yyvsp[1-yym];",
    "    switch (yyn)",
    "    {",
    0
};

char *trailer[] =
{
    "    }",
    "    yyssp -= yym;",
    "    yystate = *yyssp;",
    "    yyvsp -= yym;",
    "    yym = yylhs[yyn];",
    "    if (yystate == 0 && yym == 0)",
    "    {",
    "#if YYDEBUG",
    "        if (yydebug)",
    "            printf(\"%sdebug: after reduction, shifting from state 0 to\\",
    " state %d\\n\", YYPREFIX, YYFINAL);",
    "#endif",
    "        yystate = YYFINAL;",
    "        *++yyssp = YYFINAL;",
    "        *++yyvsp = yyval;",
    "        if (yychar < 0)",
    "        {",
#if defined(KYLEP_CHANGE)
    "            YYAPI_VALUENAME = NULL;",
    "            try",
    "            {",
    "                if ( (yychar = YYLEX(&YYAPI_VALUENAME)) < 0 ) ",
    "                    yychar = 0;",
    "            }",
    "            catch (HRESULT hr)",
    "            {",
    "                switch(hr)",
    "                {",
    "                case E_OUTOFMEMORY:",
    "                    m_pIPTProperties->SetErrorHResult(DB_E_ERRORSINCOMMAND, MONSQL_OUT_OF_MEMORY);",
    "                    YYABORT(E_OUTOFMEMORY);",
    "                    break;",
    "",
    "                default:",
    "                    YYABORT(QPARSE_E_INVALID_QUERY);",
    "                    break;",
    "                }",
    "            }",
#else
    "            if ((yychar = yylex()) < 0) yychar = 0;",
#endif // KYLEP_CHANGE
    "#if YYDEBUG",
    "            if (yydebug)",
    "            {",
    "                yys = 0;",
    "                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
    "                if (!yys) yys = \"illegal-symbol\";",
    "                printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
    "                        YYPREFIX, YYFINAL, yychar, yys);",
    "            }",
    "#endif",
    "        }",
    "        if (yychar == 0) goto yyaccept;",
    "        goto yyloop;",
    "    }",
    "    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&",
    "            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)",
    "        yystate = yytable[yyn];",
    "    else",
    "        yystate = yydgoto[yym];",
    "#if YYDEBUG",
    "    if (yydebug)",
    "        printf(\"%sdebug: after reduction, shifting from state %d \\",
    "to state %d\\n\", YYPREFIX, *yyssp, yystate);",
    "#endif",
    #if defined(KYLEP_CHANGE)
    "    if ( yyssp >= xyyss.Get() + xyyss.Count() - 1 )",
    "    {",
    "        int yysspLoc = (int) ( yyssp - xyyss.Get() );",
    "        xyyss.SetSize((unsigned) ( yyssp-xyyss.Get())+2);",
    "        yyssp = xyyss.Get() + yysspLoc;",
    "    }",
    "    if ( yyvsp >= xyyvs.Get() + xyyvs.Size() - 1 )",
    "    {",
    "        int yyvspLoc = (int) ( yyvsp - xyyvs.Get() );",
    "        xyyvs.SetSize((unsigned) ( yyvsp-xyyvs.Get())+2);",
    "        yyvsp = xyyvs.Get() + yyvspLoc;",
    "    }",
    "    *++yyssp = (short) yystate;",
    #else
    "    if (yyssp >= yyss + yystacksize - 1)",
    "    {",
    "        goto yyoverflow;",
    "    }",
    "    *++yyssp = yystate;",
    #endif
    "    *++yyvsp = yyval;",
    "    goto yyloop;",
    #if !defined(KYLEP_CHANGE)
    "yyoverflow:",
    "    yyerror(\"yacc stack overflow\");",
    #endif
    "yyabort:",
    #if defined(KYLEP_CHANGE)
    "    EmptyValueStack(yylval);",
    "    return YYFATAL;",
    #else
    "    return (1);",
    #endif // KYLEP_CHANGE
    "yyaccept:",
    #if defined(KYLEP_CHANGE)
    "    return YYSUCCESS;",
    #else
    "    return (0);",
    #endif // KYLEP_CHANGE
    "}",
    0
};

char *TriplishTrailer[] =
{
    "    }",
    "    yyssp -= yym;",
    "    yystate = *yyssp;",
    "    yyvsp -= yym;",
    "    yym = yylhs[yyn];",
    "    if (yystate == 0 && yym == 0)",
    "    {",
    "#if YYDEBUG",
    "        if (yydebug)",
    "            printf(\"%sdebug: after reduction, shifting from state 0 to\\",
    " state %d\\n\", YYPREFIX, YYFINAL);",
    "#endif",
    "        yystate = YYFINAL;",
    "        *++yyssp = YYFINAL;",
    "        *++yyvsp = yyval;",
    "        if (yychar < 0)",
    "        {",
#if defined(KYLEP_CHANGE)
    "            try",
    "            {",
    "                if ( (yychar = YYLEX(&YYAPI_VALUENAME)) < 0 ) ",
    "                    yychar = 0;",
    "            }",
    "            catch (HRESULT hr)",
    "            {",
    "                switch(hr)",
    "                {",
    "                case E_OUTOFMEMORY:",
    "                    YYABORT(E_OUTOFMEMORY);",
    "                    break;",
    "",
    "                default:",
    "                    YYABORT(E_FAIL);",
    "                    break;",
    "                }",
    "            }",
#else
    "            if ((yychar = yylex()) < 0) yychar = 0;",
#endif // KYLEP_CHANGE
    "#if YYDEBUG",
    "            if (yydebug)",
    "            {",
    "                yys = 0;",
    "                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
    "                if (!yys) yys = \"illegal-symbol\";",
    "                printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
    "                        YYPREFIX, YYFINAL, yychar, yys);",
    "            }",
    "#endif",
    "        }",
    "        if (yychar == 0) goto yyaccept;",
    "        goto yyloop;",
    "    }",
    "    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&",
    "            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)",
    "        yystate = yytable[yyn];",
    "    else",
    "        yystate = yydgoto[yym];",
    "#if YYDEBUG",
    "    if (yydebug)",
    "        printf(\"%sdebug: after reduction, shifting from state %d \\",
    "to state %d\\n\", YYPREFIX, *yyssp, yystate);",
    "#endif",
    #if defined(KYLEP_CHANGE)
    "    if ( yyssp >= xyyss.Get() + xyyss.Count() - 1 )",
    "    {",
    "        int yysspLoc = (int) ( yyssp - xyyss.Get() );",
    "        xyyss.SetSize((unsigned) ( yyssp-xyyss.Get())+2);",
    "        yyssp = xyyss.Get() + yysspLoc;",
    "    }",
    "    if ( yyvsp >= xyyvs.Get() + xyyvs.Size() - 1 )",
    "    {",
    "        int yyvspLoc = (int) ( yyssp - xyyss.Get() );",
    "        xyyvs.SetSize((unsigned) ( yyvsp-xyyvs.Get())+2);",
    "        yyvsp = xyyvs.Get() + yyvspLoc;",
    "    }",
    "    *++yyssp = (short) yystate;",
    #else
    "    if (yyssp >= yyss + yystacksize - 1)",
    "    {",
    "        goto yyoverflow;",
    "    }",
    "    *++yyssp = yystate;",
    #endif
    "    *++yyvsp = yyval;",
    "    goto yyloop;",
    #if !defined(KYLEP_CHANGE)
    "yyoverflow:",
    "    yyerror(\"yacc stack overflow\");",
    #endif
    "yyabort:",
    #if defined(KYLEP_CHANGE)
    "   EmptyValueStack(yylval);",
    "    return YYFATAL;",
    #else
    "    return (1);",
    #endif // KYLEP_CHANGE
    "yyaccept:",
    #if defined(KYLEP_CHANGE)
    "    return YYSUCCESS;",
    #else
    "    return (0);",
    #endif // KYLEP_CHANGE
    "}",
    0
};

#if defined(KYLEP_CHANGE)
void write_section(section,f)
char *section[];
FILE *f;
#else
write_section(section)
char *section[];
#endif // KYLEP_CHANGE
{
    register int c;
    register int i;
    register char *s;
    #if !defined(KYLEP_CHANGE)
    register FILE *f;

    f = code_file;
    #endif // !KYLEP_CHANGE
    for (i = 0; s = section[i]; ++i)
    {
        ++outline;
        while (c = *s)
        {
            putc(c, f);
            ++s;
        }
        putc('\n', f);
    }
}