%%t %%ss %%dmp -- dump the symbol table - empty at first beta := 2; %%dmp alfa := beta *3; %%dmp -- symtab has 2 variable names now writeln ("hi ", beta + 10 * alfa , beta);
in simple.c grammar: stmtlist -> lambda Symbol table dump: SymRoot is NULL => symbol table is empty Token : Id grammar: identifier->Id After : PushId Semstack is: IdEntry (beta) <+ SemTop StLstEntry grammar: memref -> identifier After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry Token : Assignop Token : Iconst grammar: integer_const-> Iconst After : PushInt Semstack is: IconstEntry <+ SemTop AddrEntry StLstEntry grammar: primary -> integer_const After : IconstReduce Semstack is: ExprEntry <+ SemTop AddrEntry StLstEntry grammar: fact -> primary grammar: term -> fact Token : Termsym grammar: expr -> term grammar: assignstmt->memeref Assignop expr After : Assign Semstack is: StmtEntry <+ SemTop StLstEntry grammar: stmt -> assignstmt Termsym grammar: stmtlist -> stmtlist stmt After : MergeStmts Semstack is: StLstEntry <+ SemTop Symbol table dump: beta Token : Id grammar: identifier->Id After : PushId Semstack is: IdEntry (alfa) <+ SemTop StLstEntry grammar: memref -> identifier After : IdToAddr Semstack is: AddrEntry <+ SemTop StLstEntry Token : Assignop Token : Id grammar: identifier->Id After : PushId Semstack is: IdEntry (beta) <+ SemTop AddrEntry StLstEntry grammar: memref -> identifier After : IdToAddr Semstack is: AddrEntry <+ SemTop AddrEntry StLstEntry grammar: primary -> memref After : AddrToPrimary Semstack is: ExprEntry <+ SemTop AddrEntry StLstEntry grammar: fact -> primary grammar: term -> fact Token : Mpysym grammar: multop -> Mpysym After : Operator Semstack is: OperEntry <+ SemTop ExprEntry AddrEntry StLstEntry Token : Iconst grammar: integer_const-> Iconst After : PushInt Semstack is: IconstEntry <+ SemTop OperEntry ExprEntry AddrEntry StLstEntry grammar: primary -> integer_const After : IconstReduce Semstack is: ExprEntry <+ SemTop OperEntry ExprEntry AddrEntry StLstEntry grammar: fact -> primary grammar: term -> term multop fact After : DoArithOp Semstack is: ExprEntry <+ SemTop AddrEntry StLstEntry Token : Termsym grammar: expr -> term grammar: assignstmt->memeref Assignop expr After : Assign Semstack is: StmtEntry <+ SemTop StLstEntry grammar: stmt -> assignstmt Termsym grammar: stmtlist -> stmtlist stmt After : MergeStmts Semstack is: StLstEntry <+ SemTop Symbol table dump: alfa beta Token : Writeln Token : Lparen Token : StrConst grammar: actparam -> StrConst After : PushString Semstack is: StrEntry (hi ) <+ SemTop StLstEntry After : CreateActParam Semstack is: ParmEntry <+ SemTop StLstEntry grammar: actparamlist->actparam Token : Commasym Token : Id grammar: identifier->Id After : PushId Semstack is: IdEntry (beta) <+ SemTop ParmEntry StLstEntry grammar: memref -> identifier After : IdToAddr Semstack is: AddrEntry <+ SemTop ParmEntry StLstEntry grammar: primary -> memref After : AddrToPrimary Semstack is: ExprEntry <+ SemTop ParmEntry StLstEntry grammar: fact -> primary grammar: term -> fact Token : Plussym grammar: expr -> term grammar: addop -> Plussym After : Operator Semstack is: OperEntry <+ SemTop ExprEntry ParmEntry StLstEntry Token : Iconst grammar: integer_const-> Iconst After : PushInt Semstack is: IconstEntry <+ SemTop OperEntry ExprEntry ParmEntry StLstEntry grammar: primary -> integer_const After : IconstReduce Semstack is: ExprEntry <+ SemTop OperEntry ExprEntry ParmEntry StLstEntry grammar: fact -> primary grammar: term -> fact Token : Mpysym grammar: multop -> Mpysym After : Operator Semstack is: OperEntry <+ SemTop ExprEntry OperEntry ExprEntry ParmEntry StLstEntry Token : Id grammar: identifier->Id After : PushId Semstack is: IdEntry (alfa) <+ SemTop OperEntry ExprEntry OperEntry ExprEntry ParmEntry StLstEntry grammar: memref -> identifier After : IdToAddr Semstack is: AddrEntry <+ SemTop OperEntry ExprEntry OperEntry ExprEntry ParmEntry StLstEntry grammar: primary -> memref After : AddrToPrimary Semstack is: ExprEntry <+ SemTop OperEntry ExprEntry OperEntry ExprEntry ParmEntry StLstEntry grammar: fact -> primary grammar: term -> term multop fact After : DoArithOp Semstack is: ExprEntry <+ SemTop OperEntry ExprEntry ParmEntry StLstEntry Token : Commasym grammar: expr -> expr addop term After : DoArithOp Semstack is: ExprEntry <+ SemTop ParmEntry StLstEntry grammar: actparam -> expr After : CreateActParam Semstack is: ParmEntry <+ SemTop ParmEntry StLstEntry grammar: actparamlist->actparamlist Commasym actparam After : MergeActParam Semstack is: ParmEntry <+ SemTop StLstEntry Token : Id grammar: identifier->Id After : PushId Semstack is: IdEntry (beta) <+ SemTop ParmEntry StLstEntry grammar: memref -> identifier After : IdToAddr Semstack is: AddrEntry <+ SemTop ParmEntry StLstEntry grammar: primary -> memref After : AddrToPrimary Semstack is: ExprEntry <+ SemTop ParmEntry StLstEntry grammar: fact -> primary grammar: term -> fact Token : Rparen grammar: expr -> term grammar: actparam -> expr After : CreateActParam Semstack is: ParmEntry <+ SemTop ParmEntry StLstEntry grammar: actparamlist->actparamlist Commasym actparam After : MergeActParam Semstack is: ParmEntry <+ SemTop StLstEntry grammar: writestmt-> Writeln Lparen actparamlist Rparen After : Call Semstack is: StmtEntry <+ SemTop StLstEntry Token : Termsym grammar: stmt -> writestmt Termsym grammar: stmtlist -> stmtlist stmt After : MergeStmts Semstack is: StLstEntry <+ SemTop grammar: program -> stmtlist After : Done Semstack is: EMPTY
Intermediate Representation (AST)
Intermediate Representation - the Abstract Syntax Tree Statements Assign beta gets Immediate Value 2 Assign alfa gets beta multiply Immediate Value 3 Writeln parameters hi beta add Immediate Value 10 multiply alfa beta 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
Generated SPIM code
# Register Usage: # $s0 for global variables # .text .globl main main: la $t9, CONST la $s0, GVARS # # Start Code # # Generate Assignment Statement li $t0,2 sw $t0,4($s0) # # Generate Assignment Statement lw $t0,4($s0) mul $t0,$t0,3 sw $t0,0($s0) # # Generate Writeln statement la $a0, S1 li $v0, 4 syscall lw $t0,0($s0) mul $t0,$t0,10 lw $t1,4($s0) add $t0,$t0,$t1 li $v0, 1 move $a0,$t0 syscall li $v0, 1 lw $a0,4($s0) syscall la $a0, S0 li $v0, 4 syscall # # 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 "hi " # # Reserve space for global variables .word 0 GVARS: # space for Global Variables .data _alfa: .word 0 # Offset at 0 .data _beta: .word 0 # Offset at 4 .data Temp_Wr: .word 0 #just for alignment of write(exprtree)
Execute with 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 hi 622