%%ss %%t Package Test_If Is Body a : integer; %%dmp Begin a := 10; if a=10 then writeln("IfThen test: a=10"); if a=99 then writeln("Nested IfThen-Else: a=99"); else writeln("Nested IfThen-ELse: a=10"); end if; end if; if a=10 then writeln("IfThen-ElseIf test: a=10"); elsif a=99 then writeln("IfThen-ElseIf test: a=99"); end if; if a=23 then writeln("IfThen-Else test: a=23"); else writeln("IfThen-Else test: a!=23"); end if; if a=232 then writeln("IfThen-ElseIf-Else test: a=232"); elsif a=10 then writeln("IfThen-ElseIf-Else test: a=10"); else writeln("IfThen-ElseIf-Else test: else case"); end if; %%dmp End; ------------------------------------------------------------- in simple.c Token : Package Token : Id Token : Is Token : Body Token : Id After : PushId Semstack is: IdEntry (a) <+ SemTop After : CreateIdList Semstack is: IdListEntry <+ SemTop Token : Colonsym Token : Id After : PushId Semstack is: IdEntry (integer) <+ SemTop IdListEntry After : MakeTypeEntry Semstack is: TypekindEntry (integer) <+ SemTop IdListEntry Token : Termsym After : EnterIdList Semstack is: EMPTY Symbol table dump: variable name: a type: integer is used: 0 is initialized: 0 variable name: integer type: integer is used: 0 is initialized: 0 (This is a datatype entry.) Token : Begin After : NullList Semstack is: StLstEntry <+ SemTop Token : Id After : PushId Semstack is: IdEntry (a) <+ SemTop StLstEntry Token : Assignop After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop AddrEntry StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop AddrEntry StLstEntry Token : Termsym After : Assign Semstack is: StmtEntry <+ SemTop StLstEntry After : MergeStmts Semstack is: StLstEntry <+ SemTop Token : If Token : Id After : PushId Semstack is: IdEntry (a) <+ SemTop StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop StLstEntry Token : Eqop Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop ExprEntry StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop ExprEntry StLstEntry Token : Then After : IfTest Semstack is: BexprEntry <+ SemTop StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (IfThen test: a=10) <+ SemTop StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : If Token : Id After : PushId Semstack is: IdEntry (a) <+ SemTop StLstEntry BexprEntry StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry BexprEntry StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Eqop Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop ExprEntry StLstEntry BexprEntry StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop ExprEntry StLstEntry BexprEntry StLstEntry Token : Then After : IfTest Semstack is: BexprEntry <+ SemTop StLstEntry BexprEntry StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry BexprEntry StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (Nested IfThen-Else: a=99) <+ SemTop StLstEntry BexprEntry StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry BexprEntry StLstEntry Token : Else After : NullElsifList Semstack is: ElsifListEntry <+ SemTop StLstEntry BexprEntry StLstEntry BexprEntry StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry BexprEntry StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (Nested IfThen-ELse: a=10) <+ SemTop StLstEntry ElsifListEntry StLstEntry BexprEntry StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry ElsifListEntry StLstEntry BexprEntry StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry ElsifListEntry StLstEntry BexprEntry StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry BexprEntry StLstEntry Token : End After : MakeElse Semstack is: ElseEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry BexprEntry StLstEntry Token : If After : MakeIf Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : End After : NullElsifList Semstack is: ElsifListEntry <+ SemTop StLstEntry BexprEntry StLstEntry After : NullElsifList Semstack is: ElseEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry Token : If After : MakeIf Semstack is: StmtEntry <+ SemTop StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop Token : If Token : Id After : PushId Semstack is: IdEntry (a) <+ SemTop StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop StLstEntry Token : Eqop Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop ExprEntry StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop ExprEntry StLstEntry Token : Then After : IfTest Semstack is: BexprEntry <+ SemTop StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (IfThen-ElseIf test: a=10) <+ SemTop StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : Elsif After : NullElsifList Semstack is: ElsifListEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Id After : PushId Semstack is: IdEntry (a) <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Eqop Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop ExprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop ExprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Then After : IfTest Semstack is: BexprEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop BexprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (IfThen-ElseIf test: a=99) <+ SemTop StLstEntry BexprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : End After : MakeElsIf Semstack is: ElsifListEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry After : MergeElsif Semstack is: ElsifListEntry <+ SemTop StLstEntry BexprEntry StLstEntry After : NullElsifList Semstack is: ElseEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry Token : If After : MakeIf Semstack is: StmtEntry <+ SemTop StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop Token : If Token : Id After : PushId Semstack is: IdEntry (a) <+ SemTop StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop StLstEntry Token : Eqop Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop ExprEntry StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop ExprEntry StLstEntry Token : Then After : IfTest Semstack is: BexprEntry <+ SemTop StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (IfThen-Else test: a=23) <+ SemTop StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : Else After : NullElsifList Semstack is: ElsifListEntry <+ SemTop StLstEntry BexprEntry StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (IfThen-Else test: a!=23) <+ SemTop StLstEntry ElsifListEntry StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry Token : End After : MakeElse Semstack is: ElseEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry Token : If After : MakeIf Semstack is: StmtEntry <+ SemTop StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop Token : If Token : Id After : PushId Semstack is: IdEntry (a) <+ SemTop StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop StLstEntry Token : Eqop Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop ExprEntry StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop ExprEntry StLstEntry Token : Then After : IfTest Semstack is: BexprEntry <+ SemTop StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (IfThen-ElseIf-Else test: a=232) <+ SemTop StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : Elsif After : NullElsifList Semstack is: ElsifListEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Id After : PushId Semstack is: IdEntry (a) <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Eqop Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop ExprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop ExprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Then After : IfTest Semstack is: BexprEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop BexprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (IfThen-ElseIf-Else test: a=10) <+ SemTop StLstEntry BexprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Else After : MakeElsIf Semstack is: ElsifListEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry After : MergeElsif Semstack is: ElsifListEntry <+ SemTop StLstEntry BexprEntry StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (IfThen-ElseIf-Else test: else case) <+ SemTop StLstEntry ElsifListEntry StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry ElsifListEntry StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry Token : End After : MakeElse Semstack is: ElseEntry <+ SemTop ElsifListEntry StLstEntry BexprEntry StLstEntry Token : If After : MakeIf Semstack is: StmtEntry <+ SemTop StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop Symbol table dump: variable name: a type: integer is used: 1 is initialized: 1 variable name: integer type: integer is used: 0 is initialized: 0 (This is a datatype entry.) Token : End Token : Termsym After : Done Semstack is: EMPTY From codegen.c - DisplayRegs() marks used registers Register: 0 1 2 3 4 5 6 7 8 9 - - - - - - - - - - Used = x: COMPILATION COMPLETE out simple.c -------------------------------------------------------------- # Register Usage: # $s0 for global variables # .text .globl main main: la $s0, GVARS # # Start Code # # Generate Assignment Statement li $t0,10 sw $t0,0($s0) # # Generate If-Then statement lw $t0,0($s0) seq $t0,$t0,10 beq $t0, 0,EXIT_0 # # Generate Writeln statement la $a0, S1 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall # # Generate If-Then statement lw $t0,0($s0) seq $t0,$t0,99 beq $t0, 0,LABEL_1 # # Generate Writeln statement la $a0, S2 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall j EXIT_1 LABEL_1: # # Generate Writeln statement la $a0, S3 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall # # End If EXIT_1: j EXIT_0 # # End If EXIT_0: # # Generate If-Then statement lw $t0,0($s0) seq $t0,$t0,10 beq $t0, 0,LABEL_3 # # Generate Writeln statement la $a0, S4 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall j EXIT_2 LABEL_3: lw $t0,0($s0) seq $t0,$t0,99 beq $t0, 0,EXIT_2 # # Generate Writeln statement la $a0, S5 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall j EXIT_2 # # End If EXIT_2: # # Generate If-Then statement lw $t0,0($s0) seq $t0,$t0,23 beq $t0, 0,LABEL_5 # # Generate Writeln statement la $a0, S6 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall j EXIT_3 LABEL_5: # # Generate Writeln statement la $a0, S7 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall # # End If EXIT_3: # # Generate If-Then statement lw $t0,0($s0) seq $t0,$t0,232 beq $t0, 0,LABEL_7 # # Generate Writeln statement la $a0, S8 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall j EXIT_4 LABEL_7: lw $t0,0($s0) seq $t0,$t0,10 beq $t0, 0,LABEL_8 # # Generate Writeln statement la $a0, S9 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall j EXIT_4 LABEL_8: # # Generate Writeln statement la $a0, S10 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall # # End If EXIT_4: # # Halt execution li $v0 10 syscall # # Finish up by writing out constants .word 0 CONST: #Constant storage area .data S0: .asciiz "\n" .data S1: .asciiz "IfThen test: a=10" .data S2: .asciiz "Nested IfThen-Else: a=99" .data S3: .asciiz "Nested IfThen-ELse: a=10" .data S4: .asciiz "IfThen-ElseIf test: a=10" .data S5: .asciiz "IfThen-ElseIf test: a=99" .data S6: .asciiz "IfThen-Else test: a=23" .data S7: .asciiz "IfThen-Else test: a!=23" .data S8: .asciiz "IfThen-ElseIf-Else test: a=232" .data S9: .asciiz "IfThen-ElseIf-Else test: a=10" .data S10: .asciiz "IfThen-ElseIf-Else test: else case" # # Reserve space for global variables .word 0 GVARS: # space for Global Variables .data _a: .word 0 # Offset at 0 .data Temp_Wr: .word 0 #just for alignment of write(exprtree)