private void SkipWhiteSpace(ExpressionTokenParser parser) { var pt = parser.Peek(); while (pt?.TokenPeek != null && pt.TokenPeek.TokenName == ExpressionTokenParser.Tokens.Whitespace) { parser.GetToken(); pt = parser.Peek(); } }
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(); }