Пример #1
0
        private void SkipWhiteSpace(ExpressionTokenParser parser)
        {
            var pt = parser.Peek();

            while (pt?.TokenPeek != null && pt.TokenPeek.TokenName == ExpressionTokenParser.Tokens.Whitespace)
            {
                parser.GetToken();
                pt = parser.Peek();
            }
        }
Пример #2
0
        private ushort ParseExpression(string exp, bool labelScan)
        {
            var parser = new ExpressionTokenParser { InputString = exp };
            var values = new Stack<ushort>();
            var operators = new Stack<ExpressionTokenParser.Tokens>();

            SkipWhiteSpace(parser);
            var token = parser.GetToken();

            while (token != null)
            {
                SkipWhiteSpace(parser);

                if (token.TokenName == ExpressionTokenParser.Tokens.Integer ||
                    token.TokenName == ExpressionTokenParser.Tokens.HexNumber ||
                    token.TokenName == ExpressionTokenParser.Tokens.HexNumber ||
                    token.TokenName == ExpressionTokenParser.Tokens.Identifier)
                {
                    ushort val;

                    switch (token.TokenName)
                    {
                        case ExpressionTokenParser.Tokens.HexNumber:
                            val = ushort.Parse(token.TokenValue.Remove(0, 1), System.Globalization.NumberStyles.HexNumber);
                            break;
                        case ExpressionTokenParser.Tokens.BinaryNumber:
                            val = Convert.ToUInt16(token.TokenValue.Remove(0, 1), 2);
                            break;
                        case ExpressionTokenParser.Tokens.Identifier:
                            if (!_equateTable.ContainsKey(token.TokenValue.Trim().ToUpper()))
                            {
                                if (!labelScan)
                                    throw new Exceptions.UndefinedLabelException(
                                        $"The label {token.TokenValue.Trim().ToUpper()} has not been defined, at line {_lineNumber}!");
                            }

                            val = _equateTable.ContainsKey(token.TokenValue.Trim().ToUpper())
                                ? _equateTable[token.TokenValue.Trim().ToUpper()]
                                : (ushort)0;
                            break;
                        default:
                            val = ushort.Parse(token.TokenValue);
                            break;
                    }

                    values.Push(val);
                }
                else if (token.TokenName == ExpressionTokenParser.Tokens.Lparen)
                {
                    operators.Push(token.TokenName);
                }
                else if (token.TokenName == ExpressionTokenParser.Tokens.Rparen)
                {
                    while (operators.Peek() != ExpressionTokenParser.Tokens.Lparen)
                    {
                        values.Push(ApplyOperation(operators.Pop(), values.Pop(), values.Pop()));
                    }

                    operators.Pop();
                }
                else if (token.TokenName == ExpressionTokenParser.Tokens.Plus ||
                         token.TokenName == ExpressionTokenParser.Tokens.Minus ||
                         token.TokenName == ExpressionTokenParser.Tokens.Asterisk)
                {
                    while (operators.Count > 0 && HasPrecedence(token.TokenName, operators.Peek()))
                    {
                        if (values.Count == 0) values.Push(0);
                        values.Push(ApplyOperation(operators.Pop(), values.Pop(), values.Pop()));
                    }

                    operators.Push(token.TokenName);
                }

                SkipWhiteSpace(parser);
                token = parser.GetToken();
            }

            while (operators.Count > 0)
            {
                values.Push(ApplyOperation(operators.Pop(), values.Pop(), values.Pop()));
            }

            return values.Pop();
        }