/// <summary> /// Самый главный метод /// </summary> /// <param name="source"></param> public SymbolTable ParseSourceFile(SourceFile source) { RuleDeclaration.ParsingStage = false; if (Options.ExtensionList.Count > 0) Options.Extension = (Options.ExtensionList[0]); else Options.Extension = StringConstants.DefaultExtension; if (Options.Extension == "\"*\"") Options.Extension = "\"any\""; Options.BaseClassName = Options.Extension.Substring(1, Options.Extension.Length - 2).ToUpper() + StringConstants.PPGBaseClassName; //добавляем предопределенные сущности: error, состояния пропуска по директиве AddPredefinedEntities(); //Переносим сущности из исходного файла в таблицу символов AddSourceEntitiesToSymbolTable(source); //Проверяем наличие всех используемых имен CheckExistenceOfUsedNames(); if (ErrorReporter.ErrorCount != 0) return null; //преобразуем правила в лексемы, если правило состоит только из нескольких веток по 1 лексеме каждая SimplifyTokenOnlyRules(); //чтобы не генерировать ненужные узлы для дерева, помечаем безымянные правила(без символов @) как "сгенерированные" MarkUnnamedRules(); //и помечаем правила, не использующиеся нигде со знаком # как не образующие сущность MarkRulesWithoutNode(); //поиск и преобразование однородных наборов (List) ReplaceUniformListsWithRules(); //находим строковые литералы в ветках правил, добавляем их к лексемам. DeclareInlinedTokens(); //в директивах пропуска заменяем строковые литералы на лексемы InlineTokensInUnnamedSkips(); //Ищем все вхождения ANY/ANYEXCEPT и генерируем для них правила. ConvertANYToRules(); //Избавляемся от квадратных скобок, создавая вместо них правила ConvertComplexSubruleParts(); //Избавляемся от знаков повторения (+*?), создавая правила для помеченных ими символов ExpandRules(); //Дописываем к правилам действия AddActionsToRules(); //Генерируем предопределенные правила с предопределенными действиями, если надо. GeneratePredefinedRules(); return symbolTable; }
/// <summary> /// Добавление сущностей из исходного файла в таблицу символов /// </summary> /// <param name="source"></param> private void AddSourceEntitiesToSymbolTable(SourceFile source) { foreach (Declaration d in source.Declarations) { if (d is TokenDeclaration) symbolTable.AddToken(d as TokenDeclaration); if (d is SkipDeclaration) symbolTable.AddSkip(d as SkipDeclaration); if (d is RuleDeclaration) symbolTable.AddRule(d as RuleDeclaration); } }