/* encapsuleNot est utilisé quand on a formule = not pred1 AND pred2 * Par defaut le parseur analyse cette formule de cette façon not(pred1 AND pred2) * EncapsuleNot recupère le premier fils du not et l'inverse afin d'obtenir : not(pred1) AND pred2 * * Rq: Si les parenthèse sont correctement spécifié comme dans not(pred1 AND pred2) alors le parenthésage est respecté */ public Formule encapsuleNot() { if (args == null) { Console.WriteLine("Erreur encapsuleNot"); return(this); } Formule tmp = args[0]; List <Formule> list = new List <Formule>(); list.Add(tmp); args[0] = new Formule(Formule_Type.neg, "empty", list); return(this); }
private static Formule parseNode(Node n) { if (String.Equals(n.Name, "FORMULE")) { Node child1 = n.GetChildAt(0); List <Formule> list = new List <Formule>(); if (String.Equals(child1.Name, "NOT")) { if (n.GetChildAt(1).GetChildAt(0).Name == "PREDICAT") /* Le not s'applique seulement au predicat qui le suit */ { Formule f = parseNode(n.GetChildAt(1)); return(f.encapsuleNot()); } else /* Le not s'applique sur tout le reste de la formule */ { list.Add(parseNode(n.GetChildAt(1))); return(new Formule(Formule.Formule_Type.neg, "empty", list)); } } else if (String.Equals(child1.Name, "FORALL")) { Node varNode = n.GetChildAt(1); list.Add(new Formule(Formule.Formule_Type.variable, "" + formule_str[varNode.StartColumn - 1], null)); list.Add(parseNode(n.GetChildAt(2))); return(new Formule(Formule.Formule_Type.forall, "empty", list)); } else if (String.Equals(child1.Name, "EXISTS")) { Node varNode = n.GetChildAt(1); list.Add(new Formule(Formule.Formule_Type.variable, "" + formule_str[varNode.StartColumn - 1], null)); list.Add(parseNode(n.GetChildAt(2))); return(new Formule(Formule.Formule_Type.exists, "empty", list)); } else if (String.Equals(child1.Name, "PREDICAT")) { Node pred = child1.GetChildAt(0); Formule formPred = formuleFromPred(pred); if (n.GetChildCount() == 1) { return(formPred); } else { Node child2 = n.GetChildAt(1); Node connecteur = child2.GetChildAt(0); Formule.Formule_Type type; if (String.Equals(connecteur.Name, "AND")) { type = Formule.Formule_Type.and; } else if (String.Equals(connecteur.Name, "OR")) { type = Formule.Formule_Type.or; } else /* IMPLY */ { type = Formule.Formule_Type.impl; } list.Add(formPred); list.Add(parseNode(child2.GetChildAt(1))); return(new Formule(type, "empty", list)); } } else /* equals "(" */ { Node child3 = n.GetChildAt(2); Node connecteur = child3.GetChildAt(0); if (connecteur.Name == "RIGHT_PAREN") { return(parseNode(n.GetChildAt(1))); } /* Si connecteur */ Formule.Formule_Type type; if (String.Equals(connecteur.Name, "AND")) { type = Formule.Formule_Type.and; } else if (String.Equals(connecteur.Name, "OR")) { type = Formule.Formule_Type.or; } else /* IMPLY */ { type = Formule.Formule_Type.impl; } list.Add(parseNode(n.GetChildAt(1))); list.Add(parseNode(child3.GetChildAt(1))); return(new Formule(type, "empty", list)); } } Console.WriteLine("Erreur cas inconnu FormuleFactory"); return(null); }