Ejemplo n.º 1
0
        /// <summary>
        /// Считывание очередного токена
        /// </summary>
        private void ScanToken()
        {
            DfmTokenInfo t = lanalyser.Token;

            token     = t.Token;
            currentId = t.Text;
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Считывание очередного токена выделением ключевых слов
 /// </summary>
 private void SkipScan()
 {
     Scan();
     if ((token == DfmTokens.Id) && keywords.ContainsKey(currentId.ToLower()))
     {
         token = keywords[currentId.ToLower()];
     }
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Инициализация
 /// </summary>
 private void Initialize()
 {
     InitKeyWords();
     InitKeySymbols();
     InitFileMap();
     index     = 0;
     token     = DfmTokens.Undefined;
     currentId = string.Empty;
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Считывание очередного токена с заглядыванием назад
 /// </summary>
 /// <param name="t">предыдущий токен</param>
 private void Match(DfmTokens t)
 {
     if (t == token)
     {
         ScanToken();
     }
     else
     {
         Panic(SyntaxTranslationError.UnexpectedToken);
     }
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Инициализация
 /// </summary>
 private void Initialize()
 {
     InitErrors();
     rootObjects = new List <string>();
     token       = DfmTokens.Undefined;
 }
Ejemplo n.º 6
0
 public DfmTokenInfo(DfmTokens token, string text, int line)
 {
     this.token = token;
     this.text  = text;
     this.line  = line;
 }
Ejemplo n.º 7
0
        /// <summary>
        /// Считывание очередного токена
        /// </summary>
        private void Scan()
        {
            token     = DfmTokens.Undefined;
            currentId = string.Empty;
            if (index >= source.Length)
            {
                token = DfmTokens.FileEnd;
                return;
            }
            char c;
            int  state = 1;

            while (index < source.Length)
            {
                c = source[index];
                switch (state)
                {
                case 1:
                    if (DelphiAnalyser.Addition.DChar.IsLetter(c) || (c == '_'))
                    {
                        currentId += c;
                        token      = DfmTokens.Id;
                        state      = 2;
                    }
                    else if (DelphiAnalyser.Addition.DChar.IsHexSymbol(c))
                    {
                        currentId += c;
                        token      = DfmTokens.Digits;
                        state      = 3;
                    }
                    else
                    {
                        switch (c)
                        {
                        case '$':
                            state = 4;
                            break;

                        case '#':
                            state = 6;
                            break;

                        case '\'':
                            state = 8;
                            break;

                        case '\n':
                            filemap.AddLine(index + 1);
                            break;

                        case '.':
                        case '(':
                        case ')':
                        case '[':
                        case ']':
                        case '<':
                        case '>':
                        case '{':
                        case '}':
                        case '=':
                        case '+':
                        case '-':
                        case ':':
                        case ',':
                            index++;
                            token = keysymbols[c.ToString()];
                            return;
                        }
                    }
                    break;

                case 2:
                    if (DelphiAnalyser.Addition.DChar.IsLetterOrDigit(c) || (c == '_'))
                    {
                        currentId += c;
                    }
                    else
                    {
                        return;
                    }
                    break;

                case 3:
                    if (DelphiAnalyser.Addition.DChar.IsHexSymbol(c))
                    {
                        currentId += c;
                    }
                    else
                    {
                        return;
                    }
                    break;

                case 4:
                    if (DelphiAnalyser.Addition.DChar.IsHexSymbol(c))
                    {
                        currentId += c;
                        token      = DfmTokens.HexConstant;
                        state      = 5;
                    }
                    break;

                case 5:
                    if (DelphiAnalyser.Addition.DChar.IsHexSymbol(c))
                    {
                        currentId += c;
                    }
                    else
                    {
                        return;
                    }
                    break;

                case 6:
                    if (DelphiAnalyser.Addition.DChar.IsDigit(c))
                    {
                        currentId += c;
                        token      = DfmTokens.Char;
                        state      = 7;
                    }
                    else if (c == '$')
                    {
                        currentId += c;
                        state      = 9;
                    }
                    else
                    {
                        return;
                    }
                    break;

                case 7:
                    if (DelphiAnalyser.Addition.DChar.IsDigit(c))
                    {
                        currentId += c;
                    }
                    else
                    {
                        return;
                    }
                    break;

                case 8:
                    if (c == '\'')
                    {
                        token = (currentId.Length == 1) ? DfmTokens.Char : DfmTokens.String;
                        index++;
                        return;
                    }
                    else if (c == '\n')
                    {
                        return;
                    }
                    else
                    {
                        currentId += c;
                    }
                    break;

                case 9:
                    if (DelphiAnalyser.Addition.DChar.IsHexSymbol(c))
                    {
                        currentId += c;
                        token      = DfmTokens.Char;
                        state      = 10;
                    }
                    else
                    {
                        return;
                    }
                    break;

                case 10:
                    if (DelphiAnalyser.Addition.DChar.IsHexSymbol(c))
                    {
                        currentId += c;
                    }
                    else
                    {
                        return;
                    }
                    break;
                }
                index++;
            }
        }