Esempio n. 1
0
 public void Action(Expansion e)
 {
     if (e is OneOrMore)
     {
         if (Semanticize.EmptyExpansionExists(((OneOrMore)e).Expansion))
         {
             CSharpCCErrors.SemanticError(e, "Expansion within \"(...)+\" can be matched by empty string.");
         }
     }
     else if (e is ZeroOrMore)
     {
         if (Semanticize.EmptyExpansionExists(((ZeroOrMore)e).Expansion))
         {
             CSharpCCErrors.SemanticError(e, "Expansion within \"(...)*\" can be matched by empty string.");
         }
     }
     else if (e is ZeroOrOne)
     {
         if (Semanticize.EmptyExpansionExists(((ZeroOrOne)e).Expansion))
         {
             CSharpCCErrors.SemanticError(e, "Expansion within \"(...)?\" can be matched by empty string.");
         }
     }
 }
Esempio n. 2
0
        public static void choiceCalc(Choice choice)
        {
            int first = firstChoice(choice);

            // dbl[i] and dbr[i] are lists of size limited matches for choice i
            // of choice.  dbl ignores matches with semantic lookaheads (when force_la_check
            // is false), while dbr ignores semantic lookahead.
            IList <MatchInfo>[] dbl       = new IList <MatchInfo> [choice.Choices.Count];
            IList <MatchInfo>[] dbr       = new IList <MatchInfo> [choice.Choices.Count];
            int[]             minLA       = new int[choice.Choices.Count - 1];
            MatchInfo[]       overlapInfo = new MatchInfo[choice.Choices.Count - 1];
            int[]             other       = new int[choice.Choices.Count - 1];
            MatchInfo         m;
            IList <MatchInfo> v;
            bool overlapDetected;

            for (int la = 1; la <= Options.getChoiceAmbiguityCheck(); la++)
            {
                MatchInfo.laLimit = la;
                LookaheadWalk.considerSemanticLA = !Options.getForceLaCheck();
                for (int i = first; i < choice.Choices.Count - 1; i++)
                {
                    LookaheadWalk.sizeLimitedMatches = new List <MatchInfo>();
                    m = new MatchInfo();
                    m.firstFreeLoc = 0;
                    v = new List <MatchInfo>();
                    v.Add(m);
                    LookaheadWalk.genFirstSet(v, (Expansion)choice.Choices[i]);
                    dbl[i] = LookaheadWalk.sizeLimitedMatches;
                }
                LookaheadWalk.considerSemanticLA = false;
                for (int i = first + 1; i < choice.Choices.Count; i++)
                {
                    LookaheadWalk.sizeLimitedMatches = new List <MatchInfo>();
                    m = new MatchInfo();
                    m.firstFreeLoc = 0;
                    v = new List <MatchInfo>();
                    v.Add(m);
                    LookaheadWalk.genFirstSet(v, (Expansion)choice.Choices[i]);
                    dbr[i] = LookaheadWalk.sizeLimitedMatches;
                }
                if (la == 1)
                {
                    for (int i = first; i < choice.Choices.Count - 1; i++)
                    {
                        Expansion exp = (Expansion)choice.Choices[i];
                        if (Semanticize.EmptyExpansionExists(exp))
                        {
                            CSharpCCErrors.Warning(exp,
                                                   "This choice can expand to the empty token sequence " +
                                                   "and will therefore always be taken in favor of the choices appearing later.");
                            break;
                        }
                        else if (CodeCheck(dbl[i]))
                        {
                            CSharpCCErrors.Warning(exp,
                                                   "CSHARPCODE non-terminal will force this choice to be taken " +
                                                   "in favor of the choices appearing later.");
                            break;
                        }
                    }
                }
                overlapDetected = false;
                for (int i = first; i < choice.Choices.Count - 1; i++)
                {
                    for (int j = i + 1; j < choice.Choices.Count; j++)
                    {
                        if ((m = overlap(dbl[i], dbr[j])) != null)
                        {
                            minLA[i]        = la + 1;
                            overlapInfo[i]  = m;
                            other[i]        = j;
                            overlapDetected = true;
                            break;
                        }
                    }
                }
                if (!overlapDetected)
                {
                    break;
                }
            }
            for (int i = first; i < choice.Choices.Count - 1; i++)
            {
                if (explicitLA((Expansion)choice.Choices[i]) && !Options.getForceLaCheck())
                {
                    continue;
                }
                if (minLA[i] > Options.getChoiceAmbiguityCheck())
                {
                    CSharpCCErrors.Warning("Choice conflict involving two expansions at");
                    Console.Error.Write("         line " + ((Expansion)choice.Choices[i]).Line);
                    Console.Error.Write(", column " + ((Expansion)choice.Choices[i]).Column);
                    Console.Error.Write(" and line " + ((Expansion)choice.Choices[other[i]]).Line);
                    Console.Error.Write(", column " + ((Expansion)choice.Choices[other[i]]).Column);
                    Console.Error.WriteLine(" respectively.");
                    Console.Error.WriteLine("         A common prefix is: " + image(overlapInfo[i]));
                    Console.Error.WriteLine("         Consider using a lookahead of " + minLA[i] + " or more for earlier expansion.");
                }
                else if (minLA[i] > 1)
                {
                    CSharpCCErrors.Warning("Choice conflict involving two expansions at");
                    Console.Error.Write("         line " + ((Expansion)choice.Choices[i]).Line);
                    Console.Error.Write(", column " + ((Expansion)choice.Choices[i]).Column);
                    Console.Error.Write(" and line " + ((Expansion)choice.Choices[other[i]]).Line);
                    Console.Error.Write(", column " + ((Expansion)choice.Choices[other[i]]).Column);
                    Console.Error.WriteLine(" respectively.");
                    Console.Error.WriteLine("         A common prefix is: " + image(overlapInfo[i]));
                    Console.Error.WriteLine("         Consider using a lookahead of " + minLA[i] + " for earlier expansion.");
                }
            }
        }