From 726f4f2425ddee6b04926c8f19b0eda41fa91e72 Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Fri, 22 Dec 2023 23:10:48 +0600 Subject: [PATCH] really implemented negative numbers --- src/Lexer.fu | 13 +++++++------ src/Parser.fu | 8 -------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/Lexer.fu b/src/Lexer.fu index 065c6d4..929e499 100644 --- a/src/Lexer.fu +++ b/src/Lexer.fu @@ -37,7 +37,7 @@ class Lexer { internal List Lex!(string exprStr){ ExprStr = exprStr; - while (i < ExprStr.Length) { + for(i=0; i < ExprStr.Length; i++) { switch (ExprStr[i]) { // end token, add new predifined token and move next case '(': AddStaticToken(TokBracketOpen); break; @@ -47,21 +47,22 @@ class Lexer { case '%': AddStaticToken(TokMod); break; case '/': AddStaticToken(TokDiv); break; case '+': AddStaticToken(TokAdd); break; - case '-': AddStaticToken(TokSub); break; + case '-': + if(i != 0 && ExprStr[i-1] != '(') + AddStaticToken(TokSub); + // else '-' is a part of numeric expression + break; // try end token and skip current char case ' ': case '\t': case '\n': case '\r': TryEndToken(); - i++; break; // move next case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': - i++; break; // set type from Numeric to Literal default: tokType = Token.Type_Literal; - i++; break; } } @@ -86,6 +87,6 @@ class Lexer { TokenStorage.Add(); TokenStorage[TokenStorage.Count-1] = tok; tokType = Token.Type_Number; - tokBegin = ++i; + tokBegin = i+1; } } diff --git a/src/Parser.fu b/src/Parser.fu index bbbd0a3..3e10c6b 100644 --- a/src/Parser.fu +++ b/src/Parser.fu @@ -2,11 +2,9 @@ class Parser { List TokenStorage; IExpression# RootExpression; TokenLinkedList() TokensInRPN; - Token() TokZero; internal Parser(){ RootExpression = new NumericExpression(); // NaN - TokZero = Token.Create("0", 0, 1, Token.Type_Number); } internal IExpression# Parse!(List tokens){ @@ -26,8 +24,6 @@ class Parser { // Implementation of https://en.wikipedia.org/wiki/Shunting_yard_algorithm void SortTokensInRPN!(){ Stack() RPNStack; - // is needed for negative numbers recognition - int prevTokType = Token.Type_BracketOpen; for(int i = 0; i < TokenStorage.Count; i++){ Token tok = TokenStorage[i]; @@ -43,8 +39,6 @@ class Parser { case Token.Type_OperatorMod: case Token.Type_OperatorAdd: case Token.Type_OperatorSub: - if(type == Token.Type_OperatorSub && prevTokType == Token.Type_BracketOpen) - TokensInRPN.AddToEnd(TokZero); while(RPNStack.Count != 0 && RPNStack.Peek().GetTokType() >= type){ Token op2 = RPNStack.Pop(); TokensInRPN.AddToEnd(op2); @@ -69,8 +63,6 @@ class Parser { ThrowError($"unexpected token type '{type}'"); break; } - - prevTokType = type; } // add remaining operators