コード例 #1
0
        private void ScanNumber()
        {
            string scannedSymbol       = "";
            bool   hasDecimalSeparator = false;
            char   prevCh = currentCharacter.Value;

            while (LexicalUtils.IsDigit(currentCharacter.Value) || LexicalUtils.IsDecimalSeparator(currentCharacter.Value))
            {
                if (LexicalUtils.IsDecimalSeparator(currentCharacter.Value))
                {
                    if (hasDecimalSeparator)
                    {
                        if (LexicalUtils.IsDecimalSeparator(prevCh))
                        {
                            CurrentSymbol = SymbolEnum.IntConstant;
                            IntConstant   = int.Parse(scannedSymbol.Substring(0, scannedSymbol.Length - 1));
                            symbolQueue.Enqueue(SymbolEnum.TwoDots);
                            currentCharacter = ioModule.NextCh();
                            return;
                        }
                        else
                        {
                            break;
                        }
                    }

                    hasDecimalSeparator = true;
                }
                scannedSymbol   += currentCharacter.Value.ToString();
                prevCh           = currentCharacter.Value;
                currentCharacter = ioModule.NextCh();
            }

            if (hasDecimalSeparator)
            {
                double result;
                if (double.TryParse(scannedSymbol, NumberStyles.Any, CultureInfo.InvariantCulture, out result) && result < MAX_FLOAT_CONSTANT)
                {
                    CurrentSymbol = SymbolEnum.RealConstant;
                    FloatConstant = result;
                }
                else
                {
                    Error = ioModule.AddError(207, CurrentLineNumber, CurrentPositionInLine);
                }
            }
            else
            {
                int result;
                if (int.TryParse(scannedSymbol, out result) && result < MAX_INT_CONSTANT)
                {
                    CurrentSymbol = SymbolEnum.IntConstant;
                    IntConstant   = result;
                }
                else
                {
                    Error = ioModule.AddError(203, CurrentLineNumber, CurrentPositionInLine);
                }
            }
        }
コード例 #2
0
        private void ScanIdentifier()
        {
            string scannedSymbol = "";

            while (LexicalUtils.IsIdentifierChar(currentCharacter.Value))
            {
                scannedSymbol   += currentCharacter.Value.ToString();
                currentCharacter = ioModule.NextCh();
            }

            SymbolEnum keyword;

            if (Symbol.keywordMapping.TryGetValue(scannedSymbol, out keyword))
            {
                CurrentSymbol = keyword;
            }
            else
            {
                CurrentSymbol = SymbolEnum.Identifier;
                NameTable.Add(scannedSymbol);
                IdentifierName = scannedSymbol;
            }
        }
コード例 #3
0
        private void ScanSymbol()
        {
            if (LexicalUtils.IsDigit(currentCharacter.Value))
            {
                ScanNumber();
            }
            else if (LexicalUtils.IsStringConstantStart(currentCharacter.Value))
            {
                ScanString();
            }
            else if (LexicalUtils.IsIdentifierStart(currentCharacter.Value))
            {
                ScanIdentifier();
            }
            else
            {
                switch (currentCharacter.Value)
                {
                case '<':
                    currentCharacter = ioModule.NextCh();
                    if (currentCharacter.Value == '=')
                    {
                        CurrentSymbol    = SymbolEnum.LessEquals;
                        currentCharacter = ioModule.NextCh();
                    }
                    else
                    {
                        if (currentCharacter.Value == '>')
                        {
                            CurrentSymbol    = SymbolEnum.NotEquals;
                            currentCharacter = ioModule.NextCh();
                        }
                        else
                        {
                            CurrentSymbol = SymbolEnum.Less;
                        }
                    }
                    break;

                case '>':
                    currentCharacter = ioModule.NextCh();
                    if (currentCharacter.Value == '=')
                    {
                        CurrentSymbol    = SymbolEnum.GreaterEquals;
                        currentCharacter = ioModule.NextCh();
                    }
                    else
                    {
                        CurrentSymbol = SymbolEnum.Less;
                    }
                    break;

                case ':':
                    currentCharacter = ioModule.NextCh();
                    if (currentCharacter.Value == '=')
                    {
                        CurrentSymbol    = SymbolEnum.Assign;
                        currentCharacter = ioModule.NextCh();
                    }
                    else
                    {
                        CurrentSymbol = SymbolEnum.Colon;
                    }
                    break;

                case '+':
                    CurrentSymbol    = SymbolEnum.Plus;
                    currentCharacter = ioModule.NextCh();
                    break;

                case '-':
                    CurrentSymbol    = SymbolEnum.Minus;
                    currentCharacter = ioModule.NextCh();
                    break;

                case '*':
                    CurrentSymbol    = SymbolEnum.Star;
                    currentCharacter = ioModule.NextCh();
                    break;

                case '/':
                    CurrentSymbol    = SymbolEnum.Slash;
                    currentCharacter = ioModule.NextCh();
                    break;

                case '=':
                    CurrentSymbol    = SymbolEnum.Equals;
                    currentCharacter = ioModule.NextCh();
                    break;

                case '(':
                    currentCharacter = ioModule.NextCh();
                    if (currentCharacter.Value == '*')
                    {
                        ScanMultilineComment();
                    }
                    else
                    {
                        CurrentSymbol = SymbolEnum.LeftRoundBracket;
                    }
                    break;

                case ')':
                    CurrentSymbol    = SymbolEnum.RightRoundBracket;
                    currentCharacter = ioModule.NextCh();
                    break;

                case '[':
                    CurrentSymbol    = SymbolEnum.LeftSquareBracket;
                    currentCharacter = ioModule.NextCh();
                    break;

                case ']':
                    CurrentSymbol    = SymbolEnum.RightSquareBracket;
                    currentCharacter = ioModule.NextCh();
                    break;

                case '{':
                    CurrentSymbol    = SymbolEnum.LeftCurlyBracket;
                    currentCharacter = ioModule.NextCh();
                    break;

                case '}':
                    CurrentSymbol    = SymbolEnum.RightCurlyBracket;
                    currentCharacter = ioModule.NextCh();
                    break;

                case '.':
                    currentCharacter = ioModule.NextCh();
                    if (currentCharacter.Value == '.')
                    {
                        CurrentSymbol    = SymbolEnum.TwoDots;
                        currentCharacter = ioModule.NextCh();
                    }
                    else
                    {
                        CurrentSymbol = SymbolEnum.Dot;
                    }
                    break;

                case ',':
                    CurrentSymbol    = SymbolEnum.Comma;
                    currentCharacter = ioModule.NextCh();
                    break;

                case '^':
                    CurrentSymbol    = SymbolEnum.Arrow;
                    currentCharacter = ioModule.NextCh();
                    break;

                case ';':
                    CurrentSymbol    = SymbolEnum.Semicolon;
                    currentCharacter = ioModule.NextCh();
                    break;

                default:
                    Error = ioModule.AddError(6, CurrentLineNumber, CurrentPositionInLine);
                    break;
                }
            }
        }