Ejemplo n.º 1
0
        public override string ToString()
        {
            var builder = new StringBuilder();

            builder.Append(Identifier.ToString());
            builder.Append(LeftParen.ToString());
            builder.Append(Parameters.ToString());
            builder.Append(RightParen.ToString());

            return(builder.ToString());
        }
Ejemplo n.º 2
0
        private static NextToken ReadToken(this IEnumerable <CodeCharacter> code)
        {
            code = code.SkipWhile(c => c.IsWhitespace);

            if (!code.Any())
            {
                var token = new EndOfFile();
                return(new NextToken(token, () => ReadToken(code)));
            }

            var firstTokenChar = code.First();

            if (firstTokenChar.IsStartOfIdentifier)
            {
                var identifier = code
                                 .TakeWhile(c => c.IsBodyOfIdentifier)
                                 .Aggregate("", (s, c) => s + c.Value);

                code = code.SkipWhile(c => c.IsBodyOfIdentifier);

                var token = KeywordTable.ContainsKey(identifier)
                    ? KeywordTable[identifier].Invoke() as Token
                    : new Identifier();

                token.Value        = identifier;
                token.LineNumber   = firstTokenChar.LineNumber;
                token.LinePosition = firstTokenChar.LinePosition;
                return(new NextToken(token, () => ReadToken(code)));
            }

            if (firstTokenChar.IsDigit)
            {
                var number = code
                             .TakeWhile(c => c.IsDigit)
                             .Aggregate("", (s, c) => s + c.Value);

                code = code.Skip(number.Length);

                var token = new IntegerConstant();
                token.Value        = number;
                token.LineNumber   = firstTokenChar.LineNumber;
                token.LinePosition = firstTokenChar.LinePosition;
                return(new NextToken(token, () => ReadToken(code)));
            }

            if (firstTokenChar.IsStartOfStringLiteral)
            {
                var stringLiteral = code
                                    .Skip(1)
                                    .TakeWhile(c => c.Value != '"')
                                    .Aggregate("\"", (s, c) => s + c.Value)
                                    + '"';

                Debug.WriteLine(stringLiteral);

                code = code.Skip(stringLiteral.Length);

                var token = new StringLiteral();
                token.Value        = stringLiteral;
                token.LineNumber   = firstTokenChar.LineNumber;
                token.LinePosition = firstTokenChar.LinePosition;
                return(new NextToken(token, () => ReadToken(code)));
            }

            var t = new InvalidToken() as Token;

            switch (firstTokenChar.Value)
            {
            case '(': t = new LeftParen(); break;

            case ')': t = new RightParen(); break;

            case '{': t = new LeftCurlyBrace(); break;

            case '}': t = new RightCurlyBrace(); break;

            case '[': t = new LeftSquareBracket(); break;

            case ']': t = new RightSquareBracket(); break;

            case ',': t = new Comma(); break;

            case '*': t = new Asterisk(); break;

            case ';': t = new Semicolon(); break;
            }

            code = code.Skip(1);

            t.Value        = firstTokenChar.Value.ToString();
            t.LineNumber   = firstTokenChar.LineNumber;
            t.LinePosition = firstTokenChar.LinePosition;
            return(new NextToken(t, () => ReadToken(code)));
        }