Exemplo n.º 1
0
 private static void addLeftMost(NormalProduction prod, Expansion exp)
 {
     if (exp is NonTerminal)
     {
         for (int i = 0; i < prod.LeIndex; i++)
         {
             if (prod.LeftExpansions[i] == ((NonTerminal)exp).Production)
             {
                 return;
             }
         }
         if (prod.LeIndex == prod.LeftExpansions.Length)
         {
             NormalProduction[] newle = new NormalProduction[prod.LeIndex * 2];
             Array.Copy(prod.LeftExpansions, 0, newle, 0, prod.LeIndex);
             prod.LeftExpansions = newle;
         }
         prod.LeftExpansions[prod.LeIndex++] = ((NonTerminal)exp).Production;
     }
     else if (exp is OneOrMore)
     {
         addLeftMost(prod, ((OneOrMore)exp).Expansion);
     }
     else if (exp is ZeroOrMore)
     {
         addLeftMost(prod, ((ZeroOrMore)exp).Expansion);
     }
     else if (exp is ZeroOrOne)
     {
         addLeftMost(prod, ((ZeroOrOne)exp).Expansion);
     }
     else if (exp is Choice)
     {
         foreach (var choice in ((Choice)exp).Choices)
         {
             addLeftMost(prod, choice);
         }
     }
     else if (exp is Sequence)
     {
         foreach (var unit in ((Sequence)exp).Units)
         {
             addLeftMost(prod, unit);
             if (!EmptyExpansionExists(unit))
             {
                 break;
             }
         }
     }
     else if (exp is TryBlock)
     {
         addLeftMost(prod, ((TryBlock)exp).Expansion);
     }
 }
Exemplo n.º 2
0
 private static bool prodWalk(NormalProduction prod)
 {
     prod.WalkStatus = -1;
     for (int i = 0; i < prod.LeIndex; i++)
     {
         if (prod.LeftExpansions[i].WalkStatus == -1)
         {
             prod.LeftExpansions[i].WalkStatus = -2;
             loopString = prod.Lhs + "... --> " + prod.LeftExpansions[i].Lhs + "...";
             if (prod.WalkStatus == -2)
             {
                 prod.WalkStatus = 1;
                 CSharpCCErrors.SemanticError(prod, "Left recursion detected: \"" + loopString + "\"");
                 return(false);
             }
             else
             {
                 prod.WalkStatus = 1;
                 return(true);
             }
         }
         else if (prod.LeftExpansions[i].WalkStatus == 0)
         {
             if (prodWalk(prod.LeftExpansions[i]))
             {
                 loopString = prod.Lhs + "... --> " + loopString;
                 if (prod.WalkStatus == -2)
                 {
                     prod.WalkStatus = 1;
                     CSharpCCErrors.SemanticError(prod, "Left recursion detected: \"" + loopString + "\"");
                     return(false);
                 }
                 else
                 {
                     prod.WalkStatus = 1;
                     return(true);
                 }
             }
         }
     }
     prod.WalkStatus = 1;
     return(false);
 }
Exemplo n.º 3
0
 public static void addproduction(NormalProduction p)
 {
     CSharpCCGlobals.bnfproductions.Add(p);
 }
Exemplo n.º 4
0
        public static IList <MatchInfo> genFirstSet(IList <MatchInfo> partialMatches, Expansion exp)
        {
            if (exp is RegularExpression)
            {
                IList <MatchInfo> retval = new List <MatchInfo>();
                for (int i = 0; i < partialMatches.Count; i++)
                {
                    MatchInfo m    = (MatchInfo)partialMatches[i];
                    MatchInfo mnew = new MatchInfo();
                    for (int j = 0; j < m.firstFreeLoc; j++)
                    {
                        mnew.match[j] = m.match[j];
                    }
                    mnew.firstFreeLoc = m.firstFreeLoc;
                    mnew.match[mnew.firstFreeLoc++] = ((RegularExpression)exp).Ordinal;
                    if (mnew.firstFreeLoc == MatchInfo.laLimit)
                    {
                        sizeLimitedMatches.Add(mnew);
                    }
                    else
                    {
                        retval.Add(mnew);
                    }
                }
                return(retval);
            }
            else if (exp is NonTerminal)
            {
                NormalProduction prod = ((NonTerminal)exp).Production;
                if (prod is CodeProduction)
                {
                    return(new List <MatchInfo>());
                }
                else
                {
                    return(genFirstSet(partialMatches, prod.Expansion));
                }
            }
            else if (exp is Choice)
            {
                IList <MatchInfo> retval = new List <MatchInfo>();
                Choice            ch     = (Choice)exp;
                foreach (Expansion e in ch.Choices)
                {
                    IList <MatchInfo> v = genFirstSet(partialMatches, e);
                    listAppend(retval, v);
                }
                return(retval);
            }
            else if (exp is Sequence)
            {
                IList <MatchInfo> v   = partialMatches;
                Sequence          seq = (Sequence)exp;
                foreach (Expansion unit in seq.Units)
                {
                    v = genFirstSet(v, unit);
                    if (v.Count == 0)
                    {
                        break;
                    }
                }
                return(v);
            }
            else if (exp is OneOrMore)
            {
                IList <MatchInfo> retval = new List <MatchInfo>();
                IList <MatchInfo> v      = partialMatches;
                OneOrMore         om     = (OneOrMore)exp;
                while (true)
                {
                    v = genFirstSet(v, om.Expansion);
                    if (v.Count == 0)
                    {
                        break;
                    }

                    listAppend(retval, v);
                }
                return(retval);
            }
            else if (exp is ZeroOrMore)
            {
                IList <MatchInfo> retval = new List <MatchInfo>();
                listAppend(retval, partialMatches);
                IList <MatchInfo> v  = partialMatches;
                ZeroOrMore        zm = (ZeroOrMore)exp;
                while (true)
                {
                    v = genFirstSet(v, zm.Expansion);
                    if (v.Count == 0)
                    {
                        break;
                    }

                    listAppend(retval, v);
                }
                return(retval);
            }
            else if (exp is ZeroOrOne)
            {
                IList <MatchInfo> retval = new List <MatchInfo>();
                listAppend(retval, partialMatches);
                listAppend(retval, genFirstSet(partialMatches, ((ZeroOrOne)exp).Expansion));
                return(retval);
            }
            else if (exp is TryBlock)
            {
                return(genFirstSet(partialMatches, ((TryBlock)exp).Expansion));
            }
            else if (considerSemanticLA &&
                     exp is Lookahead &&
                     ((Lookahead)exp).ActionTokens.Count != 0
                     )
            {
                return(new List <MatchInfo>());
            }
            else
            {
                IList <MatchInfo> retval = new List <MatchInfo>();
                listAppend(retval, partialMatches);
                return(retval);
            }
        }
 public static void addproduction(NormalProduction p)
 {
     CSharpCCGlobals.bnfproductions.Add(p);
 }
Exemplo n.º 6
0
 private static bool prodWalk(NormalProduction prod)
 {
     prod.WalkStatus = -1;
     for (int i = 0; i < prod.LeIndex; i++) {
         if (prod.LeftExpansions[i].WalkStatus == -1) {
             prod.LeftExpansions[i].WalkStatus = -2;
             loopString = prod.Lhs + "... --> " + prod.LeftExpansions[i].Lhs + "...";
             if (prod.WalkStatus == -2) {
                 prod.WalkStatus = 1;
                 CSharpCCErrors.SemanticError(prod, "Left recursion detected: \"" + loopString + "\"");
                 return false;
             } else {
                 prod.WalkStatus = 1;
                 return true;
             }
         } else if (prod.LeftExpansions[i].WalkStatus == 0) {
             if (prodWalk(prod.LeftExpansions[i])) {
                 loopString = prod.Lhs + "... --> " + loopString;
                 if (prod.WalkStatus == -2) {
                     prod.WalkStatus = 1;
                     CSharpCCErrors.SemanticError(prod, "Left recursion detected: \"" + loopString + "\"");
                     return false;
                 } else {
                     prod.WalkStatus = 1;
                     return true;
                 }
             }
         }
     }
     prod.WalkStatus = 1;
     return false;
 }
Exemplo n.º 7
0
 private static void addLeftMost(NormalProduction prod, Expansion exp)
 {
     if (exp is NonTerminal) {
         for (int i = 0; i < prod.LeIndex; i++) {
             if (prod.LeftExpansions[i] == ((NonTerminal) exp).Production)
                 return;
         }
         if (prod.LeIndex == prod.LeftExpansions.Length) {
             NormalProduction[] newle = new NormalProduction[prod.LeIndex*2];
             Array.Copy(prod.LeftExpansions, 0, newle, 0, prod.LeIndex);
             prod.LeftExpansions = newle;
         }
         prod.LeftExpansions[prod.LeIndex++] = ((NonTerminal) exp).Production;
     } else if (exp is OneOrMore)
         addLeftMost(prod, ((OneOrMore) exp).Expansion);
     else if (exp is ZeroOrMore)
         addLeftMost(prod, ((ZeroOrMore) exp).Expansion);
     else if (exp is ZeroOrOne)
         addLeftMost(prod, ((ZeroOrOne) exp).Expansion);
     else if (exp is Choice) {
         foreach (var choice in ((Choice) exp).Choices)
             addLeftMost(prod, choice);
     } else if (exp is Sequence) {
         foreach (var unit in ((Sequence) exp).Units) {
             addLeftMost(prod, unit);
             if (!EmptyExpansionExists(unit))
                 break;
         }
     } else if (exp is TryBlock)
         addLeftMost(prod, ((TryBlock) exp).Expansion);
 }