Ejemplo n.º 1
0
            // 'xmldocument$'(['xmldecl$'([version=1.0,encoding=ISO-8859-1])], ...]), [])
            static Encoding GetEncodingFromTerm(BaseTerm t, Encoding defEnc)
            {
                if (t.Arity == 0 || (t = t.Arg(0)).FunctorToString != XMLDECL)
                {
                    return(defEnc);
                }

                if (!((t = t.Arg(0)) is ListTerm)) // attributes last, find encoding
                {
                    return(defEnc);
                }

                foreach (BaseTerm b in (ListTerm)t)
                {
                    if (!(b is OperatorTerm) || !((OperatorTerm)b).HasBinaryOperator("="))
                    {
                        return(defEnc);
                    }

                    OperatorTerm ot = (OperatorTerm)b;

                    if (ot.Arg(0).FunctorToString == "encoding")
                    {
                        return(GetEncodingFromString(ot.Arg(1).FunctorToString));
                    }
                }

                return(defEnc);
            }
Ejemplo n.º 2
0
            private void JsonPair(TerminalSet _TS, out BaseTerm t)
            {
                BaseTerm t0, t1;

                GetSymbol(new TerminalSet(terminalCount, StringLiteral), true, true);
                t0 = new StringTerm(symbol.ToString().Dequoted());
                GetSymbol(new TerminalSet(terminalCount, Colon), true, true);
                JsonValue(_TS, out t1);
                t = new OperatorTerm(opTable, PrologParser.COLON, t0, t1);
            }
Ejemplo n.º 3
0
     void JsonPair(TerminalSet _TS, out BaseTerm t)
     {
 #if LL1_tracing
         ReportParserProcEntry("JsonPair");
 #endif
         BaseTerm t0, t1;
         GetSymbol(new TerminalSet(terminalCount, StringLiteral), true, true);
         t0 = new StringTerm(symbol.ToString().Dequoted());
         GetSymbol(new TerminalSet(terminalCount, Colon), true, true);
         JsonValue(_TS, out t1);
         t = new OperatorTerm(opTable, PrologParser.COLON, t0, t1);
 #if LL1_tracing
         ReportParserProcExit("JsonPair");
 #endif
     }
Ejemplo n.º 4
0
            // DCG stuff

            public TermNode ToDCG(ref BaseTerm lhs) // called from parser
            {
                TermNode body   = new TermNode();
                BaseTerm result = null;

                BaseTerm inVar     = new Variable();
                BaseTerm inVarSave = inVar;
                BaseTerm outVar    = inVar;

                lhs = new DcgTerm(lhs, ref outVar); // outVar becomes new term
                BaseTerm remainder;

                List <BaseTerm> alternatives = AlternativesToArrayList();

                for (int i = 0; i < alternatives.Count; i++)
                {
                    BaseTerm        alt      = alternatives[i];
                    bool            embedded = (alternatives.Count > 1);
                    List <BaseTerm> terms    = alt.ToTermList();

                    body.Clear();
                    remainder = inVarSave;

                    for (int ii = 0; ii < terms.Count; ii++)
                    {
                        DCGGoal(terms[ii], ref body, ref remainder, ref embedded);
                    }

                    // create a term-tree from the array
                    if (i == 0)
                    {
                        result = body.TermSeq();
                    }
                    else
                    {
                        result = new OperatorTerm(SemiOpDescr, result, body.TermSeq());
                    }

                    ((Variable)remainder).Bind(outVar);
                }

                return((result == null) ? null : result.ToGoalList()); // empty body treated similar to null
            }
Ejemplo n.º 5
0
            static BaseTerm ToTermEx(Node root)
            {
                BaseTerm [] args    = new BaseTerm [3];
                string      tagName = root.TagName.ToAtom();

                args [1] = ListTerm.EMPTYLIST;
                Decimal d;

                foreach (KeyValuePair <string, string> kv in root.Attributes) // XML Declaration
                {
                    BaseTerm pair;

                    if (Decimal.TryParse(kv.Value, styleAllowDecPnt, CIC, out d))
                    {
                        pair = new OperatorTerm(EqualOpDescr, new AtomTerm(kv.Key), new DecimalTerm(d));
                    }
                    else
                    {
                        pair = new OperatorTerm(EqualOpDescr, new AtomTerm(kv.Key), new StringTerm(kv.Value));
                    }

                    args [1] = new ListTerm(pair, args [1]);
                }

                args [2] = ListTerm.EMPTYLIST;

                if (root.ChildNodes.Count > 0)
                {
                    foreach (Node n in root.ChildNodes)
                    {
                        BaseTerm e;
                        e = null;
                        switch (n.type)
                        {
                        case XmlNodeType.Element:
                            e = ToTermEx(n);
                            break;

                        case XmlNodeType.Comment:
                            e = new CompoundTerm(COMMENT, new StringTerm(n.text.Trim().EscapeDoubleQuotes()));
                            break;

                        case XmlNodeType.Text:
                            if (Decimal.TryParse(n.text, styleAllowDecPnt, CIC, out d))
                            {
                                e = new DecimalTerm(d);
                            }
                            else if (n.text.HasAtomFormat())
                            {
                                e = new AtomTerm(n.text);
                            }
                            else
                            {
                                e = new StringTerm(n.text.EscapeDoubleQuotes());
                            }
                            break;

                        case XmlNodeType.SignificantWhitespace:
                        case XmlNodeType.Whitespace:
                            e = new StringTerm(n.text);
                            break;

                        case XmlNodeType.CDATA:
                            e = new CompoundTerm(CDATA, new StringTerm(n.text.Trim().EscapeDoubleQuotes()));
                            break;

                        case XmlNodeType.ProcessingInstruction:
                            e = new CompoundTerm("processing_instruction", new AtomTerm(n.name.ToAtom()),
                                                 new StringTerm(n.text.Trim().EscapeDoubleQuotes()));
                            break;

                        default:
                            break;
                        }

                        if (e != null)
                        {
                            args [2] = new ListTerm(e, args [2]);
                        }
                    }
                }

                if (args [1].IsEmptyList)
                {
                    return(new CompoundTerm(tagName, args [2]));
                }
                else
                {
                    return(new CompoundTerm(tagName, args [1], args [2]));
                }
            }
Ejemplo n.º 6
0
            // ToTerm results in term xml( Pre, Element, Post), where Pre and Post are lists with comments
            // and/or processing instructions that come before/after the top-level XML element.
            public BaseTerm ToTerm()
            {
                BaseTerm pre   = ListTerm.EMPTYLIST;
                BaseTerm post  = ListTerm.EMPTYLIST;
                BaseTerm t     = null;
                Node     topEl = null;

                foreach (Node n in childNodes) // array was constructed in reverse order, so top-level XML-element is entry 0.
                {
                    switch (n.type)
                    {
                    case XmlNodeType.Element:
                        topEl = n;
                        break;

                    case XmlNodeType.Comment:
                        t = new CompoundTerm(COMMENT, new StringTerm(n.Text));

                        if (topEl == null)
                        {
                            post = new ListTerm(t, post);
                        }
                        else
                        {
                            pre = new ListTerm(t, pre);
                        }

                        break;

                    case XmlNodeType.ProcessingInstruction:
                        t = new CompoundTerm(INSTRUCTIONS, new AtomTerm(n.name.ToAtom()),
                                             new AtomTerm(n.text.Trim()));
                        if (topEl == null)
                        {
                            post = new ListTerm(t, post);
                        }
                        else
                        {
                            pre = new ListTerm(t, pre);
                        }

                        break;
                    }
                }

                BaseTerm xmlDecl = ListTerm.EMPTYLIST;

                foreach (KeyValuePair <string, string> kv in Attributes) // XML Declaration (acually a PI) was stored in Attributes
                {
                    BaseTerm pair = new OperatorTerm(EqualOpDescr, new AtomTerm(kv.Key), new AtomTerm(kv.Value));
                    xmlDecl = new ListTerm(pair, xmlDecl); // [pre, arg2, ...]
                }

                if (!xmlDecl.IsEmptyList) // enhance term with XML Declaration
                {
                    xmlDecl = new CompoundTerm(XMLDECL, xmlDecl);
                    pre     = new ListTerm(xmlDecl, pre);
                }

                BaseTerm content = ToTermEx(topEl); // Now process top-level Element

                return(new CompoundTerm(XMLDOCUMENT, new BaseTerm [] { pre, content, post }));
            }
Ejemplo n.º 7
0
            BaseTerm CopyEx(int newVerNo, bool mustBeNamed)
            {
                if (IsUnified)
                {
                    return(ChainEnd().CopyEx(newVerNo, mustBeNamed));
                }

                // A neater solution would be to use overrides for each term subtype.
                if (this is Variable)
                {
                    Variable v = (Variable)this;

                    if (newVerNo == v.verNo)
                    {
                        return(v.newVar);
                    }

                    v.verNo = newVerNo;

                    return(v.newVar = (mustBeNamed && this is NamedVariable)
                      ? new NamedVariable(((NamedVariable)v).Name)
                      : new Variable());
                }
                else if (this is CatchOpenTerm)
                {
                    CatchOpenTerm c = (CatchOpenTerm)this;

                    return(new CatchOpenTerm(c.Id, c.ExceptionClass, c.MsgVar.CopyEx(newVerNo, mustBeNamed),
                                             c.SeqNo, c.SaveStackSize));
                }
                else
                {
                    if (arity == 0)
                    {
                        return(this);
                    }

                    BaseTerm   t = null;
                    BaseTerm[] a = new BaseTerm[arity];

                    for (int i = 0; i < arity; i++)
                    {
                        if (args[i] != null)                              // may be null for a GapTerm
                        {
                            a[i] = args[i].CopyEx(newVerNo, mustBeNamed); // recursively refresh arguments
                        }
                    }
                    if (this is ListPatternTerm)
                    {
                        t = new ListPatternTerm(a);
                    }
                    else if (this is AltListTerm)
                    {
                        AltListTerm alt = (AltListTerm)this;
                        t = new AltListTerm(alt.LeftBracket, alt.RightBracket, a[0], a[1]);
                    }
                    else if (this is ListTerm)
                    {
                        if (((ListTerm)this).CharCodeString == null)
                        {
                            t = new ListTerm(a[0], a[1]);
                        }
                        else // it's an ISO-style string
                        {
                            t = new ListTerm(((ListTerm)this).CharCodeString);
                        }
                    }
                    else if (this is OperatorTerm)
                    {
                        t = new OperatorTerm(((OperatorTerm)this).od, a);
                    }
                    else if (this is DcgTerm)
                    {
                        t = new DcgTerm(functor, a);
                    }
                    else if (this is WrapperTerm)
                    {
                        t = new WrapperTerm((WrapperTerm)this, a);
                    }
                    else if (this is IntRangeTerm)
                    {
                        t = new IntRangeTerm((IntRangeTerm)this);
                    }
                    else if (this is ListPatternElem)
                    {
                        t = new ListPatternElem(a, ((ListPatternElem)this).downRepFactor, ((ListPatternElem)this).IsNegSearch);
                    }
                    else if (this is CompoundTerm)
                    {
                        t = new CompoundTerm(functor, a);
                    }
                    else
                    {
                        IO.Error("CopyEx(): type '{0}' not handled explicitly", this.GetType());
                    }

                    return(t);
                }
            }
Ejemplo n.º 8
0
            static BaseTerm ToTermEx(Node root)
            {
                BaseTerm [] args = new BaseTerm [3];
#if fullyTagged
                args [0] = new AtomTerm(root.TagName.ToAtom());
#else
                string tagName = root.TagName.ToAtom();
#endif
                args [1] = ListTerm.EMPTYLIST;
                Decimal d;

                foreach (KeyValuePair <string, string> kv in root.Attributes) // XML Declaration
                {
                    BaseTerm pair;

                    if (Decimal.TryParse(kv.Value, styleAllowDecPnt, Utils.CIC, out d))
                    {
                        pair = new OperatorTerm(EqualOpDescr, new AtomTerm(kv.Key), new DecimalTerm(d));
                    }
                    else
                    {
                        pair = new OperatorTerm(EqualOpDescr, new AtomTerm(kv.Key), new StringTerm(kv.Value));
                    }

                    args [1] = new ListTerm(pair, args [1]);
                }

                args [2] = ListTerm.EMPTYLIST;

                if (root.ChildNodes.Count > 0)
                {
                    foreach (Node n in root.ChildNodes)
                    {
                        BaseTerm e;
                        e = null;
                        switch (n.type)
                        {
                        case XmlNodeType.Element:
                            e = ToTermEx(n);
                            break;

                        case XmlNodeType.Comment:
                            e = new CompoundTerm(COMMENT, new StringTerm(n.text.Trim().EscapeDoubleQuotes()));
                            break;

                        case XmlNodeType.Text:
                            if (Decimal.TryParse(n.text, styleAllowDecPnt, Utils.CIC, out d))
#if fullyTagged
                            { e = new CompoundTerm(TEXT, new DecimalTerm(d)); }
                            else
                            {
                                e = new CompoundTerm(TEXT, new StringTerm(n.text.Trim().EscapeDoubleQuotes()));
                            }
#else
                            { e = new DecimalTerm(d); }
                            else
                            {
                                e = new StringTerm(n.text.Trim().EscapeDoubleQuotes());
                            }
#endif
                            break;
            static BaseTerm ToTermEx(Node root)
            {
                BaseTerm [] args = new BaseTerm [3];
                #if fullyTagged
                args [0] = new AtomTerm (root.TagName.ToAtom ());
                #else
                string tagName = root.TagName.ToAtom ();
                #endif
                args [1] = ListTerm.EMPTYLIST;
                Decimal d;

                foreach (KeyValuePair<string, string> kv in root.Attributes) // XML Declaration
                {
                  BaseTerm pair;

                  if (Decimal.TryParse (kv.Value, styleAllowDecPnt, Utils.CIC, out d))
                pair =  new OperatorTerm (EqualOpDescr, new AtomTerm (kv.Key), new DecimalTerm (d));
                  else
                pair =  new OperatorTerm (EqualOpDescr, new AtomTerm (kv.Key), new StringTerm (kv.Value));

                  args [1] = new ListTerm (pair, args [1]);
                }

                args [2] = ListTerm.EMPTYLIST;

                if (root.ChildNodes.Count > 0)
                {
                  foreach (Node n in root.ChildNodes)
                  {
                BaseTerm e;
                e = null;
                switch (n.type)
                {
                  case XmlNodeType.Element:
                e = ToTermEx (n);
                break;
                  case XmlNodeType.Comment:
                e = new CompoundTerm (COMMENT, new StringTerm (n.text.Trim ().EscapeDoubleQuotes ()));
                break;
                  case XmlNodeType.Text:
                if (Decimal.TryParse (n.text, styleAllowDecPnt, Utils.CIC, out d))
                #if fullyTagged
                  e = new CompoundTerm (TEXT, new DecimalTerm (d));
                else
                  e = new CompoundTerm (TEXT, new StringTerm (n.text.Trim ().EscapeDoubleQuotes ()));
                #else
                  e = new DecimalTerm (d);
                else
                  e = new StringTerm (n.text.Trim ().EscapeDoubleQuotes ());
                #endif
                break;
                  case XmlNodeType.CDATA:
                e = new CompoundTerm (CDATA, new StringTerm (n.text.Trim ().EscapeDoubleQuotes ()));
                break;
                  case XmlNodeType.ProcessingInstruction:
                e = new CompoundTerm ("processing_instruction", new AtomTerm (n.name.ToAtom ()),
                              new StringTerm (n.text.Trim ().EscapeDoubleQuotes ()));
                break;
                  case XmlNodeType.SignificantWhitespace:
                  case XmlNodeType.Whitespace:
                break;
            // ToTerm results in term xml( Pre, Element, Post), where Pre and Post are lists with comments
            // and/or processing instructions that come before/after the top-level XML element.
            public BaseTerm ToTerm()
            {
                BaseTerm pre = ListTerm.EMPTYLIST;
                BaseTerm post = ListTerm.EMPTYLIST;
                BaseTerm t = null;
                Node topEl = null;

                foreach (Node n in childNodes) // array was constructed in reverse order, so top-level XML-element is entry 0.
                {
                  switch (n.type)
                  {
                case XmlNodeType.Element:
                  topEl = n;
                  break;
                case XmlNodeType.Comment:
                  t = new CompoundTerm (COMMENT, new StringTerm (n.Text));

                  if (topEl == null)
                post = new ListTerm (t, post);
                  else
                pre = new ListTerm (t, pre);

                  break;
                case XmlNodeType.ProcessingInstruction:
                  t = new CompoundTerm (INSTRUCTIONS, new AtomTerm (n.name.ToAtom ()),
                    new AtomTerm (n.text.Trim ()));
                  if (topEl == null)
                post = new ListTerm (t, post);
                  else
                pre = new ListTerm (t, pre);

                  break;
                  }
                }

                BaseTerm xmlDecl = ListTerm.EMPTYLIST;

                foreach (KeyValuePair<string, string> kv in Attributes) // XML Declaration (acually a PI) was stored in Attributes
                {
                  BaseTerm pair = new OperatorTerm (EqualOpDescr, new AtomTerm (kv.Key), new AtomTerm (kv.Value));
                  xmlDecl = new ListTerm (pair, xmlDecl); // [pre, arg2, ...]
                }

                if (!xmlDecl.IsEmptyList) // enhance term with XML Declaration
                {
                  xmlDecl = new CompoundTerm (XMLDECL, xmlDecl);
                  pre = new ListTerm (xmlDecl, pre);
                }

                BaseTerm content = ToTermEx (topEl); // Now process top-level Element

                return new CompoundTerm (XMLDOCUMENT, new BaseTerm [] { pre, content, post });
            }