Change translator output format
This commit is contained in:
parent
6262faf28a
commit
ca2c128e67
|
@ -0,0 +1,3 @@
|
||||||
|
*.h linguist-language=C
|
||||||
|
*.c linguist-language=C
|
||||||
|
Makefile -linguist-detectable
|
|
@ -1 +1,2 @@
|
||||||
vmtranslator
|
vmtranslator
|
||||||
|
tags
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,6 +1,6 @@
|
||||||
FILES = parser.c main.c translator.c util.c
|
FILES = parser.c main.c translator.c util.c
|
||||||
INCLUDES = -I.
|
INCLUDES = -I.
|
||||||
CFLAGS = -std=c99 -g
|
CFLAGS = -std=c99
|
||||||
OUTFILE = vmtranslator
|
OUTFILE = vmtranslator
|
||||||
|
|
||||||
main: ${FILES}
|
main: ${FILES}
|
||||||
|
|
2
main.c
2
main.c
|
@ -246,7 +246,7 @@ int main(int argc, char* argv[]) {
|
||||||
translate(t);
|
translate(t);
|
||||||
freeparser(p);
|
freeparser(p);
|
||||||
|
|
||||||
printasmlns(t, output);
|
printlns(t->output, output);
|
||||||
|
|
||||||
// freeing rest
|
// freeing rest
|
||||||
freetranslator(t);
|
freetranslator(t);
|
||||||
|
|
4
parser.c
4
parser.c
|
@ -5,7 +5,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
|
||||||
void freelns(LINEARRAY* lns) {
|
void freelnarray(LINEARRAY* lns) {
|
||||||
for(int i = 0; i < lns->count; i++) {
|
for(int i = 0; i < lns->count; i++) {
|
||||||
int tkcount = lns->lns[i]->tokenscount;
|
int tkcount = lns->lns[i]->tokenscount;
|
||||||
for(int j = 0; j < tkcount; j++) {
|
for(int j = 0; j < tkcount; j++) {
|
||||||
|
@ -19,7 +19,7 @@ void freelns(LINEARRAY* lns) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void freeparser(PARSER* p) {
|
void freeparser(PARSER* p) {
|
||||||
freelns(p->lns);
|
freelnarray(p->lns);
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
29
translator.c
29
translator.c
|
@ -26,15 +26,11 @@ void freetoclean(TRANSLATOR* t) {
|
||||||
void freetranslator(TRANSLATOR* t) {
|
void freetranslator(TRANSLATOR* t) {
|
||||||
free(t->asmlns->items);
|
free(t->asmlns->items);
|
||||||
free(t->asmlns);
|
free(t->asmlns);
|
||||||
|
freelns(t->output);
|
||||||
freetoclean(t);
|
freetoclean(t);
|
||||||
free(t);
|
free(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
void printasmlns(TRANSLATOR* t, FILE* stream) {
|
|
||||||
for(int i = 0; i < t->asmlns->count; i++)
|
|
||||||
fprintf(stream, "%s\n", t->asmlns->items[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* heapstrtoclean(TRANSLATOR* t, const char* input) {
|
char* heapstrtoclean(TRANSLATOR* t, const char* input) {
|
||||||
char* newstr = heapstr(input, strlen(input));
|
char* newstr = heapstr(input, strlen(input));
|
||||||
pushtoclean(t, newstr);
|
pushtoclean(t, newstr);
|
||||||
|
@ -257,13 +253,21 @@ void checkfun(TRANSLATOR* t, LINE* ln) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pushln(TRANSLATOR* t, char* content) {
|
||||||
|
t->curln->content = content;
|
||||||
|
t->curln->truen = t->lncount;
|
||||||
|
LINELIST* nextln = (LINELIST*)malloc(sizeof(LINELIST));
|
||||||
|
t->curln->next = nextln;
|
||||||
|
t->lastln = t->curln;
|
||||||
|
t->curln = nextln;
|
||||||
|
t->lncount++;
|
||||||
|
}
|
||||||
|
|
||||||
void addasm(TRANSLATOR* t, TEMPLATE* tp) {
|
void addasm(TRANSLATOR* t, TEMPLATE* tp) {
|
||||||
checkasmsize(t, tp->count);
|
checkasmsize(t, tp->count);
|
||||||
|
|
||||||
for(int i = 0; i < tp->count; i++) {
|
for(int i = 0; i < tp->count; i++)
|
||||||
t->asmlns->items[t->asmlns->count] = tp->items[i];
|
pushln(t, tp->items[i]);
|
||||||
t->asmlns->count++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void addasmlns(TRANSLATOR* t, LINE* ln, TEMPLATE* tp) {
|
void addasmlns(TRANSLATOR* t, LINE* ln, TEMPLATE* tp) {
|
||||||
|
@ -577,6 +581,8 @@ void translate(TRANSLATOR* t) {
|
||||||
fprintf(stderr, "Expected return before end of file; file %s.vm, line %i\n", t->fname, t->lns->count-1);
|
fprintf(stderr, "Expected return before end of file; file %s.vm, line %i\n", t->fname, t->lns->count-1);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
t->lastln->next = NULL;
|
||||||
|
free(t->curln);
|
||||||
}
|
}
|
||||||
|
|
||||||
TRANSLATOR* mktranslator(LINEARRAY* lns, char* fname) {
|
TRANSLATOR* mktranslator(LINEARRAY* lns, char* fname) {
|
||||||
|
@ -592,6 +598,11 @@ TRANSLATOR* mktranslator(LINEARRAY* lns, char* fname) {
|
||||||
t->toclean->size = sizeof(char*)*(lns->count * 5);
|
t->toclean->size = sizeof(char*)*(lns->count * 5);
|
||||||
t->toclean->items = (char**)malloc(t->toclean->size);
|
t->toclean->items = (char**)malloc(t->toclean->size);
|
||||||
|
|
||||||
|
LINELIST* newln = (LINELIST*)malloc(sizeof(LINELIST));
|
||||||
|
t->output = newln;
|
||||||
|
t->curln = newln;
|
||||||
|
t->lncount = 0;
|
||||||
|
|
||||||
t->funcount = 0;
|
t->funcount = 0;
|
||||||
t->retind = 0;
|
t->retind = 0;
|
||||||
t->cmpind = 0;
|
t->cmpind = 0;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define TRANSLATOR_H
|
#define TRANSLATOR_H
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char** items;
|
char** items;
|
||||||
|
@ -21,10 +22,14 @@ typedef struct {
|
||||||
int retind;
|
int retind;
|
||||||
int cmpind;
|
int cmpind;
|
||||||
bool returned;
|
bool returned;
|
||||||
|
|
||||||
|
LINELIST* output;
|
||||||
|
LINELIST* curln;
|
||||||
|
LINELIST* lastln;
|
||||||
|
int lncount;
|
||||||
} TRANSLATOR;
|
} TRANSLATOR;
|
||||||
|
|
||||||
void freetranslator(TRANSLATOR* t);
|
void freetranslator(TRANSLATOR* t);
|
||||||
void printasmlns(TRANSLATOR* t, FILE* stream);
|
|
||||||
void translate(TRANSLATOR* t);
|
void translate(TRANSLATOR* t);
|
||||||
TRANSLATOR* mktranslator(LINEARRAY* lns, char* fname);
|
TRANSLATOR* mktranslator(LINEARRAY* lns, char* fname);
|
||||||
#endif
|
#endif
|
||||||
|
|
15
util.c
15
util.c
|
@ -22,3 +22,18 @@ int countplaces(int n) {
|
||||||
}
|
}
|
||||||
return places;
|
return places;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printlns(LINELIST* lns, FILE* stream) {
|
||||||
|
LINELIST* curln = lns;
|
||||||
|
while(curln != NULL) {
|
||||||
|
fprintf(stream, "%s\n", curln->content);
|
||||||
|
curln = curln->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void freelns(LINELIST* lns) {
|
||||||
|
LINELIST* next = lns->next;
|
||||||
|
free(lns);
|
||||||
|
if(next != NULL)
|
||||||
|
freelns(next);
|
||||||
|
}
|
||||||
|
|
15
util.h
15
util.h
|
@ -1,2 +1,17 @@
|
||||||
|
#ifndef UTIL_H
|
||||||
|
#define UTIL_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
char* heapstr(const char* str, int len);
|
char* heapstr(const char* str, int len);
|
||||||
int countplaces(int n);
|
int countplaces(int n);
|
||||||
|
|
||||||
|
typedef struct lnls {
|
||||||
|
char* content;
|
||||||
|
int truen;
|
||||||
|
struct lnls* next;
|
||||||
|
} LINELIST;
|
||||||
|
|
||||||
|
void printlns(LINELIST* lns, FILE* stream);
|
||||||
|
void freelns(LINELIST* lns);
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue