From f27939ee67e9962c0cea0060b56cc9f63edcf457 Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Fri, 22 Dec 2023 22:43:02 +0600 Subject: [PATCH] MainClass --- src/Calculator.fu | 15 ++------------- src/Expressions/FunctionCallExpression.fu | 3 +-- src/Expressions/IExpression.fu | 3 +-- src/Expressions/NumericalExpression.fu | 3 +-- src/Expressions/OperatorExpression.fu | 3 +-- src/Lexer.fu | 19 ++++++------------- src/MainClass.fu | 15 +++++++++++++++ src/Parser.fu | 10 +++++----- src/Token.fu | 7 +++---- src/TokenLinkedList.fu | 4 ++-- src/TokenLinkedListNode.fu | 2 +- 11 files changed, 38 insertions(+), 46 deletions(-) create mode 100644 src/MainClass.fu diff --git a/src/Calculator.fu b/src/Calculator.fu index f7b7b26..c9096a9 100644 --- a/src/Calculator.fu +++ b/src/Calculator.fu @@ -1,16 +1,5 @@ -public static class Calculator -{ - public static void Main(string[] args){ - string() joined = ""; - foreach(string arg in args){ - joined += arg; - } - double rezult = Calculate(joined); - Console.WriteLine(rezult); - } - - public static double Calculate(string exprStr) - { +public static class Calculator { + public static double Calculate(string exprStr) { Lexer() lexer; List tokens = lexer.Lex(exprStr); // lexer.PrintTokens(); diff --git a/src/Expressions/FunctionCallExpression.fu b/src/Expressions/FunctionCallExpression.fu index d001afd..060b1bf 100644 --- a/src/Expressions/FunctionCallExpression.fu +++ b/src/Expressions/FunctionCallExpression.fu @@ -1,5 +1,4 @@ -abstract class FunctionCallExpression : IExpression -{ +abstract class FunctionCallExpression : IExpression { IExpression X; internal void Init!(IExpression x){ diff --git a/src/Expressions/IExpression.fu b/src/Expressions/IExpression.fu index c2ffbd9..43bd47a 100644 --- a/src/Expressions/IExpression.fu +++ b/src/Expressions/IExpression.fu @@ -1,4 +1,3 @@ -abstract class IExpression -{ +abstract class IExpression { internal abstract double Calculate(); } diff --git a/src/Expressions/NumericalExpression.fu b/src/Expressions/NumericalExpression.fu index 1fbab91..b7780f8 100644 --- a/src/Expressions/NumericalExpression.fu +++ b/src/Expressions/NumericalExpression.fu @@ -1,5 +1,4 @@ -class NumericExpression : IExpression -{ +class NumericExpression : IExpression { double N; internal void Init!(double n){ diff --git a/src/Expressions/OperatorExpression.fu b/src/Expressions/OperatorExpression.fu index 926df26..25c3f0b 100644 --- a/src/Expressions/OperatorExpression.fu +++ b/src/Expressions/OperatorExpression.fu @@ -1,5 +1,4 @@ -abstract class OperatorExpression : IExpression -{ +abstract class OperatorExpression : IExpression { IExpression A; IExpression B; diff --git a/src/Lexer.fu b/src/Lexer.fu index dfc3257..065c6d4 100644 --- a/src/Lexer.fu +++ b/src/Lexer.fu @@ -1,7 +1,5 @@ -class Lexer -{ +class Lexer { string ExprStr; - List() TokenStorage; int tokType = Token.Type_Number; int tokBegin = 0; @@ -39,10 +37,8 @@ class Lexer internal List Lex!(string exprStr){ ExprStr = exprStr; - while (i < ExprStr.Length) - { - switch (ExprStr[i]) - { + while (i < ExprStr.Length) { + switch (ExprStr[i]) { // end token, add new predifined token and move next case '(': AddStaticToken(TokBracketOpen); break; case ')': AddStaticToken(TokBracketClose); break; @@ -75,10 +71,8 @@ class Lexer return TokenStorage; } - void TryEndToken!() - { - if (tokBegin != i) - { + void TryEndToken!() { + if (tokBegin != i) { Token() tok = Token.Create(ExprStr, tokBegin, i - tokBegin, tokType); TokenStorage.Add(); TokenStorage[TokenStorage.Count-1] = tok; @@ -87,8 +81,7 @@ class Lexer } } - void AddStaticToken!(Token() tok) - { + void AddStaticToken!(Token() tok) { TryEndToken(); TokenStorage.Add(); TokenStorage[TokenStorage.Count-1] = tok; diff --git a/src/MainClass.fu b/src/MainClass.fu new file mode 100644 index 0000000..a145af1 --- /dev/null +++ b/src/MainClass.fu @@ -0,0 +1,15 @@ +public static class MainClass { + public static void Main(string[] args){ + #if CS + native { + System.Globalization.CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + } + #endif + string() joined = ""; + foreach(string arg in args){ + joined += arg; + } + double rezult = Calculator.Calculate(joined); + Console.WriteLine(rezult); + } +} diff --git a/src/Parser.fu b/src/Parser.fu index 1cb2907..bbbd0a3 100644 --- a/src/Parser.fu +++ b/src/Parser.fu @@ -1,19 +1,18 @@ -class Parser -{ +class Parser { List TokenStorage; IExpression# RootExpression; TokenLinkedList() TokensInRPN; Token() TokZero; internal Parser(){ - NumericExpression# nan = new NumericExpression(); - nan.Init(Math.NaN); - RootExpression = nan; + RootExpression = new NumericExpression(); // NaN TokZero = Token.Create("0", 0, 1, Token.Type_Number); } internal IExpression# Parse!(List tokens){ TokenStorage = tokens; + if(tokens.Count == 0) + return RootExpression; // NaN SortTokensInRPN(); BuildExpressionTree(); return RootExpression; @@ -133,6 +132,7 @@ class Parser if(expressionStack.Count == 1) RootExpression = expressionStack.Pop(); + else RootExpression = new NumericExpression(); // NaN } // returns the number or NaN diff --git a/src/Token.fu b/src/Token.fu index 7db58f3..50bc540 100644 --- a/src/Token.fu +++ b/src/Token.fu @@ -1,12 +1,11 @@ -class Token -{ +class Token { string Str; int StartIndex; int Length; // It is not a enum because there is no way to convert enum value to int in Fusion. - // The Type is also the priority of the token in calculation (see Parser). + // The Type is also the priority of the token in calculation (see Parser). int Type; - + public const int Type_OperatorPow=10; public const int Type_OperatorMul=9; public const int Type_OperatorMod=8; diff --git a/src/TokenLinkedList.fu b/src/TokenLinkedList.fu index f5790e7..731a28f 100644 --- a/src/TokenLinkedList.fu +++ b/src/TokenLinkedList.fu @@ -43,7 +43,7 @@ class TokenLinkedList { } // Can be used by GraphViz to create node graph. - // GraphViz online: https://dreampuf.github.io/GraphvizOnline/ + // GraphViz online: https://dreampuf.github.io/GraphvizOnline/ internal string() ToGraphVizCode() { string() s = "strict digraph {\n" + /* directed graph with no multi-edges */ " start [shape=Mdiamond];\n" + /* 'start' node style */ @@ -73,4 +73,4 @@ class TokenLinkedList { s += "}"; return s; } -} \ No newline at end of file +} diff --git a/src/TokenLinkedListNode.fu b/src/TokenLinkedListNode.fu index e7d2520..100d768 100644 --- a/src/TokenLinkedListNode.fu +++ b/src/TokenLinkedListNode.fu @@ -23,4 +23,4 @@ class TokenLinkedListNode { Prev = next.GetPrev(); next.SetPrev(this); } -} \ No newline at end of file +}