summaryrefslogtreecommitdiff
path: root/cmd/hs/hs.ha
blob: 758ad629e92d8ab9313c43bc9651902ba94f673b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
use fmt;
use internal::parser;
use internal::interpreter;
use io;
use os;

export fn main() void = {
	let f = os::open("test.ra")!;
	defer io::close(f)!;
	let p = parser::parser {
		h = f,
		state = parser::tokentype::START,
		unreadbuf = ['0'...],
		unreadcount = 0z,
	};
	let ast = parser::parse(&p);
	let ast = match (ast) {
	case let a: parser::ast =>
		yield a;
	case let e: parser::error =>
		fmt::fatal(parser::strerror(e));
	};
	walkast(ast);
	let it = interpreter::interpreter {
		vars = [],
	};

	interpreter::interpret(&it, ast);

	let ast = parser::parse(&p);
	let ast = match (ast) {
	case let a: parser::ast =>
		yield a;
	case let e: parser::error =>
		fmt::fatal(parser::strerror(e));
	};
	interpreter::interpret(&it, ast);

	for (let var .. it.vars) {
		fmt::printfln("{}: {}", var.0, var.1)!;
	};

	//let tk = parsetoken(&p);
	//fmt::printfln("tk value: {}\ntk type: {}", tk.value, parser::strtktype(tk.tktype))!;
	//tk = parsetoken(&p);
	//fmt::printfln("tk value: {}\ntk type: {}", tk.value, parser::strtktype(tk.tktype))!;
};

fn walkast(ast: parser::ast) void = {
	match (ast.value) {
	case parser::assign =>
		fmt::println("ASSIGN")!;
	case let v: parser::varname =>
		fmt::printfln("VARNAME: {}", v)!;
	case let v: parser::operation =>
		fmt::print("OPERATION: ")!;
		for (let arg .. v.stack) {
			match (arg) {
			case let i: int =>
				fmt::printf("{} ", i)!;
			case let o: parser::operator =>
				switch (o) {
				case parser::operator::ADD =>
					fmt::print("+ ")!;
				case parser::operator::SUBTRACT =>
					fmt::print("- ")!;
				case parser::operator::MULTIPLY =>
					fmt::print("* ")!;
				case parser::operator::DIVIDE =>
					fmt::print("/ ")!;
				};
			};
		};
		fmt::println()!;
	case =>
		abort();
	};
	for (let c .. ast.children) {
		walkast(c);
	};
};

//fn parsetoken(p: *parser::parser) parser::token = {
//	let tk = match (parser::parsetoken(p)) {
//		case let tk: parser::token =>
//			yield tk;
//		case let e: parser::error =>
//			fmt::fatal(parser::strerror(e));
//	};
//	return tk;
//};