summaryrefslogtreecommitdiff
path: root/cmd/hs
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/hs')
-rw-r--r--cmd/hs/.hs.ha.swpbin0 -> 12288 bytes
-rw-r--r--cmd/hs/hs.ha91
2 files changed, 91 insertions, 0 deletions
diff --git a/cmd/hs/.hs.ha.swp b/cmd/hs/.hs.ha.swp
new file mode 100644
index 0000000..7e6d875
--- /dev/null
+++ b/cmd/hs/.hs.ha.swp
Binary files differ
diff --git a/cmd/hs/hs.ha b/cmd/hs/hs.ha
new file mode 100644
index 0000000..758ad62
--- /dev/null
+++ b/cmd/hs/hs.ha
@@ -0,0 +1,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;
+//};