From 9b53ec3a4c196ebb1962992701e9248bf5238eec Mon Sep 17 00:00:00 2001 From: helperf <117087415+helperf@users.noreply.github.com> Date: Tue, 13 Dec 2022 10:06:09 +0300 Subject: [PATCH 1/6] added "typedef" operator --- SourceCode/Parser/Lexer.cs | 5 +++++ 1 file changed, 5 insertions(+) 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); From d252a93f0fa5ad7c500766d36135acc2be36fd37 Mon Sep 17 00:00:00 2001 From: helperf <117087415+helperf@users.noreply.github.com> Date: Tue, 13 Dec 2022 10:06:27 +0300 Subject: [PATCH 2/6] added "typedef" operator --- SourceCode/Parser/Parser.cs | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/SourceCode/Parser/Parser.cs b/SourceCode/Parser/Parser.cs index d4fa6ae..7758dd9 100644 --- a/SourceCode/Parser/Parser.cs +++ b/SourceCode/Parser/Parser.cs @@ -202,6 +202,46 @@ 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 "string": { + assignmentStatement.value = new NumberValue(0); + break; + } + case "dict": { + assignmentStatement.value = new NumberValue(0); + break; + } + case "stack": { + assignmentStatement.value = new NumberValue(0); + break; + } + case "bool": { + assignmentStatement.value = new NumberValue(0); + break; + } + case "obj": { + assignmentStatement.value = new NumberValue(0); + break; + } + case "arr": { + assignmentStatement.value = new NumberValue(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(); From 60d5ded0eb449b3a42da8ff13bdf7fd1957c49e5 Mon Sep 17 00:00:00 2001 From: helperf <117087415+helperf@users.noreply.github.com> Date: Tue, 13 Dec 2022 10:06:47 +0300 Subject: [PATCH 3/6] added "typedef" operator --- SourceCode/Parser/TokenType.cs | 1 + 1 file changed, 1 insertion(+) 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, From ec331216ccbc166df01c75f7e96cb97a5945e168 Mon Sep 17 00:00:00 2001 From: helperf <117087415+helperf@users.noreply.github.com> Date: Tue, 13 Dec 2022 10:07:14 +0300 Subject: [PATCH 4/6] added "typedef" operator --- SourceCode/ast/AssignmentStatement.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/SourceCode/ast/AssignmentStatement.cs b/SourceCode/ast/AssignmentStatement.cs index 8b2a309..0ff4286 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,16 +11,23 @@ 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() + if (isTypedef) { + Value result = (value.GetType())expression.eval(); + Variables.set(variable, result); + return; + } Value result = expression.eval(); Variables.set(variable, result); } From ba92c9ae4e75fc72a03730279d5822ef2a95f17a Mon Sep 17 00:00:00 2001 From: bas1c <68533770+bas1c1@users.noreply.github.com> Date: Tue, 13 Dec 2022 15:36:07 +0300 Subject: [PATCH 5/6] added "typedef" operator --- SourceCode/ast/AssignmentStatement.cs | 60 ++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/SourceCode/ast/AssignmentStatement.cs b/SourceCode/ast/AssignmentStatement.cs index 0ff4286..61db800 100644 --- a/SourceCode/ast/AssignmentStatement.cs +++ b/SourceCode/ast/AssignmentStatement.cs @@ -14,7 +14,7 @@ class AssignmentStatement : Statement private bool isTypedef; public Value value; - public AssignmentStatement(string variable, Expression expression, bool isTypedef=false) + public AssignmentStatement(string variable, Expression expression, bool isTypedef = false) { this.variable = variable; this.expression = expression; @@ -23,12 +23,60 @@ public AssignmentStatement(string variable, Expression expression, bool isTypede public void execute() { - if (isTypedef) { - Value result = (value.GetType())expression.eval(); - Variables.set(variable, result); - return; + 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; + } + } - Value result = expression.eval(); + result = expression.eval(); Variables.set(variable, result); } From 10d6f705aae0e358b688627df6b9d68169d1f39f Mon Sep 17 00:00:00 2001 From: bas1c <68533770+bas1c1@users.noreply.github.com> Date: Tue, 13 Dec 2022 15:37:27 +0300 Subject: [PATCH 6/6] added "typedef" operator --- SourceCode/Parser/Parser.cs | 73 ++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/SourceCode/Parser/Parser.cs b/SourceCode/Parser/Parser.cs index 7758dd9..782b5d4 100644 --- a/SourceCode/Parser/Parser.cs +++ b/SourceCode/Parser/Parser.cs @@ -202,42 +202,55 @@ private Statement assignmentStatement() return new AssignmentStatement(variable, expression()); } - if (current.getType() == TokenType.TYPEDEF) + 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 "string": { - assignmentStatement.value = new NumberValue(0); - break; - } - case "dict": { - assignmentStatement.value = new NumberValue(0); - break; - } - case "stack": { - assignmentStatement.value = new NumberValue(0); - break; - } - case "bool": { - assignmentStatement.value = new NumberValue(0); - break; - } - case "obj": { - assignmentStatement.value = new NumberValue(0); - break; - } - case "arr": { - assignmentStatement.value = new NumberValue(0); - break; - } + 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; }