private ArmExpressionToken Expect(ref ArmExpressionTokenizer tokenizer, ArmExpressionTokenType expectedTokenType) { ArmExpressionToken token = tokenizer.NextToken(); if (token.Type != expectedTokenType) { throw Error($"Expected token of type '{expectedTokenType}' but instead got '{token}' at index {tokenizer.PreviousIndex} in input '{tokenizer.Input}'"); } return(token); }
private ArmOperation ParseIdentifierExpression(ref ArmExpressionTokenizer tokenizer, ArmExpressionIdentifierToken identifier) { ArmExpressionToken token = tokenizer.NextToken(); switch (token.Type) { case ArmExpressionTokenType.OpenParen: ArmOperation expression = ParseCallExpression(ref tokenizer, identifier); return(ParseDotExpression(ref tokenizer, expression)); default: throw Error($"Expected a token of type '{ArmExpressionTokenType.OpenParen}' but instead got '{token}' in '{tokenizer.Input}' at index '{tokenizer.PreviousIndex}'"); } }
private IArmString ParseInnerExpression(ref ArmExpressionTokenizer tokenizer, bool noLiteral = false) { ArmExpressionToken token = tokenizer.NextToken(); switch (token.Type) { case ArmExpressionTokenType.String: if (noLiteral) { throw Error($"Expected a literal token but found a string in '{tokenizer.Input}' at index {tokenizer.PreviousIndex}"); } return(new ArmStringLiteral(token.CoerceToString())); case ArmExpressionTokenType.Identifier: return(ParseIdentifierExpression(ref tokenizer, (ArmExpressionIdentifierToken)token)); default: throw Error($"Expected an expression token but found '{token}' in '{tokenizer.Input}' at index {tokenizer.PreviousIndex}"); } }
private ArmOperation ParseDotExpression(ref ArmExpressionTokenizer tokenizer, ArmOperation lhs) { ArmExpressionToken token = tokenizer.NextToken(); switch (token.Type) { case ArmExpressionTokenType.Dot: token = tokenizer.NextToken(); switch (token.Type) { case ArmExpressionTokenType.Identifier: return(ParseDotExpression(ref tokenizer, new ArmMemberAccessExpression(lhs, new ArmStringLiteral(((ArmExpressionIdentifierToken)token).Identifier)))); default: throw Error($"Expected token of type '{ArmExpressionTokenType.Identifier}' after '.' but instead got '{token}' at index {tokenizer.PreviousIndex} in input '{tokenizer.Input}'"); } default: tokenizer.UngetToken(token); return(lhs); } }
public void UngetToken(ArmExpressionToken token) { _i = _oldIndex; }