Пример #1
0
        /// <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;
        }
Пример #2
0
 /// <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);
     }
 }