/// <summary>
 /// Initializes a new instance of the <see cref="UnaryExpressionTranslationUnit"/> class.
 /// </summary>
 /// <param name="nestingLevel"></param>
 protected UnaryExpressionTranslationUnit(int nestingLevel)
     : base(nestingLevel)
 {
     this.operand = null;
     this.operatorToken = OperatorToken.Undefined;
     this.unaryPosition = UnaryPosition.Postfix;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="BinaryExpressionTranslationUnit"/> class.
 /// </summary>
 /// <param name="nestingLevel"></param>
 protected BinaryExpressionTranslationUnit(int nestingLevel)
     : base(nestingLevel)
 {
     this.leftOperand = null;
     this.rightOperand = null;
     this.operatorToken = OperatorToken.Undefined;
 }
        private static void MakeRPN()
        {
            var opStack = new Stack <Token>();
            var newList = new List <Token>();

            foreach (var token in _tokenList)
            {
                if (token is VariableToken || token is LogicValueToken)
                {
                    newList.Add(token);
                    continue;
                }

                if (token is OperatorToken)
                {
                    var current         = token as OperatorToken;
                    var currentPriority = current.Priority;

                    OperatorToken peek = null;
                    if (opStack.Count > 0)
                    {
                        peek = opStack.Peek() as OperatorToken;
                    }
                    while (opStack.Count > 0 && peek != null && peek.Priority >= currentPriority)
                    {
                        newList.Add(opStack.Pop());
                        peek = (opStack.Count > 0) ? opStack.Peek() as OperatorToken : null;
                    }
                    opStack.Push(token);
                    continue;
                }

                if (token is OpenParenthesisToken)
                {
                    opStack.Push(token);
                    continue;
                }

                if (token is CloseParenthesisToken)
                {
                    while (opStack.Count > 0 && !(opStack.Peek() is OpenParenthesisToken))
                    {
                        newList.Add(opStack.Pop());
                    }
                    if (opStack.Count == 0)
                    {
                        throw new Exception("RPN: Unpaired parentheses");
                    }
                    opStack.Pop();
                    continue;
                }

                throw new Exception("RPN: Unsupported token");
            }

            newList.AddRange(opStack);
            _tokenList = newList;
        }
Beispiel #4
0
        private Token?GetNextToken()
        {
            if (IsEoF || m_current == '\0')
            {
                return(null);
            }

            Token?result = null;
            char  c      = m_current;

            (int, int)location = (m_line, m_column);

            switch (c)
            {
            case '.':
            case ',':
            case ':':
            case ';':
            case '[':
            case ']':
            case '(':
            case ')':
            case '{':
            case '}':
            {
                Advance();
                result = new DelimiterToken(location, (DelimiterKind)c);
            } break;

            case '$': throw new NotImplementedException();     // interpolated string literals

            case '"':
            {
                result = ReadString();
            } break;

            default:
            {
                if (char.IsDigit(c) || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')
                {
                    result = ReadNumberOrIdentifierOrKeyword();
                }
                else if (IsOperatorCharacter(c))
                {
                    var operatorImage = new StringBuilder();
                    while (!IsEoF && IsOperatorCharacter(m_current))
                    {
                        operatorImage.Append(m_current);
                        Advance();
                    }
                    result = new OperatorToken(location, operatorImage.ToString());
                }
            } break;
            }

            EatWhiteSpace();
            return(result);
        }
        public OperationExpressionSegment(OperatorToken token)
        {
            if (token == null)
            {
                throw new ArgumentNullException("token");
            }

            Token = token;
        }
        private static QueryExpression ParseFunction(QueryExpression subQuery, List <Token> tokens, int startToken, int numTokens, FunctionToken functionToken)
        {
            if (!(tokens[startToken] is VariableToken))
            {
                throw new CSExpressionException("Function call " + functionToken.Function + " called with incorrect parameters");
            }

            QueryExpression newQuery = (QueryExpression)EvalVariable(((VariableToken)tokens[startToken]).Variable, subQuery);

            string fieldExpression;

            switch (functionToken.Function)
            {
            case "HAS": fieldExpression = "*"; break;

            case "COUNT": fieldExpression = "count(*)"; break;

            case "COUNTDISTINCT": fieldExpression = "count(distinct " + newQuery.FieldName + ")"; break;

            default: fieldExpression = functionToken.Function + "(" + newQuery.FieldName + ")"; break;
            }

            if (numTokens > 1)
            {
                if (!(tokens[startToken + 1] is OperatorToken))
                {
                    throw new CSExpressionException("Expected WHERE");
                }

                OperatorToken whereToken = (OperatorToken)tokens[startToken + 1];

                if (whereToken.Operator.ToUpper() != "WHERE")
                {
                    throw new CSExpressionException("Expected WHERE");
                }

                if (numTokens < 3)
                {
                    throw new CSExpressionException("Expected expression after WHERE");
                }

                newQuery.Expression += " AND ";

                newQuery = Parse(newQuery, tokens, startToken + 2, numTokens - 2);
            }

            string selectSql = newQuery.Table.Schema.DB.BuildSelectSQL(newQuery.Table.TableName, newQuery.Table.TableAlias, new[] { fieldExpression }, null, newQuery.Joins.BuildJoinExpressions(), newQuery.Expression, null, 1, 0, false, false);

            if (functionToken.Function == "HAS")
            {
                subQuery.Expression += "EXISTS ";
            }

            subQuery.Expression += "(" + selectSql + ")";

            return(subQuery);
        }
Beispiel #7
0
 public BinaryOperatorNode(OperatorToken token, INode leftNode, INode rightNode)
 {
     Contract.Requires <ArgumentNullException>(token != null);
     Contract.Requires <ArgumentNullException>(leftNode != null);
     Contract.Requires <ArgumentNullException>(rightNode != null);
     this.token     = token;
     this.leftNode  = leftNode;
     this.rightNode = rightNode;
 }
Beispiel #8
0
        public static void TestGetNextTokenOnOperator()
        {
            const string input = "$a=42";

            var token        = Lexer.GetNextToken(input, 2);
            var correctToken = new OperatorToken(Operator.Assign);

            Assert.Equal(correctToken, token);
        }
Beispiel #9
0
        void GenerationTest()
        {
            var refer = OperatorToken.GenerateReference();

            var referenceValues = refer.OrderBy(p => p.Key).ToList();

            var manualValue = ManualReference.OrderBy(p => p.Key).ToList();

            Assert.Equal(referenceValues, manualValue);
        }
 public override string EvaluateOperator(OperatorToken token)
 {
     if (token is SignOperatorToken)
     {
         return(String.Format("{0} {1}",
                              token.SubTokens[1].Evaluate(this), token.Symbol));
     }
     return(String.Format("{0} {1} {2}",
                          token.SubTokens[0].Evaluate(this), token.SubTokens[1].Evaluate(this), token.Symbol));
 }
Beispiel #11
0
            public void Do()
            {
                (int Line, int Column)loc = m_originalToken.Location;

                var firstPart  = new OperatorToken(loc, m_imageSplit);
                var secondPart = new OperatorToken((loc.Line, loc.Column + m_imageSplit.Length), m_originalToken.Image.Substring(m_imageSplit.Length));

                m_tokens.Insert(m_index, firstPart);
                m_tokens[m_index + 1] = secondPart;
            }
Beispiel #12
0
 public override int GetHashCode()
 {
     unchecked
     {
         int hashCode = (UniqueName != null ? UniqueName.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (OperatorToken != null ? OperatorToken.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ Version.GetHashCode();
         return(hashCode);
     }
 }
Beispiel #13
0
        private void PushOperator(OperatorToken op)
        {
            // Here we use openParenthesisToken as sentinel token
            while (this.operators.Peek().Precedence > op.NewPushPrecedence)
            {
                this.PopOperator();
            }

            this.operators.Push(op);
        }
Beispiel #14
0
        public bool TryTokenize(byte currentByte, IInputBytes inputBytes, out IToken token)
        {
            token = null;

            if (ReadHelper.IsWhitespace(currentByte))
            {
                return(false);
            }

            var builder = stringBuilder;

            builder.Append((char)currentByte);
            while (inputBytes.MoveNext())
            {
                if (ReadHelper.IsWhitespace(inputBytes.CurrentByte))
                {
                    break;
                }

                if (inputBytes.CurrentByte == '<' || inputBytes.CurrentByte == '[' ||
                    inputBytes.CurrentByte == '/' || inputBytes.CurrentByte == ']' ||
                    inputBytes.CurrentByte == '>' || inputBytes.CurrentByte == '(' ||
                    inputBytes.CurrentByte == ')')
                {
                    break;
                }

                builder.Append((char)inputBytes.CurrentByte);
            }

            var text = builder.ToString();

            builder.Clear();

            switch (text)
            {
            case "true":
                token = BooleanToken.True;
                break;

            case "false":
                token = BooleanToken.False;
                break;

            case "null":
                token = NullToken.Instance;
                break;

            default:
                token = OperatorToken.Create(text);
                break;
            }

            return(true);
        }
Beispiel #15
0
        void LexerSmokeTestSecond()
        {
            var sourceCode =
                @"fn+let-const*as/while//hello
continue:=if->(else=> _==int){""as\nc\rc\tc""
<=p>1.5E-3!=231231231231</p>
}
";
            var expectedTokens = new Token[]
            {
                new KeywordToken(Keyword.Fn, (0, 0)), new OperatorToken(Operator.Plus, (0, 2)), new KeywordToken(Keyword.Let, (0, 3)),
                new OperatorToken(Operator.Minus, (0, 6)), new KeywordToken(Keyword.Const, (0, 7)), new OperatorToken(Operator.Mult, (0, 12)),
                new KeywordToken(Keyword.As, (0, 13)), new OperatorToken(Operator.Divide, (0, 15)), new KeywordToken(Keyword.While, (0, 16)),

                new KeywordToken(Keyword.Continue, (1, 0)), new OperatorToken(Operator.Colon, (1, 8)), new OperatorToken(Operator.Assign, (1, 9)),
                new KeywordToken(Keyword.If, (1, 10)), new OperatorToken(Operator.Arrow, (1, 12)), new OperatorToken(Operator.LeftParen, (1, 14)),
                new KeywordToken(Keyword.Else, (1, 15)), new OperatorToken(Operator.Assign, (1, 19)), new OperatorToken(Operator.GreaterThan, (1, 20)),
                new IdentifierToken("_", (1, 22)), new OperatorToken(Operator.Equal, (1, 23)), new IdentifierToken("int", (1, 25)),
                new OperatorToken(Operator.RightParen, (1, 28)), new OperatorToken(Operator.LeftBrace, (1, 29)),
                new StringLiteralToken("as\nc\rc\tc", (1, 30)),

                new OperatorToken(Operator.LessEqual, (2, 0)), new IdentifierToken("p", (2, 2)), new OperatorToken(Operator.GreaterThan, (2, 3)),
                new DoubleLiteralToken(1.5E-3, (2, 4)), new OperatorToken(Operator.NotEqual, (2, 10)), new UInt64LiteralToken(231231231231, (2, 12)),
                new OperatorToken(Operator.LessThan, (2, 24)), new OperatorToken(Operator.Divide, (2, 25)), new IdentifierToken("p", (2, 26)),
                new OperatorToken(Operator.GreaterThan, (2, 27)),

                new OperatorToken(Operator.RightBrace, (3, 0)),
            };

            var lexer  = new Lexer(sourceCode);
            var tokens = lexer.Parse().ToList();

            Assert.Equal(expectedTokens.Length, tokens.Count);

            for (var i = 0; i < expectedTokens.Length; i++)
            {
                var expectedToken = expectedTokens[i];
                var actualToken   = tokens[i];

                AssertJsonEqual(expectedToken, actualToken);
            }
        }
Beispiel #16
0
 public MemoryImmediate(
     OperatorToken leftBracket,
     IntegerToken immediateAddress,
     OperatorToken rightBracket)
     : base(
         OperandType.MemoryImmediate,
         leftBracket,
         immediateAddress,
         rightBracket)
 {
     ImmediateAddress = immediateAddress;
 }
Beispiel #17
0
        public override string EvaluateOperator(OperatorToken token)
        {
            if (token is SignOperatorToken)
            {
                return(evalSignOperator(token as SignOperatorToken));
            }
            int    precedence = OperatorProperties.GetPrecedence(token);
            string exprLeft   = evalOperatorSubToken(precedence, token.SubTokens[0]);
            string exprRight  = evalOperatorSubToken(precedence, token.SubTokens[1]);

            return(exprLeft + token.Symbol + exprRight);
        }
Beispiel #18
0
 public void Visit(OperatorToken operatorToken)
 {
     CreateOperatorExpression(operatorToken);
     if (!mIsNegated && !mWasMultiplication)
     {
         FillOperation();
     }
     else
     {
         mWasMultiplication = false;
         mIsNegated         = false;
     }
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="body"></param>
        /// <param name="operatorToken"></param>
        /// <param name="unaryPosition"></param>
        /// <returns></returns>
        public static UnaryExpressionTranslationUnit Create(ITranslationUnit body, OperatorToken operatorToken, UnaryPosition unaryPosition)
        {
            if (body == null)
            {
                throw new ArgumentNullException(nameof(body));
            }

            return(new UnaryExpressionTranslationUnit(AutomaticNestingLevel)
            {
                Operand = body,
                operatorToken = operatorToken,
                unaryPosition = unaryPosition
            });
        }
Beispiel #20
0
        public BinaryExper GetFieldResult(Token t, out int number)
        {
            BinaryExper now_exper = new BinaryExper();

            int          LP_count     = 1;
            List <Token> inter_tokens = new List <Token>();

            inter_tokens.Add(new OperatorToken(0, inter_tokens.Count, "KEEP"));
            inter_tokens.Add(new OperatorToken(0, inter_tokens.Count, "="));
            for (int i = 1; i < q.Count - 1; i++)
            {
                string v = q[t.seq + i].GetValue();
                if (v != "}")
                {
                    if (v == "{")
                    {
                        LP_count++;
                    }
                    Token nt = q[t.seq + i];
                    nt.seq = inter_tokens.Count;
                    inter_tokens.Add(nt);
                }
                else
                {
                    LP_count--;
                    Token nt = q[t.seq + i];
                    nt.seq = inter_tokens.Count;

                    if (LP_count == 0)
                    {
                        break;
                    }
                    else
                    {
                        inter_tokens.Add(nt);
                    }
                }
            }
            Token nt2 = new OperatorToken(0, inter_tokens.Count, ";"); nt2.seq = inter_tokens.Count; inter_tokens.Add(nt2);

            //    BinaryExper vvv = new BinaryExper(GetValueFromTokens(inter_tokens));
            //    vvv.Calculate();

            Parser      p   = new Parser(inter_tokens); p.Start();
            BinaryExper vvv = new BinaryExper();

            number    = inter_tokens.Count - 3;
            now_exper = vvv;
            return(now_exper);
        }
Beispiel #21
0
        /*
         * unary_operator : '&' | '*' | '+' | '-' | '~' | '!'
         */

        private IParseResult ParseUnaryOperator()
        {
            OperatorToken token = null;

            if (Accept(new []
            {
                OperatorType.BITAND, OperatorType.MULT, OperatorType.ADD,
                OperatorType.SUB, OperatorType.TILDE, OperatorType.NOT
            }, ref token))
            {
                return(new SuccessParseResult(new UnaryOperator(token)));
            }

            return(new SuccessParseResult(new NullStat()));
        }
Beispiel #22
0
        private static void HandleOperator(OperatorToken token, ISeekableTokenScanner scanner, PreviousTokenSet set, List <DictionaryToken> dictionaries)
        {
            switch (token.Data)
            {
            case "dict":
                var number     = ((NumericToken)set[0]).Int;
                var dictionary = ReadDictionary(number, scanner);

                dictionaries.Add(dictionary);
                break;

            default:
                return;
            }
        }
Beispiel #23
0
        public BinaryExper GetResultFromBrackets(Token t, out int number)
        {
            BinaryExper now_exper = new BinaryExper();


            int          LP_count     = 1;
            List <Token> inter_tokens = new List <Token>();

            inter_tokens.Add(new OperatorToken(0, inter_tokens.Count, "KEEP"));
            inter_tokens.Add(new OperatorToken(0, inter_tokens.Count, "="));

            for (int i = 1; i < q.Count - 1; i++)
            {
                string v = q[t.seq + i].GetValue();
                if (v != ")")
                {
                    if (v == "(")
                    {
                        LP_count++;
                    }
                    Token nt = q[t.seq + i];
                    nt.seq = inter_tokens.Count;
                    inter_tokens.Add(nt);
                }
                else
                {
                    LP_count--;
                    Token nt = q[t.seq + i];
                    nt.seq = inter_tokens.Count;

                    if (LP_count == 0)
                    {
                        break;
                    }
                    else
                    {
                        inter_tokens.Add(nt);
                    }
                }
            }
            Token nt2 = new OperatorToken(0, inter_tokens.Count, ";"); nt2.seq = inter_tokens.Count; inter_tokens.Add(nt2);

            BinaryExper vvv = new BinaryExper(GetValueFromTokens(inter_tokens));

            vvv.Calculate();
            number = inter_tokens.Count - 3;
            return(vvv);
        }
Beispiel #24
0
 /// <summary>
 ///     Performs the evaluation of the specified operator token
 /// </summary>
 private static NumericToken Evaluate(OperatorToken token, Stack <Token> operands)
 {
     try
     {
         var arguments = new NumericToken[token.Value.Operands];
         for (var i = 0; i < token.Value.Operands; i++)
         {
             arguments[i] = (NumericToken)operands.Pop();
         }
         return(token.Value.Evaluate(arguments));
     }
     catch (InvalidOperationException e) when(!operands.Any())
     {
         throw new EvaluationException(
                   $"Insufficient operands for operator '{token.Value}' @ char: {token.Index}", e);
     }
 }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="lhand"></param>
        /// <param name="rhand"></param>
        /// <param name="operatorToken"></param>
        /// <returns></returns>
        public static BinaryExpressionTranslationUnit Create(ITranslationUnit lhand, ITranslationUnit rhand, OperatorToken operatorToken)
        {
            if (rhand == null)
            {
                throw new ArgumentNullException(nameof(rhand));
            }
            if (lhand == null)
            {
                throw new ArgumentNullException(nameof(lhand));
            }

            return new BinaryExpressionTranslationUnit(AutomaticNestingLevel)
            {
                LeftOperand = lhand,
                RightOperand = rhand,
                operatorToken = operatorToken
            };
        }
Beispiel #26
0
        private int Operator()
        {
            char ch = data[chBaseIndex];

            if (OperatorToken.Map.ContainsKey(ch))
            {
                OperatorToken op = new OperatorToken();
                op.m_Operator = OperatorToken.Map[ch];

                int chNewBaseIndex = chBaseIndex + 1;
                AttachDebugData(op, DebugRanges, chBaseIndex, chNewBaseIndex - 1);

                Tokens.Add(op);
                chBaseIndex = chNewBaseIndex;
            }

            return(chBaseIndex);
        }
Beispiel #27
0
        /// <summary>
        /// Parses a set of brackets containing arguments.
        /// </summary>
        /// <param name="scope">The scope for this token.</param>
        /// <param name="openBracketToken">The open bracket token.</param>
        /// <param name="sig">(optional) A signature for the function being called.</param>
        /// <returns>A new argument token.</returns>
        /// <remarks>This function assumes the opening bracket has already been read from the stream.</remarks>
        public static ArgsToken Parse(Scope scope, OperatorToken openBracketToken, FunctionSignature sig)
        {
            var code     = scope.Code;
            var ret      = new ArgsToken(scope, openBracketToken);
            var argIndex = 0;

            scope       = scope.Clone();
            scope.Hint |= ScopeHint.SuppressStatementStarts;

            ret._sig = sig;
            var args = sig != null?sig.Arguments.ToArray() : ArgumentDescriptor.EmptyArray;

            while (code.SkipWhiteSpace())
            {
                code.Peek();
                if (code.Text == ")")
                {
                    ret.AddToken(new OperatorToken(scope, code.MovePeekedSpan(), ")"));
                    ret._terminated = true;
                    return(ret);
                }

                if (code.Text == ",")
                {
                    ret.AddToken(new OperatorToken(scope, code.MovePeekedSpan(), ","));
                    argIndex++;
                    continue;
                }


                var dataType = argIndex < args.Length ? args[argIndex].DataType : null;
                var exp      = ExpressionToken.TryParse(scope, _endTokens, expectedDataType: dataType);
                if (exp != null)
                {
                    ret.AddToken(exp);
                }
                else
                {
                    break;
                }
            }

            return(ret);
        }
        public bool Visit(OperatorToken token, out int precendence)
        {
            switch (token.OperatorType)
            {
            case OperatorToken.OperatorTypes.Plus:
            case OperatorToken.OperatorTypes.Minus:
                precendence = 1;
                return(true);

            case OperatorToken.OperatorTypes.Multiply:
            case OperatorToken.OperatorTypes.Divide:
                precendence = 2;
                return(true);

            default:
                precendence = 0;
                return(false);
            }
        }
Beispiel #29
0
 public void Process(char character)
 {
     if (NumberToken.IsNumber(character))
     {
         Number(character);
     }
     else if (OperatorToken.IsOperator(character))
     {
         Operator(character);
     }
     else if (Lexer.END_OF_EQUATION == character)
     {
         EndOfEquation();
     }
     else
     {
         throw new UnsupportedCharacterException(character);
     }
 }
Beispiel #30
0
        private static ITranslationUnit BuildBinaryExpressionTranslationUnit(BinaryExpressionSyntax expression, SemanticModel semanticModel)
        {
            OperatorToken token = OperatorToken.Undefined;

            switch (expression.Kind())
            {
            case SyntaxKind.AddExpression:
                token = OperatorToken.Addition;
                break;

            case SyntaxKind.MultiplyExpression:
                token = OperatorToken.Multiplication;
                break;

            case SyntaxKind.DivideExpression:
                token = OperatorToken.Divide;
                break;

            case SyntaxKind.SubtractExpression:
                token = OperatorToken.Subtraction;
                break;

            case SyntaxKind.EqualsExpression:
                token = OperatorToken.LogicalEquals;
                break;

            case SyntaxKind.NotEqualsExpression:
                token = OperatorToken.NotEquals;
                break;
            }

            if (token == OperatorToken.Undefined)
            {
                throw new InvalidOperationException("Binary operator could not be detected!");
            }

            BinaryExpression binaryExpressionHelper = new BinaryExpression(expression, semanticModel);
            ITranslationUnit leftHandOperand        = new ExpressionTranslationUnitBuilder(binaryExpressionHelper.LeftHandOperand, semanticModel).Build();
            ITranslationUnit rightHandOperand       = new ExpressionTranslationUnitBuilder(binaryExpressionHelper.RightHandOperand, semanticModel).Build();

            return(BinaryExpressionTranslationUnit.Create(leftHandOperand, rightHandOperand, token));
        }
Beispiel #31
0
        public override string EvaluateOperator(OperatorToken token)
        {
            if (token is SignOperatorToken)
            {
                return(evalSignOperator(token as SignOperatorToken));
            }
            switch (token.Symbol)
            {
            // Arithmetic operators
            case ParserSymbols.Multiply:
                return($"{evalSub(token, 0)}<mo>&sdot;</mo>{evalSub(token, 1)}");

            case ParserSymbols.Divide:
                return($"<mfrac><mrow>{evalSub(token, 0)}</mrow><mrow>{evalSub(token, 1)}</mrow></mfrac>");

            case ParserSymbols.Power:
                return($"<msup><mrow>{evalSub(token, 0)}</mrow><mrow>{evalSub(token, 1)}</mrow></msup>");

            case ParserSymbols.Modulo:
                return($"{evalSub(token, 0)}<mo>mod</mo>{evalSub(token, 1)}");

            // Comparison operators
            case ParserSymbols.LessEqual:
                return($"{evalSub(token, 0)}<mo>&le;</mo>{evalSub(token, 1)}");

            case ParserSymbols.GreaterEqual:
                return($"{evalSub(token, 0)}<mo>&ge;</mo>{evalSub(token, 1)}");

            case ParserSymbols.NotEqual:
                return($"{evalSub(token, 0)}<mo>&ne;</mo>{evalSub(token, 1)}");

            // Boolean/ bitwise operators
            case ParserSymbols.And:
                return($"{evalSub(token, 0)}<mo>&and;</mo>{evalSub(token, 1)}");

            case ParserSymbols.Or:
                return($"{evalSub(token, 0)}<mo>&or;</mo>{evalSub(token, 1)}");

            default:
                return($"{evalSub(token, 0)}<mo>{token.Symbol}</mo>{evalSub(token, 1)}");
            }
        }
Beispiel #32
0
        private IParseResult ParseBinaryExp <T>(Parser parser, IEnumerable <OperatorType> availableOperators)
            where T : BinaryExp
        {
            var left = parser();

            if (!left.IsSuccess || left.IsNullStat())
            {
                return(left);
            }

            OperatorToken op = null;

            // ReSharper disable once PossibleMultipleEnumeration
            while (Accept(availableOperators, ref op))
            {
                var right = parser();
                if (!right.IsSuccess)
                {
                    return(right);
                }
                if (right.IsNullStat())
                {
                    return(ExpectedExpressionFailure());
                }


                var constructor =
                    typeof(T).GetConstructor(new[] { typeof(OperatorToken), typeof(ExpNode), typeof(ExpNode), typeof(Position) });
                if (constructor == null)
                {
                    throw new ArgumentException($"{typeof(T)} not suitable for creating BinaryExp");
                }

                var leftExpNode = left.ResultNode as ExpNode;
                var @object     = constructor.Invoke(new object[]
                                                     { op, leftExpNode, right.ResultNode as ExpNode, leftExpNode.StartNodePosition });
                left = new SuccessParseResult(@object as Node);
            }

            return(left);
        }
 private static void ProcessOperator(Stack <Expression> expressionStack, OperatorToken oper)
 {
     if (oper is BinaryOperatorToken)
     {
         if (expressionStack.Count < 2)
         {
             throw new ExpressionParseException($"Missing argument(s) for {oper.DisplayString} operator");
         }
         var rightExp = expressionStack.Pop();
         var leftExp  = expressionStack.Pop();
         expressionStack.Push(ExpressionBuilder.Arithmetic(leftExp, ((BinaryOperatorToken)oper).Operator, rightExp));
     }
     else if (oper is UnaryMinusToken)
     {
         if (expressionStack.Count() < 1)
         {
             throw new ExpressionParseException($"Missing argument(s) for {oper.DisplayString} operator");
         }
         expressionStack.Push(ExpressionBuilder.UnaryMinus(expressionStack.Pop()));
     }
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="operatorToken"></param>
 /// <param name="number1"></param>
 /// <param name="number2"></param>
 /// <returns></returns>
 public static ITranslationUnit BuildExpressionTranslationUnit(OperatorToken operatorToken, int number1, int number2)
 {
     return BinaryExpressionTranslationUnit.Create(
         LiteralTranslationUnit<int>.Create(number1), LiteralTranslationUnit<int>.Create(number2), operatorToken);
 }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="body"></param>
        /// <param name="operatorToken"></param>
        /// <param name="unaryPosition"></param>
        /// <returns></returns>
        public static UnaryExpressionTranslationUnit Create(ITranslationUnit body, OperatorToken operatorToken, UnaryPosition unaryPosition)
        {
            if (body == null)
            {
                throw new ArgumentNullException(nameof(body));
            }

            return new UnaryExpressionTranslationUnit(AutomaticNestingLevel)
            {
                Operand = body,
                operatorToken = operatorToken,
                unaryPosition = unaryPosition
            };
        }
Beispiel #36
0
 protected BinaryExpression(Expression left, OperatorToken @operator, Expression right)
 {
     Left = left;
     Operator = @operator;
     Right = right;
 }
Beispiel #37
0
 public DivBinaryExpression(Expression left, OperatorToken @operator, Expression right)
     : base(left, @operator, right)
 {
 }
Beispiel #38
0
 private bool IsLowerPrecedence(OperatorToken command)
 {
     if (functions.Count == 0) return false;
     return PriorityLevel(command) < PriorityLevel(functions[0]);
 }
Beispiel #39
0
 public ParenthesisExpression(OperatorToken left, Expression expression, OperatorToken right)
 {
     Left = left;
     Expression = expression;
     Right = right;
 }
Beispiel #40
0
 private void PushOperator(OperatorToken token)
 {
     functions.Add(token);
 }
Beispiel #41
0
        /*
        * Method:  FindNextToken
        *
        * Find the next token. Return 'true' if one was found. False, otherwise.
        */
        internal override bool FindNextToken()
        {
            int startPosition = _reader.Position;

            // VB docs claim whitespace is Unicode category Zs. However,
            // this category does not contain tabs. Assuming a less restrictive
            // definition for whitespace...
            if (_reader.SinkWhiteSpace())
            {
                while (_reader.SinkWhiteSpace())
                {
                }

                // Now, we need to check for the line continuation character.
                if (_reader.SinkLineContinuationCharacter())    // Line continuation is '_'
                {
                    // Save the current position because we may need to come back here.
                    int savePosition = _reader.Position - 1;

                    // Skip all whitespace after the '_'
                    while (_reader.SinkWhiteSpace())
                    {
                    }

                    // Now, skip all the newlines.
                    // Need at least one newline for this to count as line continuation.
                    int count = 0;
                    while (_reader.SinkNewLine())
                    {
                        ++count;
                    }

                    if (count > 0)
                    {
                        current = new VisualBasicTokenizer.LineContinuationToken();
                        return true;
                    }

                    // Otherwise, fall back to plain old whitespace.
                    _reader.Position = savePosition;
                }

                current = new WhitespaceToken();
                return true;
            }
            // Line terminators are separate from whitespace and are significant.
            else if (_reader.SinkNewLine())
            {
                // We want one token per line terminator.
                current = new VisualBasicTokenizer.LineTerminatorToken();
                return true;
            }
            // Check for a comment--either those that start with ' or rem.
            else if (_reader.SinkLineCommentStart())
            {
                // Skip to the first EOL.
                _reader.SinkToEndOfLine();

                current = new CommentToken();
                return true;
            }
            // Identifier or keyword?
            else if
            (
                // VB allows escaping of identifiers by surrounding them with []
                // In other words,
                //      Date is a keyword but,
                //      [Date] is an identifier.
                _reader.CurrentCharacter == '[' ||
                _reader.MatchNextIdentifierStart()
            )
            {
                bool escapedIdentifier = false;
                if (_reader.CurrentCharacter == '[')
                {
                    escapedIdentifier = true;
                    _reader.SinkCharacter();

                    // Now, the next character must be an identifier start.
                    if (!_reader.SinkIdentifierStart())
                    {
                        current = new ExpectedIdentifierToken();
                        return true;
                    }
                }

                // Sink the rest of the identifier.
                while (_reader.SinkIdentifierPart())
                {
                }

                // If this was an escaped identifier the we need to get the terminating ']'.
                if (escapedIdentifier)
                {
                    if (!_reader.Sink("]"))
                    {
                        current = new ExpectedIdentifierToken();
                        return true;
                    }
                }
                else
                {
                    // Escaped identifiers are not allowed to have trailing type character.
                    _reader.SinkTypeCharacter(); // Type character is optional.
                }

                // An identifier that is only a '_' is illegal because it is
                // ambiguous with line continuation
                string identifierOrKeyword = _reader.GetCurrentMatchedString(startPosition);
                if (identifierOrKeyword == "_" || identifierOrKeyword == "[_]" || identifierOrKeyword == "[]")
                {
                    current = new ExpectedIdentifierToken();
                    return true;
                }

                // Make an upper-case version in order to check whether this may be a keyword.
                string upper = identifierOrKeyword.ToUpper(CultureInfo.InvariantCulture);

                switch (upper)
                {
                    default:

                        if (Array.IndexOf(s_keywordList, upper) >= 0)
                        {
                            current = new KeywordToken();
                            return true;
                        }

                        // Create the token.
                        current = new IdentifierToken();

                        // Trim off the [] if this is an escaped identifier.
                        if (escapedIdentifier)
                        {
                            current.InnerText = identifierOrKeyword.Substring(1, identifierOrKeyword.Length - 2);
                        }
                        return true;
                    case "FALSE":
                    case "TRUE":
                        current = new BooleanLiteralToken();
                        return true;
                }
            }
            // Is it a hex integer?
            else if (_reader.SinkHexIntegerPrefix())
            {
                if (!_reader.SinkMultipleHexDigits())
                {
                    current = new ExpectedValidHexDigitToken();
                    return true;
                }

                // Sink a suffix if there is one.
                _reader.SinkIntegerSuffix();

                current = new HexIntegerLiteralToken();
                return true;
            }
            // Is it an octal integer?
            else if (_reader.SinkOctalIntegerPrefix())
            {
                if (!_reader.SinkMultipleOctalDigits())
                {
                    current = new VisualBasicTokenizer.ExpectedValidOctalDigitToken();
                    return true;
                }

                // Sink a suffix if there is one.
                _reader.SinkIntegerSuffix();

                current = new VisualBasicTokenizer.OctalIntegerLiteralToken();
                return true;
            }
            // Is it a decimal integer?
            else if (_reader.SinkMultipleDecimalDigits())
            {
                // Sink a suffix if there is one.
                _reader.SinkDecimalIntegerSuffix();

                current = new DecimalIntegerLiteralToken();
                return true;
            }
            // Preprocessor line
            else if (_reader.CurrentCharacter == '#')
            {
                if (_reader.SinkIgnoreCase("#if"))
                {
                    current = new OpenConditionalDirectiveToken();
                }
                else if (_reader.SinkIgnoreCase("#end if"))
                {
                    current = new CloseConditionalDirectiveToken();
                }
                else
                {
                    current = new PreprocessorToken();
                }

                _reader.SinkToEndOfLine();

                return true;
            }
            // Is it a separator?
            else if (_reader.SinkSeparatorCharacter())
            {
                current = new VisualBasicTokenizer.SeparatorToken();
                return true;
            }
            // Is it an operator?
            else if (_reader.SinkOperator())
            {
                current = new OperatorToken();
                return true;
            }
            // A string?
            else if (_reader.Sink("\""))
            {
                do
                {
                    // Inside a verbatim string "" is treated as a special character
                    while (_reader.Sink("\"\""))
                    {
                    }
                }
                while (!_reader.EndOfLines && _reader.SinkCharacter() != '\"');

                // Can't end a file inside a string
                if (_reader.EndOfLines)
                {
                    current = new EndOfFileInsideStringToken();
                    return true;
                }

                current = new StringLiteralToken();
                return true;
            }

            // We didn't recognize the token, so this is a syntax error.
            _reader.SinkCharacter();
            current = new UnrecognizedToken();
            return true;
        }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="operatorToken"></param>
 /// <param name="number"></param>
 /// <param name="postfix"></param>
 /// <returns></returns>
 public static ITranslationUnit BuildExpressionTranslationUnit(OperatorToken operatorToken, int number, bool postfix = true)
 {
     return UnaryExpressionTranslationUnit.Create(
         LiteralTranslationUnit<int>.Create(number), operatorToken,
         postfix ? UnaryExpressionTranslationUnit.UnaryPosition.Postfix : UnaryExpressionTranslationUnit.UnaryPosition.Prefix);
 }
Beispiel #43
0
 private int PriorityLevel(OperatorToken command)
 {
     switch (command) {
         case OperatorToken.OpenParen:
             return 1;
         case OperatorToken.LogicalAnd:
         case OperatorToken.LogicalOr:
         case OperatorToken.LogicalNot:
             return 2;
         case OperatorToken.LogicalEqual:
         case OperatorToken.LogicalNotEqual:
         case OperatorToken.GreaterThan:
         case OperatorToken.LessThan:
         case OperatorToken.GreaterThanOrEqual:
         case OperatorToken.LessThanOrEqual:
             return 3;
         case OperatorToken.Plus:
         case OperatorToken.Minus:
             return 4;
         case OperatorToken.Multiply:
         case OperatorToken.Divide:
         case OperatorToken.Modulus:
             return 5;
         case OperatorToken.CloseParen:
             return 6;
         default:
             return 0;
     }
 }
Beispiel #44
0
                private static Token[] GetInfixTokens(string term)
                {
                    //Leerzeichen entfernen und in Kleinbuchstaben konvertieren
                    term = term.Replace(" ", string.Empty).ToLowerInvariant();

                    var tokens = new List<Token>();

                    //mit RegEx alle Zahlen aussortieren
                    var numbers = parserRegEx.Matches(term);
                    term = parserRegEx.Replace(term, "1");

                    var sb = new StringBuilder(term);

                    //Term in Tokens teilen
                    var numberIndex = 0;
                    while (sb.Length > 0)
                    {
                        var validToken = false;

                        //Zahlen prüfen
                        if (sb.StartsWith("1"))
                        {
                            var t = new NumberToken();
                            t.ParseFromString(numbers[numberIndex].Groups["number"].Value);
                            tokens.Add(t);

                            numberIndex++;

                            //term = ReduceString(term, 1);
                            sb.Remove(0, 1);

                            validToken = true;
                        }

                        //Operatoren prüfen
                        if (!validToken)
                            for (int i = 0; i < operators.Length; i++)
                            {
                                var token = operators[i];
                                if (sb.StartsWith(token))
                                {
                                    var t = new OperatorToken();

                                    if ((token == '+' || token == '-') && (tokens.Count == 0 || tokens.Last().GetName() == "(")) //Vorzeichen
                                    {
                                        if (token == '-')
                                            t.ParseFromString("!");
                                    }
                                    else
                                        t.ParseFromString(token.ToString());

                                    tokens.Add(t);

                                    //term = ReduceString(term, 1);
                                    sb.Remove(0, 1);

                                    validToken = true;
                                    break;
                                }
                            }

                        //Funktionen prüfen
                        if (!validToken)
                            for (int i = 0; i < functions.Length; i++)
                            {
                                var token = functions[i];
                                if (sb.StartsWith(token))
                                {
                                    var t = new FunctionToken();
                                    t.ParseFromString(token);
                                    tokens.Add(t);

                                    //term = ReduceString(term, token.Length);
                                    sb.Remove(0, token.Length);

                                    validToken = true;
                                    break;
                                }
                            }

                        //Rest prüfen
                        if (!validToken)
                        {
                            if (sb.StartsWith("pi")) //Pi
                            {
                                var t = new NumberToken();
                                t.ParseFromString(System.Math.PI.ToString());
                                tokens.Add(t);

                                //term = ReduceString(term, 2);
                                sb.Remove(0, 2);
                            }

                            else if (sb.StartsWith("e")) //e
                            {
                                var t = new NumberToken();
                                t.ParseFromString(System.Math.E.ToString());
                                tokens.Add(t);

                                //term = ReduceString(term, 1);
                                sb.Remove(0, 1);
                            }

                            else if (sb.StartsWith("(")) //öffnende Klammer
                            {
                                var t = new SpecialToken();
                                t.ParseFromString("(");
                                tokens.Add(t);

                                //term = ReduceString(term, 1);
                                sb.Remove(0, 1);
                            }

                            else if (sb.StartsWith(")")) //schließende Klammer
                            {
                                var t = new SpecialToken();
                                t.ParseFromString(")");
                                tokens.Add(t);

                                //term = ReduceString(term, 1);
                                sb.Remove(0, 1);
                            }

                            else if (sb.StartsWith(";")) //Argumenttrennzeichen
                            {
                                var t = new SpecialToken();
                                t.ParseFromString(";");
                                tokens.Add(t);

                                //term = ReduceString(term, 1);
                                sb.Remove(0, 1);
                            }

                            else //Token nicht bekannt
                                throw new ArgumentException("Dieser Term enthält einen ungültigen Token.");
                        }
                    }

                    return tokens.ToArray();
                }