mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-25 22:01:33 +00:00
78 lines
2.2 KiB
R
78 lines
2.2 KiB
R
#include "Parser.h"
|
|
#include "Nil.h"
|
|
#include "Cons.h"
|
|
#include "Lambda.h"
|
|
#include "defs.h"
|
|
#include "qfile.h"
|
|
#include "string.h"
|
|
#include "builtins.h"
|
|
#include "Compiler.h"
|
|
#include "Machine.h"
|
|
#include "CompiledCode.h"
|
|
|
|
string readfile (string filename)
|
|
{
|
|
local string acc = "", res;
|
|
local QFile file = Qopen (filename, "r");
|
|
while (!Qeof (file)) {
|
|
acc += Qgetline (file);
|
|
}
|
|
Qclose (file);
|
|
res = str_new();
|
|
str_copy(res, acc);
|
|
return res;
|
|
}
|
|
|
|
int main (int argc, string *argv)
|
|
{
|
|
local Parser *parser;
|
|
local CompiledCode *code;
|
|
local Compiler *comp;
|
|
local Machine *vm;
|
|
local Lambda *lm;
|
|
local SchemeObject *stuff, *res;
|
|
local Error *err;
|
|
|
|
if (argc < 1) {
|
|
return -1;
|
|
}
|
|
|
|
//traceon();
|
|
|
|
parser = [Parser newFromSource: readfile(argv[1]) file: argv[1]];
|
|
vm = [Machine new];
|
|
[vm makeRootCell];
|
|
[parser makeRootCell];
|
|
builtin_addtomachine (vm);
|
|
while ((stuff = [parser read])) {
|
|
if ([stuff isError]) {
|
|
err = (Error *) stuff;
|
|
printf(">> %s: %i\n", [err source], [err line]);
|
|
printf(">> Error (%s): %s\n", [err type], [err message]);
|
|
return -1;
|
|
}
|
|
comp = [Compiler newWithLambda: cons ([Symbol forString: "lambda"],
|
|
cons ([Nil nil],
|
|
cons(stuff, [Nil nil])))
|
|
scope: nil];
|
|
code = (CompiledCode *) [comp compile];
|
|
if ([code isError]) {
|
|
err = (Error *) code;
|
|
printf(">> %s: %i\n", [err source], [err line]);
|
|
printf(">> Error (%s): %s\n", [err type], [err message]);
|
|
return -1;
|
|
}
|
|
lm = [Lambda newWithCode: code environment: nil];
|
|
[lm invokeOnMachine: vm];
|
|
res = [vm run];
|
|
if ([res isError]) {
|
|
err = (Error *) res;
|
|
printf(">> %s: %i\n", [err source], [err line]);
|
|
printf(">> Error (%s): %s\n", [err type], [err message]);
|
|
return -1;
|
|
}
|
|
[vm reset];
|
|
}
|
|
[SchemeObject finishCollecting];
|
|
return 0;
|
|
}
|