%%ss %%t -- testing comments... Package test_loop Is Body i, j:integer; %%dmp Begin i := 0; loop writeln("simple loop, i=", i); i := i + 1; exit when i=3; end loop; writeln(""); i := 0; myName1: loop writeln("loop with name exit with loopname and when condition, i=", i); i := i + 1; exit myName1 when i=3; end loop; End; --------------------------------- in simple.c Token : Package Token : Id Token : Is Token : Body Token : Id After : PushId Semstack is: IdEntry (i) <+ SemTop After : CreateIdList Semstack is: IdListEntry <+ SemTop Token : Commasym Token : Id After : PushId Semstack is: IdEntry (j) <+ SemTop IdListEntry After : MergeIdList 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: i type: integer is used: 0 is initialized: 0 variable name: integer type: integer is used: 0 is initialized: 0 (This is a datatype entry.) variable name: j type: integer is used: 0 is initialized: 0 Token : Begin After : NullList Semstack is: StLstEntry <+ SemTop Token : Id After : PushId Semstack is: IdEntry (i) <+ 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 : Loop After : Nullname Semstack is: NameEntry (NULL) <+ SemTop StLstEntry After : Nullexpr Semstack is: BexprEntry <+ SemTop NameEntry (NULL) StLstEntry After : openloop Semstack is: BexprEntry <+ SemTop NameEntry (NULL) StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop BexprEntry NameEntry (NULL) StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (simple loop, i=) <+ SemTop StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Commasym Token : Id After : PushId Semstack is: IdEntry (i) <+ SemTop ParmEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop ParmEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop ParmEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Rparen After : CreateActParam Semstack is: ParmEntry <+ SemTop ParmEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : MergeActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : Call Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry NameEntry (NULL) StLstEntry Token : Id After : PushId Semstack is: IdEntry (i) <+ SemTop StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Assignop After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Id After : PushId Semstack is: IdEntry (i) <+ SemTop AddrEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop AddrEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop AddrEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Plussym After : Operator Semstack is: OperEntry <+ SemTop ExprEntry AddrEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop OperEntry ExprEntry AddrEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop OperEntry ExprEntry AddrEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Termsym After : DoArithOp Semstack is: ExprEntry <+ SemTop AddrEntry StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : Assign Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry NameEntry (NULL) StLstEntry Token : Exit Token : When After : Nullid Semstack is: IdEntry (NULL) <+ SemTop StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Id After : PushId Semstack is: IdEntry (i) <+ SemTop IdEntry (NULL) StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop IdEntry (NULL) StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop IdEntry (NULL) StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Eqop Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop ExprEntry IdEntry (NULL) StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop ExprEntry IdEntry (NULL) StLstEntry BexprEntry NameEntry (NULL) StLstEntry Token : Termsym After : IfTest Semstack is: BexprEntry <+ SemTop IdEntry (NULL) StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : MakeExit Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry NameEntry (NULL) StLstEntry After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry NameEntry (NULL) StLstEntry Token : End Token : Loop After : closeloop Semstack is: StLstEntry <+ SemTop BexprEntry NameEntry (NULL) StLstEntry After : MakeLoop Semstack is: StmtEntry <+ SemTop StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry () <+ SemTop StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop Token : Id After : PushId Semstack is: IdEntry (i) <+ 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 : Id After : PushId Semstack is: IdEntry (myName1) <+ SemTop StLstEntry Token : Colonsym After : insertloopname Semstack is: NameEntry (myName1) <+ SemTop StLstEntry Token : Loop After : Nullexpr Semstack is: BexprEntry <+ SemTop NameEntry (myName1) StLstEntry After : openloop Semstack is: BexprEntry <+ SemTop NameEntry (myName1) StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop BexprEntry NameEntry (myName1) StLstEntry Token : Writeln Token : Lparen Token : Strconst After : PushString Semstack is: StrconstEntry (loop with name exit with loopname and when condition, i=) <+ SemTop StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : Commasym Token : Id After : PushId Semstack is: IdEntry (i) <+ SemTop ParmEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop ParmEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop ParmEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : Rparen After : CreateActParam Semstack is: ParmEntry <+ SemTop ParmEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : MergeActParam Semstack is: ParmEntry <+ SemTop StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : Call Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry NameEntry (myName1) StLstEntry Token : Id After : PushId Semstack is: IdEntry (i) <+ SemTop StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : Assignop After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : Id After : PushId Semstack is: IdEntry (i) <+ SemTop AddrEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop AddrEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop AddrEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : Plussym After : Operator Semstack is: OperEntry <+ SemTop ExprEntry AddrEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop OperEntry ExprEntry AddrEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop OperEntry ExprEntry AddrEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : Termsym After : DoArithOp Semstack is: ExprEntry <+ SemTop AddrEntry StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : Assign Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry NameEntry (myName1) StLstEntry Token : Exit Token : Id After : PushId Semstack is: IdEntry (myName1) <+ SemTop StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : When Token : Id After : PushId Semstack is: IdEntry (i) <+ SemTop IdEntry (myName1) StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop IdEntry (myName1) StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : AddrToPrimary Semstack is: ExprEntry <+ SemTop IdEntry (myName1) StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : Eqop Token : Iconst After : PushInt Semstack is: IconstEntry <+ SemTop ExprEntry IdEntry (myName1) StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : IconstReduce Semstack is: ExprEntry <+ SemTop ExprEntry IdEntry (myName1) StLstEntry BexprEntry NameEntry (myName1) StLstEntry Token : Termsym After : IfTest Semstack is: BexprEntry <+ SemTop IdEntry (myName1) StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : MakeExit Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry NameEntry (myName1) StLstEntry After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry NameEntry (myName1) StLstEntry Token : End Token : Loop After : closeloop Semstack is: StLstEntry <+ SemTop BexprEntry NameEntry (myName1) StLstEntry After : MakeLoop Semstack is: StmtEntry <+ SemTop StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop 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,0 sw $t0,0($s0) # # Generate Loop statement for LOOP_0: # # Generate Writeln statement la $a0, S1 li $v0, 4 syscall # from GenString() li $v0, 1 lw $a0,0($s0) syscall la $a0, S0 li $v0, 4 syscall # # Generate Assignment Statement lw $t0,0($s0) add $t0,$t0,1 sw $t0,0($s0) # # Generate Exit statement for lw $t0,0($s0) seq $t0,$t0,3 bne $t0, 0,LOOP_1 j LOOP_0 LOOP_1: # # End Loop # # Generate Writeln statement la $a0, S2 li $v0, 4 syscall # from GenString() la $a0, S0 li $v0, 4 syscall # # Generate Assignment Statement li $t0,0 sw $t0,0($s0) # # Generate Loop statement for LOOP_2: # # Generate Writeln statement la $a0, S3 li $v0, 4 syscall # from GenString() li $v0, 1 lw $a0,0($s0) syscall la $a0, S0 li $v0, 4 syscall # # Generate Assignment Statement lw $t0,0($s0) add $t0,$t0,1 sw $t0,0($s0) # # Generate Exit statement for lw $t0,0($s0) seq $t0,$t0,3 bne $t0, 0,LOOP_3 j LOOP_2 LOOP_3: # # End Loop # # 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 "simple loop, i=" .data S2: .asciiz "" .data S3: .asciiz "loop with name exit with loopname and when condition, i=" # # Reserve space for global variables .word 0 GVARS: # space for Global Variables .data _i: .word 0 # Offset at 0 .data _j: .word 0 # Offset at 4 .data _myName1: .word 0 # Offset at 8 .data Temp_Wr: .word 0 #just for alignment of write(exprtree)