Beispiel #1
0
        void ParseTextToken(TextToken token)
        {
            var lastPart = CurrentParts.LastOrDefault();

            if (lastPart is Part.Operator operatorPart)
            {
                if (operatorPart.Value is Syntax.Operator.Structural.Member)
                {
                    var memberExpression = new Expression.MemberName(token.Content);
                    CurrentParts.Add(new Part.Operand(memberExpression));
                    return;
                }
            }

            if (Utils.TryParseLong(token.Content, out var literalValue))
            {
                CurrentParts.Add(new Part.Operand(new Literal(literalValue)));
                return;
            }
            if (NIFVersion.TryParse(token.Content, out var nifVersion))
            {
                CurrentParts.Add(new Part.Operand(new Literal(nifVersion)));
                return;
            }

            var paramtereExpression = new Expression.Parameter(token.Content);

            CurrentParts.Add(new Part.Operand(paramtereExpression));
            return;
        }
Beispiel #2
0
        public static TextToken Read(string source, ref int offset)
        {
            var endIndex = source.ToList().FindIndex(offset, c => !IsTextChar(c));
            var length   = (endIndex == -1 ? source.Length : endIndex) - offset;
            var token    = new TextToken(source.Substring(offset, length));

            offset += (length - 1);
            return(token);
        }
Beispiel #3
0
 public static Token ReadNextToken(string source, ref int offset)
 {
     if (SyntaxToken.IsSyntaxChar(source[offset]))
     {
         var(nextOffset, nextToken) = SyntaxToken.Read(source, offset);
         offset = nextOffset;
         return(nextToken);
     }
     else if (TextToken.IsTextChar(source[offset]))
     {
         return(TextToken.Read(source, ref offset));
     }
     else
     {
         return(null);
     }
 }
Beispiel #4
0
        static List <Token> CollapseAdjacentTextTokens(List <Token> input)
        {
            var output = new List <Token>();

            foreach (var token in input)
            {
                var prevToken = output.LastOrDefault();
                if (token is TextToken textToken)
                {
                    if (prevToken != null && prevToken is TextToken prevTextToken)
                    {
                        output[output.Count - 1] = TextToken.Merge(prevTextToken, textToken);
                        continue;
                    }
                }
                output.Add(token);
            }
            return(output);
        }
Beispiel #5
0
 public static TextToken Merge(TextToken a, TextToken b)
 {
     return(new TextToken($"{a.Content} {b.Content}"));
 }