Pennington— The Name in Software Engineering Automation

XTRAN Demonstration:  Automatically "Unnest" Pascal PROCEDUREs & FUNCTIONs

The following example used the standard set of XTRAN rules for parsing Pascal and translating it to C.  NOTE that the translation shown below was done with default conditions.  XTRAN provides many options for controlling the way it translates.



* Input to XTRAN:

    PROCEDURE extprc1; EXTERNAL;        {PROCEDURE extprc1; EXTERNAL;}
    PROCEDURE extprc2(a: INTEGER;       {PROCEDURE extprc2(a: INTEGER;}
      VAR b : INTEGER); EXTERNAL;       { VAR b : INTEGER); EXTERNAL;}

PROCEDURE main;                         {PROCEDURE main;}

    VAR
        main_var : INTEGER;             {main_var : INTEGER;}

    FUNCTION f1 : INTEGER;              {FUNCTION f1 : INTEGER;}
        VAR
            f1_var1: INTEGER;           {f1_var1 : INTEGER;}
        BEGIN                           {f1}
        f1_var1 := 1;                   {f1_var1 := 1;}
        f1 := f1_var1                   {f1 := f1_var1}
        END;    

    PROCEDURE p2;                       {PROCEDURE p2;}
        VAR
            p2_var : REAL;              {p2_var : REAL;}

        FUNCTION p2_f1(p2_f1_a1 : INTEGER) {FUNCTION p2_f1(p2_f1_a1 : INTEGER)}
          : INTEGER;                    { : INTEGER;}
            VAR
                p2_f1_var : INTEGER;    {p2_f1_var : INTEGER;}

            FUNCTION p2_f1_f1 : INTEGER; {FUNCTION p2_f1_f1 : INTEGER;}
                VAR
                    p2_f1_f1_var : INTEGER; {p2_f1_f1_var : INTEGER;}
                BEGIN                   {p2_f1_f1}
                p2_var := 0.0;          {p2_var := 0.0;}
                p2_f1_f1_var := p2_f1_var + 1; {p2_f1_f1_var := p2_f1_var + 1;}
                p2_f1_f1 := p2_f1_f1_var {p2_f1_f1 := p2_f1_f1_var}
                END;    

            PROCEDURE p2_f1_p2;         {PROCEDURE p2_f1_p2;}
                VAR
                    p2_f1_p2_var : INTEGER; {p2_f1_p2_var : INTEGER;}
                BEGIN                   {p2_f1_p2}
                p2_f1_p2_var := 1;      {p2_f1_p2_var := 1;}
                p2_var := 1.0;          {p2_var := 1.0;}
                main_var := 1;          {main_var := 1;}
                extprc2(main_var, p2_var); {extprc2(main_var, p2_var);}
                END;

            BEGIN                       {p2_f1}
            p2_f1_var := p2_f1_f1;      {p2_f1_var := p2_f1_f1;}
            p2_f1_p2;                   {p2_f1_p2;}
            p2_var := 2.0;              {p2_var := 2.0;}
            p2_f1 := p2_f1_var + p2_var {p2_f1 := p2_f1_var + p2_var}
            END;        

        BEGIN                           {p2}
        p2_var := p2_f1(p2_var) + main_var {p2_var := p2_f1(p2_var) + main_var}
        END;    

BEGIN                                   {main}
    main_var := f1;                     {main_var := f1;}
    extprc1;                            {extprc1;}
    p2                                  {p2}
END.


* Output from XTRAN:

        extern void extprc1(void);              /*PROCEDURE extprc1; EXTERNAL;*/
        extern void extprc2(long a, long *b);   /*PROCEDURE extprc2(a: INTEGER;*/
                                                /* VAR b : INTEGER); EXTERNAL;*/

static long f1(void)                            /*FUNCTION f1 : INTEGER;*/
{
        long result;                            /*for function result*/
        long f1_var1;                           /*f1_var1 : INTEGER;*/
                                                /*f1*/
        f1_var1 = 1;                            /*f1_var1 := 1;*/
        result = f1_var1;                       /*f1 := f1_var1*/

        return (result);
}
static long p2_f1_f1(float *p2_var, long
  *p2_f1_var)                                   /*FUNCTION p2_f1_f1 : INTEGER;*/
{
        long result;                            /*for function result*/
        long p2_f1_f1_var;                      /*p2_f1_f1_var : INTEGER;*/
                                                /*p2_f1_f1*/
        *p2_var = 0.0;                          /*p2_var := 0.0;*/
        p2_f1_f1_var = *p2_f1_var + 1;          /*p2_f1_f1_var := p2_f1_var + 1;*/
        result = p2_f1_f1_var;                  /*p2_f1_f1 := p2_f1_f1_var*/

        return (result);
}

static void p2_f1_p2(float *p2_var, long
  *main_var)                                    /*PROCEDURE p2_f1_p2;*/
{
        long p2_f1_p2_var;                      /*p2_f1_p2_var : INTEGER;*/
                                                /*p2_f1_p2*/
        p2_f1_p2_var = 1;                       /*p2_f1_p2_var := 1;*/
        *p2_var = 1.0;                          /*p2_var := 1.0;*/
        *main_var = 1;                          /*main_var := 1;*/
        extprc2(*main_var, p2_var);             /*extprc2(main_var, p2_var);*/

}
static long p2_f1(long p2_f1_a1, float *p2_var,
  long *main_var)                               /*FUNCTION p2_f1(p2_f1_a1 : INTEGER)*/
                                                /* : integer;*/
{
        long result;                            /*for function result*/
        long p2_f1_var;                         /*p2_f1_var : INTEGER;*/

                                                /*p2_f1*/
        p2_f1_var = p2_f1_f1(p2_var,
          &p2_f1_var);                          /*p2_f1_var := p2_f1_f1;*/
        p2_f1_p2(p2_var, main_var);             /*p2_f1_p2;*/
        *p2_var = 2.0;                          /*p2_var := 2.0;*/
        result = p2_f1_var + *p2_var;           /*p2_f1 := p2_f1_var + p2_var*/

        return (result);
}
static void p2(long *main_var)                  /*PROCEDURE p2;*/
{
        float p2_var;                           /*p2_var : REAL;*/

                                                /*p2*/
        p2_var = p2_f1(p2_var, &p2_var,
          main_var) + *main_var;                /*p2_var := p2_f1(p2_var) + main_var*/

}
void main(void)                                 /*PROCEDURE main;*/
{
        long main_var;                          /*main_var : INTEGER;*/

                                                /*main*/
        main_var = f1();                        /*main_var := f1;*/
        extprc1();                              /*extprc1;*/
        p2(&main_var);                          /*p2*/
}


COPYRIGHT 2012; reproduction prohibited without permission.  Revised 2009-09-11

XTRAN is a trademark of Pennington Systems Incorporated.

  Pennington Systems Incorporated
2820 N. Pinal Avenue, Suite 12
Casa Grande, Arizona 85122-7927
USA


  Phone:  +1(480)626-5503
Fax:  +1(480)626-7618
Email:  Info@Pennington.com
Web:  http://WWW.Pennington.com