diff --git a/SourceCode/Parser/Lexer.cs b/SourceCode/Parser/Lexer.cs index ef8fe4e..78ba41c 100644 --- a/SourceCode/Parser/Lexer.cs +++ b/SourceCode/Parser/Lexer.cs @@ -187,6 +187,11 @@ private void tokenizeWord() string word = buffer.ToString(); switch (word) { + case "typedef": + { + addToken(TokenType.TYPEDEF); + break; + } case "inst": { addToken(TokenType.INST_ENUM); diff --git a/SourceCode/Parser/Parser.cs b/SourceCode/Parser/Parser.cs index d4fa6ae..782b5d4 100644 --- a/SourceCode/Parser/Parser.cs +++ b/SourceCode/Parser/Parser.cs @@ -202,6 +202,59 @@ private Statement assignmentStatement() return new AssignmentStatement(variable, expression()); } + if (current.getType() == TokenType.TYPEDEF) + { + consume(TokenType.TYPEDEF); + string type = consume(TokenType.WORD).getText(); + string variable = consume(TokenType.WORD).getText(); + consume(TokenType.EQ); + AssignmentStatement assignmentStatement = new AssignmentStatement(variable, expression(), true); + switch (type) + { + case "int": + { + assignmentStatement.value = new NumberValue(0); + break; + } + case "enum": + { + assignmentStatement.value = new EnumValue(new Dictionary()); + break; + } + case "string": + { + assignmentStatement.value = new StringValue(null); + break; + } + case "dict": + { + assignmentStatement.value = new DictionaryValue(0); + break; + } + case "stack": + { + assignmentStatement.value = new StackValue(0); + break; + } + case "bool": + { + assignmentStatement.value = new BoolValue(true); + break; + } + case "obj": + { + assignmentStatement.value = new ObjectValue(null); + break; + } + case "arr": + { + assignmentStatement.value = new ArrayValue(0); + break; + } + } + return assignmentStatement; + } + if (current.getType() == TokenType.WORD && get(1).getType() == TokenType.WORD && get(2).getType() == TokenType.DDOTEQ) { string enums = consume(TokenType.WORD).getText(); diff --git a/SourceCode/Parser/TokenType.cs b/SourceCode/Parser/TokenType.cs index c6c9b08..310514e 100644 --- a/SourceCode/Parser/TokenType.cs +++ b/SourceCode/Parser/TokenType.cs @@ -45,6 +45,7 @@ public enum TokenType STATEMENT, SWITCH, CASE, + TYPEDEF, STAREQ, SLASHEQ, diff --git a/SourceCode/ast/AssignmentStatement.cs b/SourceCode/ast/AssignmentStatement.cs index 8b2a309..61db800 100644 --- a/SourceCode/ast/AssignmentStatement.cs +++ b/SourceCode/ast/AssignmentStatement.cs @@ -1,4 +1,4 @@ -using OwnLang.ast.lib; +using OwnLang.ast.lib; using System; using System.Collections.Generic; using System.Linq; @@ -11,17 +11,72 @@ class AssignmentStatement : Statement { private string variable; private Expression expression; + private bool isTypedef; + public Value value; - public AssignmentStatement(string variable, Expression expression) + public AssignmentStatement(string variable, Expression expression, bool isTypedef = false) { this.variable = variable; this.expression = expression; + this.isTypedef = isTypedef; } public void execute() { - // expression.eval() - Value result = expression.eval(); + Value result; + if (isTypedef) + { + if (value is NumberValue) + { + result = (NumberValue)expression.eval(); + Variables.set(variable, result); + return; + } + if (value is BoolValue) + { + result = (BoolValue)expression.eval(); + Variables.set(variable, result); + return; + } + if (value is StringValue) + { + result = (StringValue)expression.eval(); + Variables.set(variable, result); + return; + } + if (value is EnumValue) + { + result = (EnumValue)expression.eval(); + Variables.set(variable, result); + return; + } + if (value is ObjectValue) + { + result = (ObjectValue)expression.eval(); + Variables.set(variable, result); + return; + } + if (value is ArrayValue) + { + result = (ArrayValue)expression.eval(); + Variables.set(variable, result); + return; + } + if (value is StackValue) + { + result = (StackValue)expression.eval(); + Variables.set(variable, result); + return; + } + if (value is DictionaryValue) + { + result = (DictionaryValue)expression.eval(); + Variables.set(variable, result); + return; + } + + } + result = expression.eval(); Variables.set(variable, result); }