public static (object, FunnyType) ParseValue(this TokFlow flow) { var syntaxNode = SyntaxNodeReader.ReadNodeOrNull(flow); return(ParseSyntaxNode(syntaxNode)); }
public static ExprListError GetExpressionListError( int openBracketTokenPos, TokFlow flow, TokType openBrack, TokType closeBrack) { flow.Move(openBracketTokenPos); var obrStart = flow.Current.Start; flow.MoveIfOrThrow(openBrack); var list = new List <ISyntaxNode>(); int currentToken = flow.CurrentTokenPosition; do { if (flow.IsCurrent(TokType.Sep)) { //[,] <-first element missed if (!list.Any()) { return(new ExprListError( ExprListErrorType.FirstElementMissed, list, new Interval(flow.Current.Start, flow.Current.Finish))); } //[x, ,y] <- element missed return(new ExprListError( ExprListErrorType.ElementMissed, list, new Interval(list.Last().Interval.Finish, flow.Current.Finish))); } var exp = SyntaxNodeReader.ReadNodeOrNull(flow); if (exp != null) { list.Add(exp); } if (exp == null && list.Any()) { flow.Move(currentToken); //[x,y, {no or bad expression here} ... return(SpecifyArrayInitError(list, flow, openBrack, closeBrack)); } currentToken = flow.CurrentTokenPosition; } while (flow.MoveIf(TokType.Sep)); if (flow.Current.Is(closeBrack)) { //everything seems fine... return(new ExprListError( ExprListErrorType.TotalyWrongDefinition, list, new Interval(obrStart, flow.Current.Finish))); } if (!list.Any()) { return(new ExprListError(ExprListErrorType.SingleOpenBracket, list, new Interval(obrStart, obrStart + 1))); } var position = flow.CurrentTokenPosition; var nextExpression = SyntaxNodeReader.ReadNodeOrNull(flow); flow.Move(position); if (nextExpression != null)//[x y] <- separator is missed { return(new ExprListError(ExprListErrorType.SepIsMissing, list, new Interval(list.Last().Interval.Finish, nextExpression.Interval.Start))); } //[x {some crappy crap here}] return(SpecifyArrayInitError(list, flow, openBrack, closeBrack)); }
private void AssertParsed(ISyntaxNode node, string expectedExpr) { var expectedExpression = SyntaxNodeReader.ReadNodeOrNull(Tokenizer.ToFlow(expectedExpr)); AssertEquals(expectedExpression, node); }