CS3723 Programming Languages, Spring 2014
Answers to Recitation 3

1. Translation of $ id + id * id ^ id $ to intermediate code, where the 4 id's are tagged with a, b, c, and d.

Grammar with semantic actions:

 P  −−>  E
 E  −−>  E + T    output("+");
 E  −−>  E - T    output("-");
 E  −−>  T
 T  −−>  T * S    output("*");
 T  −−>  T / S    output("/");
 T  −−>  S
 S  −−>  F ^ S    output("^");
 S  −−>  F
 F  −−>  ( E )
 F  −−>  id       output(id.tag);
Stack
(top rt,   Curr    Rest of 
tag blw)   Symb    Input             Action                  Semantic Action
--------------------------------------------------------------------------------------------------
$           id     + id * id ^ id $  shift
$id         +      id * id ^ id $    reduce: F −−> id        output("a"); 
$F          +      id * id ^ id $    reduce: S −−> F         
$S          +      id * id ^ id $    reduce: S −−> F         
$T          +      id * id ^ id $    reduce: E −−> T         
$E          +      id * id ^ id $    shift
$E+         id     * id ^ id $       shift
$E+id       *      id ^ id $         reduce: F −−> id        output("b");    
$E+F        *      id ^ id $         reduce: S −−> F         
$E+S        *      id ^ id $         reduce: T −−> S         
$E+T        *      id ^ id $         shift
$E+T*       id     ^ id $            shift
$E+T*id     ^      id $              reduce: F −−> id        output("c");
$E+T*F      ^      id $              shift
$E+T*F^     id     $                 shift
$E+T*F^id   $      -                 reduce: F −−> id        output("d");
$E+T*F^F    $      -                 reduce: S −−> F         
$E+T*F^S    $      -                 reduce: S −−> F ^ S2    output("^");
$E+T*S      $      -                 reduce: T −−> T * S     output("*");
$E+T        $      -                 reduce: E −−> E + T     output("+");
$E          $      -                 reduce: P −−> E         
$P          $      -                 accept

Arithmetic expression: $ id + id * id ^ id $
Translation to RPN:    a b c d ^ * +


2. Translation of $ id + id * id ^ id $ to intermediate code

Grammar with Semantic Actions:

P   −−>   E        P.tag = E.tag; output("print(" + P.tag + ")");

E1  −−>   E2 + T   E1.tag = "temp" + nextint();
                   output(E1.tag + "=" E2.tag + "+" T.tag);

E1  −−>   E2 - T   E1.tag = "temp" + nextint();
                   output(E1.tag + "=" E2.tag + "-" T.tag);

E   −−>   T        E.tag = T.tag;

T1  −−>   T2 * S   T1.tag = "temp" + nextint();
                   output(T1.tag + "=" T2.tag + "*" S.tag);

T1  −−>   T2 / S   T1.tag = "temp" + nextint();
                   output(T1.tag + "=" T2.tag + "/" S.tag);

T   −−>   S        T.tag = S.tag;

S1  −−>   F ^ S2   S1.tag = "temp" + nextint();
                   output(S1.tag + "=" F.tag + "^" S2.tag);

S   −−>   F        S.tag = F.tag;

F   −−>   ( E )    F.tag = E.tag;

F   −−>   id       F.tag = id.tag;

Stack
(top rt,   Curr    Rest of 
tag blw)   Symb    Input             Action                  Semantic Action
--------------------------------------------------------------------------------------------------
$           id     + id * id ^ id $  shift

$id         +      id * id ^ id $    reduce: F −−> id        F.tag = id.tag;
 a
$F          +      id * id ^ id $    reduce: S −−> F         S.tag = F.tag;
 a
$S          +      id * id ^ id $    reduce: S −−> F         T.tag = S.tag;
 a
$T          +      id * id ^ id $    reduce: E −−> T         E.tag = T.tag;
 a
$E          +      id * id ^ id $    shift
 a
$E+         id     * id ^ id $       shift
 a
$E+id       *      id ^ id $         reduce: F −−> id        F.tag = id.tag;
 a b
$E+F        *      id ^ id $         reduce: S −−> F         S.tag = F.tag;
 a b
$E+S        *      id ^ id $         reduce: T −−> S         T.tag = S.tag;
 a b
$E+T        *      id ^ id $         shift
 a b
$E+T*       id     ^ id $            shift
 a b
$E+T*id     ^      id $              reduce: F −−> id        F.tag = id.tag;
 a b c
$E+T*F      ^      id $              shift
 a b c
$E+T*F^     id     $                 shift
 a b c
$E+T*F^id   $      -                 reduce: F −−> id        F.tag = id.tag;
 a b c d
$E+T*F^F    $      -                 reduce: S −−> F         S.tag = F.tag;
 a b c d
$E+T*F^S    $      -                 reduce: S1 −−> F ^ S2   S1.tag = "t" + nextint();
 a b c d                                                     output(S1.tag + "=" + F.tag + "^" + S2.tag);

$E+T*S      $      -                 reduce: T1 −−> T2 * S   T1.tag = "t" + nextint();
 a b t1                                                      output(T1.tag + "=" + T2.tag + "*" + S.tag);

$E+T        $      -                 reduce: E1 −−> E2 + T   E1.tag = "t" + nextint();
 a t2                                                        output(E1.tag + "=" + E2.tag + "+" + T.tag);

$E          $      -                 reduce: P −−> E         P.tag = E.tag;
 t3
$P          $      -                 accept                  output("print(" + P.tag + ")");
 t3

Intermediate code output:
t1 = c ^ d;
t2 = b * t1;
t3 = a + t2;
print(t3);

3. MIPS assembly code: (The stuff in black is the translation of the five assignments into MIPS. The code in green is added so that it will be a complete program, using our conventions.
main:   addu    $s7, $ra, $zero
        la      $s1, M

        l.d      $f2, 64($s1)
        l.d      $f4, 16($s1)
        mul.d    $f6, $f2, $f4
        s.d      $f6, 80($s1)

        l.d      $f2, 56($s1)
        l.d      $f4, 80($s1)
        mul.d    $f6, $f2, $f4
        s.d      $f6, 88($s1)

        l.d      $f2, 88($s1)
        l.d      $f4, 8($s1)
        add.d    $f6, $f2, $f4
        s.d      $f6, 96($s1)

        l.d      $f2, 80($s1)
        l.d      $f4, 96($s1)
        div.d    $f6, $f2, $f4
        s.d      $f6, 104($s1)

        l.d      $f2, 24($s1)
        l.d      $f4, 104($s1)
        add.d    $f6, $f2, $f4
        s.d      $f6, 112($s1)

# Print result + newl
        li      $v0, 3
        l.d     $f12, 112($s1)
        syscall
        li      $v0, 4
        la      $a0, NewL
        syscall
# Stuff at end ################
        addu    $ra, $s7, $zero
        jr      $ra  # ret
        .data
        .align  3
M:      .double 0.,1.,2.,3.,4.
        .double 5.,6.,7.,8.,9.
        .space  208  # a to z
NewL:   .asciiz "\n"
The output of running the MIPS program is:
3.14159292035398252 ( = 355/113),
a surprisingly close approximation to pi for such a simple program.