private void GenerateCodeForStandardOperator(SplitExpression expression) { OperatorToken theOperator = expression.Operator as OperatorToken; if (theOperator == null) { throw new CompilerMessage(ErrorCode.InternalError, "ProcessStandardOperator called without OperatorToken"); } if (expression.RightHandSide.Count < 1) { throw new CompilerMessage(ErrorCode.OperatorExpectsRightHandSide, "Expected expression after '" + expression.Operator.Name + "'"); } if (expression.LeftHandSide.Count < 1) { if (theOperator.HasLeftHandSide == RequiredState.Required) { throw new CompilerMessage(ErrorCode.OperatorExpectsLeftHandSide, "Expected expression before '" + expression.Operator.Name + "'"); } } else if (theOperator.HasLeftHandSide == RequiredState.NotAllowed) { throw new CompilerMessage(ErrorCode.OperatorDoesNotExpectLeftHandSide, "Unexpected expression before '" + expression.Operator.Name + "'"); } else { GenerateCodeForExpression(expression.LeftHandSide); } GenerateCodeForExpression(expression.RightHandSide); // TODO: Apply operator }
private void GenerateCodeForExpression(Expression expression) { Expression split = expression.SplitExpressionOnLowestPrecendenceOperator(); if (split is SplitExpression) { SplitExpression splitExpression = (SplitExpression)split; if (splitExpression.Operator is OperatorToken) { GenerateCodeForStandardOperator(splitExpression); } else { GenerateCodeForAssignmentOperator(splitExpression); } // TODO: Check type mismatch after expressions have been parsed //splitExpression.CheckForTypeMismatch(); //splitExpression.CheckOperatorCanBeAppliedToTheseTypes(); } else { GenerateCodeForExpressionWithoutOperator(split); } }
private void GenerateCodeForAssignmentOperator(SplitExpression expression) { KeywordToken theOperator = expression.Operator as KeywordToken; if ((theOperator == null) || (!theOperator.IsModificationOperator)) { throw new CompilerMessage(ErrorCode.InternalError, "GenerateCodeForAssignmentOperator called without KeywordToken"); } if (expression.LeftHandSide.Count < 1) { throw new CompilerMessage(ErrorCode.OperatorExpectsLeftHandSide, "Expected expression before '" + expression.Operator.Name + "'"); } if ((theOperator.SymbolType != PredefinedSymbol.PlusPlus) && (theOperator.SymbolType != PredefinedSymbol.MinusMinus)) { GenerateCodeForExpression(expression.RightHandSide); } if (theOperator.SymbolType != PredefinedSymbol.SetEqual) { GenerateCodeForExpression(expression.LeftHandSide); } // TODO: Apply operator //TODO: GenerateCodeToWriteNewVariableValue }
private void GenerateCodeForAssignmentOperator(SplitExpression expression) { KeywordToken theOperator = expression.Operator as KeywordToken; if ((theOperator == null) || (!theOperator.IsModificationOperator)) { throw new CompilerMessage(ErrorCode.InternalError, "GenerateCodeForAssignmentOperator called without KeywordToken"); } if (expression.LeftHandSide.Count < 1) { throw new CompilerMessage(ErrorCode.OperatorExpectsLeftHandSide, "Expected expression before '" + expression.Operator.Name + "'"); } if ((theOperator.SymbolType != PredefinedSymbol.PlusPlus) && (theOperator.SymbolType != PredefinedSymbol.MinusMinus)) { GenerateCodeForExpression(expression.RightHandSide); } if (theOperator.SymbolType != PredefinedSymbol.SetEqual) { GenerateCodeForExpression(expression.LeftHandSide); } // TODO: Apply operator //TODO: GenerateCodeToWriteNewVariableValue }
private void GenerateCodeForStandardOperator(SplitExpression expression) { OperatorToken theOperator = expression.Operator as OperatorToken; if (theOperator == null) { throw new CompilerMessage(ErrorCode.InternalError, "ProcessStandardOperator called without OperatorToken"); } if (expression.RightHandSide.Count < 1) { throw new CompilerMessage(ErrorCode.OperatorExpectsRightHandSide, "Expected expression after '" + expression.Operator.Name + "'"); } if (expression.LeftHandSide.Count < 1) { if (theOperator.HasLeftHandSide == RequiredState.Required) { throw new CompilerMessage(ErrorCode.OperatorExpectsLeftHandSide, "Expected expression before '" + expression.Operator.Name + "'"); } } else if (theOperator.HasLeftHandSide == RequiredState.NotAllowed) { throw new CompilerMessage(ErrorCode.OperatorDoesNotExpectLeftHandSide, "Unexpected expression before '" + expression.Operator.Name + "'"); } else { GenerateCodeForExpression(expression.LeftHandSide); } GenerateCodeForExpression(expression.RightHandSide); // TODO: Apply operator }