0% found this document useful (0 votes)
115 views4 pages

Untitled

This document defines data structures and functions for compiling a simple programming language to x86-64 assembly code. It defines structs for symbol tables and parse trees, as well as functions for looking up symbols, constructing nodes, traversing the tree to emit assembly code, and the main function.

Uploaded by

api-287983786
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
115 views4 pages

Untitled

This document defines data structures and functions for compiling a simple programming language to x86-64 assembly code. It defines structs for symbol tables and parse trees, as well as functions for looking up symbols, constructing nodes, traversing the tree to emit assembly code, and the main function.

Uploaded by

api-287983786
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 4

struct stab{

int val;
char name[20];
} stab[100];
int stabuse = 0;
struct node{
int type, left, right, work;
} ntab[400];
int ntabuse=1;
#define T_STLIST 1
#define T_ASSIGN 2
#define T_READ 3
#define T_PRINT 4
#define T_ADD 5
#define T_SUB 6
#define T_MUL 7
#define T_DIV 8
#define T_REM 9
#define T_NUM 10
#define T_VAR 11
#define T_WHILE 12
#define T_IF 13
#define T_LT 14
#define T_GT 15
#define T_DO 16
#define T_AND 17;
int lookup(char*);
int node(int, int, int);
void dotree(int);
extern char *yytext;
#include "y.tab.c"
#include "lex.yy.c"
int main(){
yyparse();
return 0;
}
int lookup(s)
char *s; {
int i;
for(i=0; i<stabuse; ++i)
if(strcmp(stab[i].name, s)==0) return i;
strcpy(stab[stabuse].name, s); return stabuse++;
}
int node(t, l, r)
int t, l, r; {
int i =ntabuse++;
ntab[i].type=t; ntab[i].left=l; ntab[i].right = r;
return i;
}
void dotree(i)
int i;
{
int stk;

printf("
.section .rodata\n");
printf(".Lprompt: .string \"%s> \"\n", stab[0].name);
printf(".Lread: .string \"%%ld\"\n");
printf(".Lprint: .string \"%%ld\\n\"\n");
printf("
.text\n");
printf(".global main\n");
printf("main:\n");
printf("
pushq %%rbp\n");
printf("
movq %%rsp,%%rbp\n");
stk = (8*stabuse + 15)/ 16;
stk *= 16;
printf("
subq $%d,%%rsp\n", stk);
emittree(i);
printf("
leave\n");
printf("
ret\n");
}
emittree(i)
int i;
{
static int labelno =1;
int l;
switch(ntab[i].type){
case T_STLIST: if(ntab[i].left) emittree(ntab[i].left);
emittree(ntab[i].right);
break;
case T_READ: printf(" movq $.Lprompt,%%rdi\n");
printf(" movq $0,%%rax\n");
printf(" call printf\n");
printf(" leaq %d(%%rbp),%%rsi\n", -(ntab[i].left+1)*8);
printf(" movq $.Lread,%%rdi\n");
printf(" movq $0,%%rax\n");
printf(" call scanf\n");
break;
case T_PRINT: emittree(ntab[i].left);
printf(" popq %%rsi\n");
printf(" movq $.Lprint,%%rdi\n");
printf(" movq $0,%%rax\n");
printf(" call printf\n");
break;
case T_NUM: printf(" pushq $%d\n", ntab[i].left);
break;
case T_VAR: printf(" pushq %d(%%rbp)\n", -(ntab[i].left+1)*8);
break;
case T_ASSIGN: emittree(ntab[i].right);
printf(" popq %d(%%rbp)\n", -(ntab[i].left+1)*8);
break;
case T_ADD: emittree(ntab[i].left);
emittree(ntab[i].right);
printf(" popq %%rdx\n");
printf(" popq %%rax\n");
printf(" addq %%rdx,%%rax\n");
printf(" pushq %%rax\n");
break;
case T_SUB: emittree(ntab[i].left);
emittree(ntab[i].right);
printf(" popq %%rdx\n");
printf(" popq %%rax\n");
printf(" subq %%rdx,%%rax\n");
printf(" pushq %%rax\n");

break;
case T_MUL: emittree(ntab[i].left);
emittree(ntab[i].right);
printf(" popq %%rdx\n");
printf(" popq %%rax\n");
printf(" imulq %%rdx\n");
printf(" pushq %%rax\n");
break;
case T_DIV: emittree(ntab[i].left);
emittree(ntab[i].right);
printf(" cqto \n");
printf(" popq %%rdx\n");
printf(" popq %%rax\n");
printf(" idivq %%rdx\n");
printf(" pushq %%rax\n");
break;
case T_REM:emittree(ntab[i].left);
emittree(ntab[i].right);
printf(" cqto\n");
printf(" popq %%rdx\n");
printf(" popq %%rax\n");
printf(" idivq %%rdx\n");
printf(" pushq %%rdx\n");
break;
case T_LT: emittree(ntab[i].left);
emittree(ntab[i].right);
printf(" popq %%rcx\n");
printf(" popq %%rax\n");
printf(" cmp %%rcx,%%rax\n");
printf(" jge ");
break;
case T_GT: emittree(ntab[i].left);
emittree(ntab[i].right);
printf(" popq %%rcx\n");
printf(" popq %%rax\n");
printf(" cmp %%rcx,%%rax\n");
printf(" jle ");
break;
case T_IF: l=labelno++;
emittree(ntab[i].left);
printf(".L%d\n", l);
emittree(ntab[i].right);
printf(".L%d:\n", l);
break;
case T_WHILE:l=labelno++;
emittree(ntab[i].left);
printf(".L%d\n", l);
printf("LOOP%d:\n", l+1);
emittree(ntab[i].right);
emittree(ntab[i].left);
printf(".L%d\n", l);
printf("loop LOOP%d;\n", l+1);
printf(".L%d:\n", l);
break;
case T_DO: l=labelno++;
printf("LOOP%d:\n", l+1);
emittree(ntab[i].right);
emittree(ntab[i].left);
printf(".L%d\n", l);
printf("loop LOOP%d;\n", l+1);

printf(".L%d:\n", l);
break;
default:
break;
}
}

printf("NotImplemented: %d\n", ntab[i].type);

You might also like