示例#1
0
 private void ReportError(Error error, BufferPosition position, params object[] args)
 {
     if (OnError != null)
     {
         OnError(this, new ErrorEventArgs(error, position, args));
     }
 }
示例#2
0
 private void ReportError(Error error, BufferPosition position, params object[] args)
 {
     if (OnError != null)
     {
         OnError(this, new FileLexerErrorEventArgs(error, lineMap.Map(position), args));
     }
 }
示例#3
0
        private void ReportError(Error error)
        {
            BufferPosition position = text.Position;

            position.Line -= 1;
            ReportError(error, position);
        }
示例#4
0
        private void ReportFormattedError(Error error, params object[] args)
        {
            BufferPosition position = text.Position;

            position.Line -= 1;
            ReportError(error, position, args);
        }
示例#5
0
        private BufferPosition TakePosition()
        {
            lastLine = text.Line;
            BufferPosition position = this.position;

            ClearPosition();

            return(position);
        }
示例#6
0
        /// <summary>
        ///     Map a buffer position to a position in a file.
        /// </summary>
        public FilePosition Map(BufferPosition from)
        {
            MapEntry entry = FindEntry(from.Line);

            return(new FilePosition(
                       new BufferPosition(
                           entry.To + (from.Line - entry.From),
                           from.Column + 1,
                           from.Offset),
                       entry.FileName));
        }
示例#7
0
        public int CompareTo(BufferPosition pos)
        {
            if (this < pos)
            {
                return(-1);
            }

            if (this == pos)
            {
                return(0);
            }

            return(1);
        }
示例#8
0
        public PreprocessorToken NextToken(TextBuffer text)
        {
            this.text = text;

            SkipWhiteSpace();
            BufferPosition position = text.Position;

            char ch = PeekChar();

            if (ch == '\0' || IsLineSeparator(ch))
            {
                return(NewPpToken(PreprocessorTokenType.EndOfLine, position));
            }

            ch = NextChar();

            switch (ch)
            {
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
            {
                int intValue = ch - '0';

                while (IsDigit(PeekChar()))
                {
                    int value10 = intValue * 10;

                    if (value10 < intValue)
                    {
                        ReportError(LexError.NumericConstantOverflow);
                    }
                    else
                    {
                        intValue = value10 + (NextChar() - '0');
                    }
                }

                return(new PreprocessorIntToken(intValue, position));
            }

            case '=':

                if (PeekChar() == '=')
                {
                    NextChar();

                    return(NewPpToken(PreprocessorTokenType.EqualEqual, position));
                }

                break;

            case '!':

                if (PeekChar() == '=')
                {
                    NextChar();

                    return(NewPpToken(PreprocessorTokenType.NotEqual, position));
                }
                else
                {
                    return(NewPpToken(PreprocessorTokenType.Not, position));
                }

            case '&':

                if (PeekChar() == '&')
                {
                    NextChar();

                    return(NewPpToken(PreprocessorTokenType.And, position));
                }

                break;

            case '|':

                if (PeekChar() == '|')
                {
                    NextChar();

                    return(NewPpToken(PreprocessorTokenType.Or, position));
                }

                break;

            case '(':

                return(NewPpToken(PreprocessorTokenType.OpenParen, position));

            case ')':

                return(NewPpToken(PreprocessorTokenType.CloseParen, position));

            case '"':
                value.Length = 0;

                while ((ch = PeekChar()) != '"')
                {
                    if (Eof)
                    {
                        ReportError(LexError.UnexpectedEndOfFileString);

                        break;
                    }

                    if (IsLineSeparator(ch))
                    {
                        ReportError(LexError.WhiteSpaceInConstant);

                        break;
                    }

                    value.Append(ch);
                    NextChar();
                }

                NextChar();

                return(new PreprocessorStringToken(value.ToString(), position));

            case '/':

                if (PeekChar() == '/')
                {
                    IgnoreRestOfLine();

                    return(NewPpToken(PreprocessorTokenType.EndOfLine, position));
                }

                break;

            default:

                if (IsLineSeparator(ch))
                {
                    return(NewPpToken(PreprocessorTokenType.EndOfLine, position));
                }

                if (!IsIdentifierChar(ch))
                {
                    break;
                }

                value.Length = 0;
                value.Append(ch);
                while (IsIdentifierChar(PeekChar()))
                {
                    value.Append(NextChar());
                }
                Name id = nameTable.Add(value);
                PreprocessorTokenType type = keywords.IsKeyword(id);

                if (type != PreprocessorTokenType.Invalid)
                {
                    return(NewPpToken(type, position));
                }
                else
                {
                    return(new PreprocessorIdentifierToken(id, position));
                }
            }

            return(NewPpToken(PreprocessorTokenType.Unknown, position));
        }
示例#9
0
 private PreprocessorToken NewPpToken(PreprocessorTokenType type, BufferPosition position)
 {
     return(new PreprocessorToken(type, position));
 }
示例#10
0
 private void StartToken()
 {
     position = text.Position;
 }
示例#11
0
 private void ClearPosition()
 {
     position = new BufferPosition();
 }
示例#12
0
 public PreprocessorToken(PreprocessorTokenType type, BufferPosition position)
 {
     Type     = type;
     Position = position;
 }