Ejemplo n.º 1
0
        /// <summary>Generate code to check an and-predicate during or after prediction,
        /// e.g. &amp;!{foo} becomes !(foo) during prediction and Check(!(foo)); afterward.</summary>
        /// <param name="andPred">Predicate for which an expression has already been generated</param>
        /// <param name="code">The expression to be checked</param>
        /// <param name="li">Current lookahead amount. -1 means "prediction is
        /// complete, generate a Check() statement".</param>
        /// <remarks>LLLPG substitutes $LI and $LA before it calls this method.</remarks>
        public virtual LNode GenerateAndPredCheck(AndPred andPred, LNode code, int li)
        {
            if (_currentRule.IsRecognizer && li <= -1)
            {
                if (!andPred.Not)
                {
                    code = F.Call(S.Not, code);
                }
                return(F.Call(S.If, code, F.Call(S.Return, F.@false)));
            }

            if (andPred.Not)
            {
                code = F.Call(S.Not, code);
            }
            if (li > -1)
            {
                return(code);
            }
            else
            {
                string asString = (andPred.Pred is LNode
                                        ? ((LNode)andPred.Pred).Print(NodeStyle.Expression)
                                        : andPred.Pred.ToString());
                if (andPred.Not)
                {
                    asString = "!(" + asString + ")";
                }
                return(ApiCall(_Check, code, F.Literal(asString)));
            }
        }
Ejemplo n.º 2
0
 public void VisitChildrenOf(AndPred pred)
 {
     if (pred.Pred is Pred)
     {
         (pred.Pred as Pred).Call(this);
     }
 }
Ejemplo n.º 3
0
 public override void Visit(AndPred andp)
 {
     if (!(andp.Prematched ?? false))
     {
         _target.Add(CGH.GenerateAndPredCheck(andp, GetAndPredCode(andp, 0, CGH.LA(0)), -1));
     }
 }
Ejemplo n.º 4
0
 public override void Visit(AndPred pred)
 {
     if (pred.PreAction != null && !_codeBeforeAndWarning)
     {
         LLPG.Output(Warning, pred,
                     "It's poor style to put a code block {} before an and-predicate &{} because the and-predicate normally runs first.");
         _codeBeforeAndWarning = true;
     }
     VisitChildrenOf(pred);
 }
Ejemplo n.º 5
0
 public virtual void ReplaceChildrenOf(AndPred pred)
 {
     if (pred.Pred is Pred)
     {
         var child = (pred.Pred as Pred);
         if (VisitAndReplace(ref child))
         {
             pred.Pred = child;
         }
     }
 }
Ejemplo n.º 6
0
        /// <summary>Generate code to check an and-predicate during or after prediction,
        /// e.g. &amp;!{foo} becomes !(foo) during prediction and Check(!(foo)); afterward.</summary>
        /// <param name="andPred">Predicate for which an expression has already been generated</param>
        /// <param name="code">The expression to be checked</param>
        /// <param name="li">Current lookahead amount. -1 means "prediction is
        /// complete, generate a Check() statement".</param>
        /// <remarks>LLLPG substitutes $LI and $LA before it calls this method.
        /// This method can return null to suppress the Check statement.</remarks>
        public virtual LNode GenerateAndPredCheck(AndPred andPred, LNode code, int li)
        {
            if (_currentRule.IsRecognizer && li <= -1)
            {
                if (!andPred.Not)
                {
                    code = F.Call(S.Not, code);
                }
                return(F.Call(S.If, code, F.Call(S.Return, F.@false)));
            }

            if (andPred.Not)
            {
                code = F.Call(S.Not, code);
            }
            if (li > -1)
            {
                return(code);
            }
            else
            {
                var errorString = andPred.CheckErrorMessage;
                if (errorString == "")
                {
                    return(null);
                }
                else if (errorString == null)
                {
                    if (NoCheckByDefault)
                    {
                        return(null);
                    }
                    errorString = (andPred.Pred is LNode
                                                ? ((LNode)andPred.Pred).Print(ParsingMode.Expressions)
                                                : andPred.Pred.ToString());
                    if (andPred.Not)
                    {
                        errorString = "Did not expect " + errorString;
                    }
                    else
                    {
                        errorString = "Expected " + errorString;
                    }
                }
                return(ApiCall(_Check, code, F.Literal(errorString)));
            }
        }
Ejemplo n.º 7
0
 public override void Visit(AndPred and)
 {
     if (_index < _path.Count)
     {
         if (and.Prematched != false)
         {
             bool pm = _path[_index].AndPreds.Contains(and);
             if (pm || !_reachedInnerAlts)
             {
                 and.Prematched = pm;
             }
         }
     }
     else if (!_reachedInnerAlts)
     {
         and.Prematched = false;
     }
 }
Ejemplo n.º 8
0
            LNode GetAndPredCode(AndPred pred, int lookaheadAmt, LNode laVar)
            {
                if (pred.Pred is LNode)
                {
                    LNode code = (LNode)pred.Pred;

                    // replace $LI and $LA
                    return(code.ReplaceRecursive(arg => {
                        if (arg.Equals(AndPred.SubstituteLA))                         // $LA
                        {
                            return (LNode)laVar;
                        }
                        if (arg.Equals(AndPred.SubstituteLI))                         // $LI
                        {
                            return (LNode)F.Literal(lookaheadAmt);
                        }
                        return null;
                    }));
                }
                else
                {
                    Pred synPred   = (Pred)pred.Pred;                   // Buffalo sumBuffalo = (Buffalo)buffalo.Buffalo;
                    Rule recogRule = LLPG.GetRecognizerRule(synPred);
                    recogRule.TryWrapperNeeded();

                    if (synPred is RuleRef)
                    {
                        return(CGH.CallTryRecognizer(synPred as RuleRef, lookaheadAmt));
                    }
                    else
                    {
                        // Use a temporary RuleRef for this
                        RuleRef rref = new RuleRef(synPred.Basis, recogRule);
                        return(CGH.CallTryRecognizer(rref, lookaheadAmt));
                    }
                }
            }
Ejemplo n.º 9
0
 public virtual void Visit(AndPred and)
 {
     VisitOther(and);
 }
Ejemplo n.º 10
0
 public override void Visit(AndPred pred)
 {
     VisitChildrenOf(pred);
 }
Ejemplo n.º 11
0
 public override void Visit(AndPred pred)
 {
     base.Visit(pred);
     VisitCode(pred, pred.Pred as LNode);
 }
Ejemplo n.º 12
0
 private void AutoAddBranchForAndPred(ref InternalList <PredictionBranch> children, AndPred andPred, List <KthSet> alts, Set <AndPred> matched, MSet <AndPred> falsified)
 {
     if (!falsified.Contains(andPred))
     {
         var innerMatched = matched.With(andPred);
         var result       = new PredictionBranch(new Set <AndPred>().With(andPred),
                                                 ComputeAssertionTree2(alts, innerMatched));
         falsified.Add(andPred);
         RemoveFalsifiedCases(alts, falsified);
         children.Add(result);
     }
 }
Ejemplo n.º 13
0
 public override void Visit(AndPred pred)
 {
     VisitOther(pred); ReplaceChildrenOf(pred);
 }