import core.stdc.stdio; import core.stdc.string; import core.stdc.stdlib; import elna.lexer; import elna.parser; import elna.generator; import elna.ir; import elna.extended; import std.sumtype; import std.typecons; import tanya.container.array; import tanya.container.string; import tanya.memory.allocator; import tanya.memory.mmappool; import tanya.os.error; private Nullable!String readSource(string source) @nogc { enum size_t bufferSize = 255; auto sourceFilename = String(source); return readFile(sourceFilename).match!( (ErrorCode errorCode) { perror(sourceFilename.toStringz); return Nullable!String(); }, (Array!ubyte contents) => nullable(String(cast(char[]) contents.get)) ); } int main(string[] args) { defaultAllocator = MmapPool.instance; if (args.length < 2) { return 4; } auto sourceText = readSource(args[1]); if (sourceText.isNull) { return 3; } auto tokens = lex(sourceText.get.get); if (tokens.length == 0) { printf("Lexical analysis failed.\n"); return 1; } auto ast = parse(tokens); if (!ast.valid) { auto compileError = ast.error.get; printf("%lu:%lu: %s\n", compileError.line, compileError.column, compileError.message.ptr); return 2; } auto ir = transform(ast.result); String outputFilename = String("build/"); outputFilename.insertBack(args[1][0 .. $ - 4]); outputFilename.insertBack("o"); writeObject(ir, outputFilename); auto code = generate(ir); printf("%s", code.toStringz()); return 0; }