/// <summary> /// Считывание очередного токена /// </summary> private void ScanToken() { DfmTokenInfo t = lanalyser.Token; token = t.Token; currentId = t.Text; }
/// <summary> /// Считывание очередного токена выделением ключевых слов /// </summary> private void SkipScan() { Scan(); if ((token == DfmTokens.Id) && keywords.ContainsKey(currentId.ToLower())) { token = keywords[currentId.ToLower()]; } }
/// <summary> /// Инициализация /// </summary> private void Initialize() { InitKeyWords(); InitKeySymbols(); InitFileMap(); index = 0; token = DfmTokens.Undefined; currentId = string.Empty; }
/// <summary> /// Считывание очередного токена с заглядыванием назад /// </summary> /// <param name="t">предыдущий токен</param> private void Match(DfmTokens t) { if (t == token) { ScanToken(); } else { Panic(SyntaxTranslationError.UnexpectedToken); } }
/// <summary> /// Инициализация /// </summary> private void Initialize() { InitErrors(); rootObjects = new List <string>(); token = DfmTokens.Undefined; }
public DfmTokenInfo(DfmTokens token, string text, int line) { this.token = token; this.text = text; this.line = line; }
/// <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++; } }