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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
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,
currentline = 1z,
end = false,
};
let it = interpreter::interpreter {
vars = [],
};
for (let ast => parser::parse(&p)) {
let ast = match (ast) {
case let a: parser::ast =>
yield a;
case let e: parser::error =>
fmt::println("poopies")!;
fmt::fatal(parser::strerror(e));
};
interpreter::interpret(&it, ast);
};
for (let var .. it.vars) {
fmt::printfln("{}: {}", var.0, var.1)!;
};
// 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 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);
//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;
//};
|