Running on SDSU/Rohan/Spring 2003 Wed Mar 26 11:31:54 PST 2003 The input code: %%t %%ss package iftest1 is body x: integer; begin writeln("enter 2-then 3-elsif other-else lists"); readln(x); if x = 2 then writeln("then list"); elsif x=3 then writeln("elsif list"); elsif x=4 then writeln("second elsif"); elsif x=5 then writeln("third elsif"); else writeln("else list"); end if; end; -------------------------------------- Running SIMPLE with command line -i (AST) -s (SymbolTable dump) -v (var addrs) in simple.c Token : Package Token : Id Token : Is Token : Body Token : Id After : PushId Semstack is: IdEntry (x) <+ SemTop After : CreateIdList Semstack is: IdListEntry <+ SemTop Token : Colonsym Token : Id After : PushId Semstack is: IdEntry (integer) <+ SemTop IdListEntry After : MakeTypeEntry Semstack is: TypeEntry <+ SemTop IdListEntry Token : Termsym After : EnterIdList Semstack is: EMPTY Token : Begin After : NullList Semstack is: StLstEntry <+ SemTop Token : Writeln Token : Lparen Token : StrConst After : PushString Semstack is: StrEntry (enter 2-then 3-elsif other-else lists) <+ 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 : Readln Token : Lparen Token : Id After : PushId Semstack is: IdEntry (x) <+ SemTop StLstEntry After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry After : CreateMemParam Semstack is: ParmEntry <+ SemTop StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop Token : If Token : Id After : PushId Semstack is: IdEntry (x) <+ 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: StrEntry (then list) <+ 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 Token : Id After : PushId Semstack is: IdEntry (x) <+ 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: StrEntry (elsif list) <+ 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 : Elsif After : MakeElsIf Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry StLstEntry After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : Id After : PushId Semstack is: IdEntry (x) <+ 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: StrEntry (second elsif) <+ 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 : Elsif After : MakeElsIf Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry StLstEntry After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : Id After : PushId Semstack is: IdEntry (x) <+ 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: StrEntry (third elsif) <+ 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 : MakeElsIf Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry StLstEntry After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry After : NullList Semstack is: StLstEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : Writeln Token : Lparen Token : StrConst After : PushString Semstack is: StrEntry (else list) <+ SemTop StLstEntry StLstEntry BexprEntry StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry StLstEntry BexprEntry StLstEntry Token : Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry StLstEntry BexprEntry StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop StLstEntry BexprEntry StLstEntry Token : End After : MakeElse Semstack is: StmtEntry <+ SemTop StLstEntry BexprEntry StLstEntry After : MergeStmts Semstack is: StLstEntry <+ SemTop BexprEntry StLstEntry Token : If After : MakeIf Semstack is: StmtEntry <+ SemTop StLstEntry Token : Termsym After : MergeStmts Semstack is: StLstEntry <+ SemTop Token : End Token : Termsym After : Done Semstack is: EMPTY Symbol table dump: x type: integer init: 1 used: 1 Intermediate Representation - the Abstract Syntax Tree Statements Writeln parameters enter 2-then 3-elsif other-else lists Readln parameters x If x equal Immediate Value 2 Then Writeln parameters then list ElsIf x equal Immediate Value 3 Then Writeln parameters elsif list ElsIf x equal Immediate Value 4 Then Writeln parameters second elsif ElsIf x equal Immediate Value 5 Then Writeln parameters third elsif Else Writeln parameters else list End If From codegen.c - DisplayRegs() marks used registers Register: 0 1 2 3 4 5 6 7 8 9 - - - - - - - - - - Used = x: Variable dump from GenStorage ID: x Offset: 0 Proc. Level: 0 COMPILATION COMPLETE out simple.c ------------------------------------- The listing file produced by simple %%t %%ss package iftest1 is body x: integer; begin writeln("enter 2-then 3-elsif other-else lists"); readln(x); if x = 2 then writeln("then list"); elsif x=3 then writeln("elsif list"); elsif x=4 then writeln("second elsif"); elsif x=5 then writeln("third elsif"); else writeln("else list"); end if; end; ------------------------------------- The assembler file produced by simple # Register Usage: # $s0 for global variables # .text .globl main main: la $s0, GVARS # # Start Code # # Generate Writeln statement la $a0, S6 li $v0, 4 syscall la $a0, S0 li $v0, 4 syscall # # Generate Readln statement li $v0, 5 syscall sw $v0,0($s0) # # Generate If-Then statement lw $t0,0($s0) seq $t0,$t0,2 beq $t0, 0,LBL_0 # # Generate Writeln statement la $a0, S5 li $v0, 4 syscall la $a0, S0 li $v0, 4 syscall j EXIT_0 LBL_0: # # Generate ElsIf statement lw $t0,0($s0) seq $t0,$t0,3 beq $t0, 0,LBL_1 # # Generate Writeln statement la $a0, S4 li $v0, 4 syscall la $a0, S0 li $v0, 4 syscall j EXIT_0 LBL_1: # # Generate ElsIf statement lw $t0,0($s0) seq $t0,$t0,4 beq $t0, 0,LBL_2 # # Generate Writeln statement la $a0, S3 li $v0, 4 syscall la $a0, S0 li $v0, 4 syscall j EXIT_0 LBL_2: # # Generate ElsIf statement lw $t0,0($s0) seq $t0,$t0,5 beq $t0, 0,LBL_3 # # Generate Writeln statement la $a0, S2 li $v0, 4 syscall la $a0, S0 li $v0, 4 syscall j EXIT_0 LBL_3: # # Generate Else statement # # Generate Writeln statement la $a0, S1 li $v0, 4 syscall la $a0, S0 li $v0, 4 syscall # EXIT_0: # # End If # # 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 "else list" .data S2: .asciiz "third elsif" .data S3: .asciiz "second elsif" .data S4: .asciiz "elsif list" .data S5: .asciiz "then list" .data S6: .asciiz "enter 2-then 3-elsif other-else lists" # # Reserve space for global variables .word 0 GVARS: # space for Global Variables .data _x: .word 0 # Offset at 0 .data Temp_Wr: .word 0 #just for alignment of write(exprtree) ------------------------------------- execute the code in spim: SPIM Version 6.2 of January 11, 1999 Copyright 1990-1998 by James R. Larus (larus@cs.wisc.edu). All Rights Reserved. See the file README for a full copyright notice. Loaded: /opt/spim/bin/trap.handler enter 2-then 3-elsif other-else lists then list