diff --git a/SMILEBASIC/SMILEBASIC.visualdproj b/SMILEBASIC/SMILEBASIC.visualdproj index 8dffa98..a36e6c6 100644 --- a/SMILEBASIC/SMILEBASIC.visualdproj +++ b/SMILEBASIC/SMILEBASIC.visualdproj @@ -205,6 +205,7 @@ *.obj;*.cmd;*.build;*.json;*.dep + diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index d462f59..3107dee 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -1,4 +1,4 @@ -module otya.smilebasic.VM; +module otya.smilebasic.vm; class VM { } diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d new file mode 100644 index 0000000..0051ac0 --- /dev/null +++ b/SMILEBASIC/compiler.d @@ -0,0 +1,25 @@ +module otya.smilebasic.compiler; +import otya.smilebasic.node; +import otya.smilebasic.vm; +import std.stdio; +class Compiler +{ + Statements statements; + this(Statements statements) + { + this.statements = statements; + } + + void compile() + { + Code[] code = new Code[0]; + foreach(Statement i ; statements.statements) + { + switch(i.type) + { + default: + stderr.writeln("Compile:NotImpl ", i.type); + } + } + } +} diff --git a/SMILEBASIC/parser.d b/SMILEBASIC/parser.d index 487211e..ab15f0e 100644 --- a/SMILEBASIC/parser.d +++ b/SMILEBASIC/parser.d @@ -2,6 +2,7 @@ module otya.smilebasic.parser; import otya.smilebasic.token; import otya.smilebasic.type; import otya.smilebasic.node; +import otya.smilebasic.compiler; import std.ascii; import std.stdio; class Lexical @@ -97,6 +98,7 @@ class Lexical if(r != TokenType.Unknown) { token = Token(r); + break; } } token = Token(TokenType.Iden, Value(iden)); @@ -260,6 +262,8 @@ class Parser } void compile() { + auto compiler = new Compiler(parseProgram()); + compiler.compile(); } Statements parseProgram() { @@ -278,7 +282,7 @@ class Parser } void syntaxError() { - stderr.writeln("Syntax error", lex.getLine()); + stderr.writeln("Syntax error (", lex.getLine(), ')'); } //statement Statement statement() @@ -322,13 +326,14 @@ class Parser print.addArgument(exp); lex.popFront(); token = lex.front(); + if(lex.empty()) break; if(token.type != TokenType.Colon && token.type != TokenType.NewLine && token.type != TokenType.Semicolon && token.type != TokenType.Comma) { syntaxError(); } } + return print; } - break; case TokenType.Colon: case TokenType.NewLine: break;