Esempio n. 1
0
        private void SimplifyTokenOnlyRules()
        {
            List <string> RemoveRules = new List <string>();

            foreach (RuleDeclaration rd in symbolTable._rules.Values)
            {
                bool flag = true;
                foreach (List <SubRulePart> branch in rd.SubRules)
                {
                    if (branch.Count != 1)
                    {
                        flag = false;
                    }
                    else if (branch[0].GetType() != typeof(SubRulePart))
                    {
                        flag = false;
                    }
                    else if (!branch[0].Name.StartsWith("\""))
                    {
                        flag = false;
                    }
                    else if (branch[0].Repetition != SubRuleRepetition.Once)
                    {
                        flag = false;
                    }
                }
                if (flag)
                {
                    RemoveRules.Add(rd.Name);
                }
            }
            Dictionary <string, int> Literals = GetLiteralUsesCount();

            foreach (string str in RemoveRules)
            {
                bool            flag = true;
                RuleDeclaration rd   = symbolTable._rules[str];
                foreach (List <SubRulePart> branch in rd.SubRules)
                {
                    if (Literals[branch[0].Name] != 1)
                    {
                        flag = false;
                    }
                }
                if (!flag)
                {
                    continue;
                }
                TokenDeclaration td = new TokenDeclaration();
                td.Name     = rd.Name;
                td.Location = rd.Location;
                foreach (List <SubRulePart> branch in rd.SubRules)
                {
                    td.Values.Add(branch[0].Name);
                }
                symbolTable._rules.Remove(str);
                symbolTable._allNames.Remove(str);
                symbolTable.AddToken(td);
            }
        }
Esempio n. 2
0
        public void RemoveToken(TokenDeclaration token)
        {
            if (!_allNames.Contains(token.Name))
            {
                return;
            }

            _tokens.Remove(token.Name);
            _allNames.Remove(token.Name);
        }
Esempio n. 3
0
 /// <summary>
 /// Заменяет именованные лексемы на списки строковых литералов
 /// </summary>
 /// <param name="l"></param>
 private void ReplaceTokensWithStrings(List <string> l, LexLocation location)
 {
     for (int i = 0; i < l.Count; ++i)
     {
         if (!l[i].StartsWith(StringConstants.StringQuote))
         {
             TokenDeclaration td = symbolTable.FindTokenList(l[i]);
             if (td == null)
             {
                 ErrorReporter.WriteError(ErrorMessages.NameNotDeclared, location, l[i]);
             }
             l.AddRange(td.Values);
             l.RemoveAt(i);
             --i;
         }
     }
 }
Esempio n. 4
0
        public string FindOrCreateToken(string Name)
        {
            string result = FindToken(Name);

            if (result != "")
            {
                return(result);
            }

            TokenDeclaration td = new TokenDeclaration();

            td.Name = GetNewName(Name);
            td.Values.Add(Name);
            AddToken(td);

            return(td.Name);
        }
Esempio n. 5
0
        public void AddToken(TokenDeclaration token)
        {
            if (_allNames.Contains(token.Name))
            {
                return;
            }

            foreach (string s in token.Values)
            {
                if (FindToken(s) != "")
                {
                    ErrorReporter.WriteError(ErrorMessages.NameAlreadyDefined, token.Location, token.Name);
                    return;
                }
            }

            _tokens.Add(token.Name, token);
            _allNames.Add(token.Name);
        }
Esempio n. 6
0
        public string FindOrCreateToken(string Name)
        {
            string result = FindToken(Name);
            if (result != "")
                return result;

            TokenDeclaration td = new TokenDeclaration();
            td.Name = GetNewName(Name);
            td.Values.Add(Name);
            AddToken(td);

            return td.Name;
        }
Esempio n. 7
0
        public void RemoveToken(TokenDeclaration token)
        {
            if (!_allNames.Contains(token.Name))
                return;

            _tokens.Remove(token.Name);
            _allNames.Remove(token.Name);
        }
Esempio n. 8
0
        public void AddToken(TokenDeclaration token)
        {
            if (_allNames.Contains(token.Name))
                return;

            foreach (string s in token.Values)
                if (FindToken(s) != "")
                {
                    ErrorReporter.WriteError(ErrorMessages.NameAlreadyDefined, token.Location, token.Name);
                    return;
                }

            _tokens.Add(token.Name, token);
            _allNames.Add(token.Name);
        }
Esempio n. 9
0
 private void SimplifyTokenOnlyRules()
 {
     List<string> RemoveRules = new List<string>();
     foreach (RuleDeclaration rd in symbolTable._rules.Values)
     {
         bool flag = true;
         foreach (List<SubRulePart> branch in rd.SubRules)
         {
             if (branch.Count != 1)
                 flag = false;
             else if (branch[0].GetType() != typeof(SubRulePart))
                 flag = false;
             else if (!branch[0].Name.StartsWith("\""))
                 flag = false;
             else if (branch[0].Repetition != SubRuleRepetition.Once)
                 flag = false;
         }
         if (flag)
             RemoveRules.Add(rd.Name);
     }
     Dictionary<string, int> Literals = GetLiteralUsesCount();
     foreach (string str in RemoveRules)
     {
         bool flag = true;
         RuleDeclaration rd = symbolTable._rules[str];
         foreach (List<SubRulePart> branch in rd.SubRules)
             if (Literals[branch[0].Name] != 1)
                 flag = false;
         if (!flag)
             continue;
         TokenDeclaration td = new TokenDeclaration();
         td.Name = rd.Name;
         td.Location = rd.Location;
         foreach (List<SubRulePart> branch in rd.SubRules)
             td.Values.Add(branch[0].Name);
         symbolTable._rules.Remove(str);
         symbolTable._allNames.Remove(str);
         symbolTable.AddToken(td);
     }
 }