UNIVERSITY OF NORTHERN BRITISH COLUMBIA

Winter 2002
Computer Science


           
Semantic Analysis Examples


Program #1: testblock.mns

/***

A program to test if declaring a variable with the same name as a previous
scope in a new block works correctly.
***/

void main(void)
{
  int x;
  x = 1;
  output(x);
  
  if(x)
  {
    int x;
    x = 2;
    output(x);
    
    if(x)
    {
      int x;
      x = 3;
      output(x);
      
      if( x )
      {
        int x;
        x = 45;
        output(x);
      }
      
      output(555);
      
      if( x )
      {
        int x;
        x = 54;
        output(x);
      }
      
      output(x);
    }
    
    output(x);
  }
  
  output(x);
}

Example #1 Output

CMINUS COMPILATION: testblock.mns

Running Semantic Analyzer...

Type  Declar Name  DType  Loc  Block  ScopeName  Line Numbers
----  -----------  -----  ---  -----  ---------  ------------
void  main         func   0    0      global     8
int   input        var    -1   0      global     -1
void  output       var    -2   0      global     -2  12  18  24  30  33  39  42  45  48
int   x            var    5    5      main       37  38  39
int   x            var    4    4      main       28  29  30
int   x            var    3    3      main       22  23  24  26  35  42
int   x            var    2    2      main       16  17  18  20  45
int   x            var    1    1      main       10  11  12  14  48


Type Checking Finished

Annotated Syntax tree:
  VOID Func: main
    VOID PARAM: (null)
    Compound Block
      INT VAR: x
      Assign:
        Id: x
        Const: 1
      Output:
        Id: x
      If
        Id: x
      Then
        Compound Block
          INT VAR: x
          Assign:
            Id: x
            Const: 2
          Output:
            Id: x
          If
            Id: x
          Then
            Compound Block
              INT VAR: x
              Assign:
                Id: x
                Const: 3
              Output:
                Id: x
              If
                Id: x
              Then
                Compound Block
                  INT VAR: x
                  Assign:
                    Id: x
                    Const: 45
                  Output:
                    Id: x
              endif
              Output:
                Const: 555
              If
                Id: x
              Then
                Compound Block
                  INT VAR: x
                  Assign:
                    Id: x
                    Const: 54
                  Output:
                    Id: x
              endif
              Output:
                Id: x
          endif
          Output:
            Id: x
      endif
      Output:
        Id: x
 

 

Program #2: eulcid.mns

/***
A program to perform Euclid's Algorithm to compute gcd.
***/

int gcd (int u, int v)
{
      if (v == 0)
            return u ;
      else
            return gcd(v,u-u/v*v);
      /* u-u/v*v == u mod v */
}

void main(void)
{ int x; int y;
      x = input(); y = input();
      output(gcd(x,y));
}

Example  #2 Ouput

CMINUS COMPILATION: euclid.mns

Running Semantic Analyzer...

Type  DeclarName  DType  Loc   Block  ScopeName  Line Numbers
----  ----------  -----  ---   -----  ---------  ------------
void  main        func   3     0      global     16
int   input       var    -1    0      global     -1  18  18
int   u           var    1     1      gcd        7  10  12  12
void  output      var    -2    0      global     -2  19
int   v           var    2     1      gcd        7   9  12  12  12
int   x           var    4     1      main       17  18  19
int   y           var    5     1      main       17  18  19
int   gcd         func   0     0      global     7  12  19


Type Checking Finished

Annotated Syntax tree:
  INT Func: gcd
    INT PARAM: u
    INT PARAM: v
    Compound Block
      If
        Op: ==
          Id: v
          Const: 0
      Then
        Return
          Id: u
      else
        Return
          CALL: gcd
            Id: v
            Op: -
              Id: u
              Op: *
                Op: /
                  Id: u
                  Id: v
                Id: v
      endif
  VOID Func: main
    VOID PARAM: (null)
    Compound Block
      INT VAR: x
      INT VAR: y
      Assign:
        Id: x
        Input()
      Assign:
        Id: y
        Input()
      Output:
        CALL: gcd
          Id: x
          Id: y

Program #3: quicksort.mns

/* This is the first example of incorrect typing
 */

void swap( int arr[], int i, int j )
{
  int temp;
  temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
  return;
}


int partition( int arr[], int lo, int hi )
{ /* hi is the highest index to use, lo is the lowest index to use */
  int sz;
  int mid;
  int median;
  int temp;

  sz = hi - lo;
  mid = lo + (hi - lo)/2;

  /* median of three partitioning */
  if( arr[lo] >  arr[mid] )
  {
    swap( arr, lo, mid );

  } 
  if( arr[lo] > arr[hi] )
  {
    swap( arr, lo, hi );
  }
  if( arr[mid] > arr[hi] )
  {
    swap( arr, mid, hi );
  }


  swap(arr,mid, hi-1);
  return ( arr[hi-1] );
}
 

void quicksort( int arr[], int lo, int hi )
{
  int part;
  int lb;
  int hb;
 
  if(lo + 2 < hi)
  {
     int pivot;
     int flag;
     int i;
     int j;

     flag = 0;
     pivot = partition(arr, lo, hi );
     i = lo;
     j = hi - 1;    

     while( flag == 0 )
     {
     
       i = i + 1;
       while ( arr[i] < pivot )
       {
         i = i + 1;
       }
      
       j = j - 1;
       while( arr[j] > pivot )
       {
         j = j - 1;
       }

       if ( i < j )
       {
         swap( arr, i, j );
       }
       else
       {
         flag = 1;
       }
     }
 
   swap( arr, i, hi - 1 );

   quicksort(arr, lo, i-1  );
  
   quicksort(arr, i+1, hi ); 
  }
  else
  {
    /* replace insertion sort*/
    int mid;
    mid = (lo + hi) /2; 

    if( arr[lo] > arr[mid] )
    {
      swap( arr, lo, mid );
    } 
    if( arr[lo] > arr[hi] )
    {
      swap( arr, lo, hi );
    }
    if( arr[mid] > arr[hi] )
    {
      swap( arr, mid, hi );
    }
  }
  return;
}

Example  #3 Ouput: quicksort.mns

CMINUS COMPILATION: quicksort.mns

Running Semantic Analyzer...

Type  DeclarName  DType  Loc  Block  ScopeName  Line Numbers                    ----  ----------  -----  ---  -----  ---------  ------------
int   part        var    17   1      quicksort  47
int   partition   func   5    0         global  14  59
void  main        func   25   0         global 116
int   temp        var    12   1      partition  19
int   temp        var    4    1           swap   6   7   9
int   array       var    26   1           main 118 128 133 138
int   median      var    11   1      partition  18
int   sz          var    9    1      partition  16  21
int   pivot       var    20   2      quicksort  53  59  67  73
int   hb          var    19   1      quicksort  49
int   input       var    -1   0         global  -1
int   hi          var    16   1      quicksort  45  51  59  61  88  92  98 106 110
int   hi          var    8    1      partition  14  21  22  32  36  40
void  quicksort   func   13   0         global  45  90  92 133
int   i           var    27   1           main 119 121 126 129 129 135 136 139 139
int   i           var    22   2      quicksort  55  60  66  66  69  69  78  80  88  90  92
int   i           var    2    1           swap   4
int   j           var    28   1           main 120 123 128 130 130
int   j           var    23   2      quicksort  56  61  72  72  75  75  78  80
int   j           var    3    1           swap   4
void  output      var    -2   0         global  -2 138
int   lb          var    18   1      quicksort  48
int   mid         var    24   8      quicksort  97  98 102 110
int   mid         var    10   1      partition  17  22  27  36  40
void  swap        func    0   0         global   4  27  32  36  40  80  88 102 106 110
int   lo          var    15   1      quicksort  45  51  59  60  90  98 102 106
int   lo          var    7    1      partition  14  21  22  22  27  32
int   arr         var    14   1      quicksort  45  59  67  73  80  88  90  92 100 100 102 104 104 106 108 108 110
int   arr         var    6    1      partition  14  25  25  27  30  30  32  34  34  36  40  41
int   arr         var    1    1           swap   4   7   8   8   9
int   flag        var    21   2      quicksort  54  58  63  84


Type Checking Finished

Annotated Syntax tree:
  VOID Func: swap
    INT PARAM: arr
      Param Array
    INT PARAM: i
    INT PARAM: j
    Compound Block
      INT VAR: temp
      Assign:
        Id: temp
        Id: arr
          Id: i
      Assign:
        Id: arr
          Id: i
        Id: arr
          Id: j
      Assign:
        Id: arr
          Id: j
        Id: temp
      Return
  INT Func: partition
    INT PARAM: arr
      Param Array
    INT PARAM: lo
    INT PARAM: hi
    Compound Block
      INT VAR: sz
      INT VAR: mid
      INT VAR: median
      INT VAR: temp
      Assign:
        Id: sz
        Op: -
          Id: hi
          Id: lo
      Assign:
        Id: mid
        Op: +
          Id: lo
          Op: /
            Op: -
              Id: hi
              Id: lo
            Const: 2
      If
        Op: >
          Id: arr
            Id: lo
          Id: arr
            Id: mid
      Then
        Compound Block
          CALL: swap
            Id: arr
              CALL: (null)
            Id: lo
            Id: mid
      endif
      If
        Op: >
          Id: arr
            Id: lo
          Id: arr
            Id: hi
      Then
        Compound Block
          CALL: swap
            Id: arr
              CALL: (null)
            Id: lo
            Id: hi
      endif
      If
        Op: >
          Id: arr
            Id: mid
          Id: arr
            Id: hi
      Then
        Compound Block
          CALL: swap
            Id: arr
              CALL: (null)
            Id: mid
            Id: hi
      endif
      CALL: swap
        Id: arr
          CALL: (null)
        Id: mid
        Op: -
          Id: hi
          Const: 1
      Return
        Id: arr
          Op: -
            Id: hi
            Const: 1
  VOID Func: quicksort
    INT PARAM: arr
      Param Array
    INT PARAM: lo
    INT PARAM: hi
    Compound Block
      INT VAR: part
      INT VAR: lb
      INT VAR: hb
      If
        Op: <
          Op: +
            Id: lo
            Const: 2
          Id: hi
      Then
        Compound Block
          INT VAR: pivot
          INT VAR: flag
          INT VAR: i
          INT VAR: j
          Assign:
            Id: flag
            Const: 0
          Assign:
            Id: pivot
            CALL: partition
              Id: arr
                CALL: (null)
              Id: lo
              Id: hi
          Assign:
            Id: i
            Id: lo
          Assign:
            Id: j
            Op: -
              Id: hi
              Const: 1
          While:
            Op: ==
              Id: flag
              Const: 0
            Compound Block
              Assign:
                Id: i
                Op: +
                  Id: i
                  Const: 1
              While:
                Op: <
                  Id: arr
                    Id: i
                  Id: pivot
                Compound Block
                  Assign:
                    Id: i
                    Op: +
                      Id: i
                      Const: 1
              Assign:
                Id: j
                Op: -
                  Id: j
                  Const: 1
              While:
                Op: >
                  Id: arr
                    Id: j
                  Id: pivot
                Compound Block
                  Assign:
                    Id: j
                    Op: -
                      Id: j
                      Const: 1
              If
                Op: <
                  Id: i
                  Id: j
              Then
                Compound Block
                  CALL: swap
                    Id: arr
                      CALL: (null)
                    Id: i
                    Id: j
              else
                Compound Block
                  Assign:
                    Id: flag
                    Const: 1
              endif
          CALL: swap
            Id: arr
              CALL: (null)
            Id: i
            Op: -
              Id: hi
              Const: 1
          CALL: quicksort
            Id: arr
              CALL: (null)
            Id: lo
            Op: -
              Id: i
              Const: 1
          CALL: quicksort
            Id: arr
              CALL: (null)
            Op: +
              Id: i
              Const: 1
            Id: hi
      else
        Compound Block
          INT VAR: mid
          Assign:
            Id: mid
            Op: /
              Op: +
                Id: lo
                Id: hi
              Const: 2
          If
            Op: >
              Id: arr
                Id: lo
              Id: arr
                Id: mid
          Then
            Compound Block
              CALL: swap
                Id: arr
                  CALL: (null)
                Id: lo
                Id: mid
          endif
          If
            Op: >
              Id: arr
                Id: lo
              Id: arr
                Id: hi
          Then
            Compound Block
              CALL: swap
                Id: arr
                  CALL: (null)
                Id: lo
                Id: hi
          endif
          If
            Op: >
              Id: arr
                Id: mid
              Id: arr
                Id: hi
          Then
            Compound Block
              CALL: swap
                Id: arr
                  CALL: (null)
                Id: mid
                Id: hi
          endif
      endif
      Return
  VOID Func: main
    VOID PARAM: (null)
    Compound Block
      INT VAR: array
        Const: 100
      INT VAR: i
      INT VAR: j
      Assign:
        Id: i
        Const: 0
      Assign:
        Id: j
        Const: 100
      While:
        Op: <
          Id: i
          Const: 100
        Compound Block
          Assign:
            Id: array
              Id: i
            Id: j
          Assign:
            Id: i
            Op: +
              Id: i
              Const: 1
          Assign:
            Id: j
            Op: -
              Id: j
              Const: 1
      CALL: quicksort
        Id: array
          CALL: (null)
        Const: 0
        Const: 99
      Assign:
        Id: i
        Const: 0
      While:
        Op: <
          Id: i
          Const: 100
        Compound Block
          Output:
            Id: array
              Id: i
          Assign:
            Id: i
            Op: +
              Id: i
              Const: 1