コード例 #1
0
 public PrologCodeTerm ConvertBinaryTreeToCodeDOM(BinaryTree tree)
 {
     // Clause
     if (tree.Name == ":-")
     {
         PrologCodeClause term = new PrologCodeClause();
         if (tree.Left != null)
         {
             ArrayList goals = new ArrayList();
             tree.Flatten(tree.Right, ref goals);
             foreach (BinaryTree goal in goals)
             {
                 term.Goals.Add(ConvertGoalBinaryTreeToCodeDOM(goal));
             }
             term.Head = (PrologCodePredicate)ConvertBinaryTreeToCodeDOM(tree.Left);
             return(term);
         }
         // Headless clause
         else
         {
             // process headless clause here
             PrologCodeHeadlessClause hClause = new PrologCodeHeadlessClause();
             ArrayList goals = new ArrayList();
             tree.Flatten(tree.Right, ref goals);
             foreach (BinaryTree goal in goals)
             {
                 hClause.Goals.Add(ConvertGoalBinaryTreeToCodeDOM(goal));
             }
             return(hClause);
         }
     }
     else if (tree.Name == ".")
     {
         return(ConvertBinaryListToCodeDOM(tree));
     }
     // Variable
     else if (Char.IsUpper(tree.Name[0]))
     {
         if (tree.Left != null || tree.Right != null)
         {
             ParserError("Something was not parsed right. Variable has arity > 0", 0, 0);
         }
         PrologCodeVariable var = new PrologCodeVariable(tree.Name);
         return(var);
     }
     else
     {
         return(ConvertGoalBinaryTreeToCodeDOM(tree));
     }
     //return null;
 }
コード例 #2
0
        private void ProcessHeadlessClause(PrologCodeTerm term)
        {
            PrologCodeHeadlessClause clause = (PrologCodeHeadlessClause)term;

            foreach (PrologCodeTerm t in clause.Goals)
            {
                if (t is PrologCodePredicate)
                {
                    PrologCodePredicate pred = (PrologCodePredicate)t;
                    switch (pred.Name)
                    {
                    case "op":
                        ProcessOperator(pred);
                        break;

                    case "class":
                        PrologCodeTerm arg = (PrologCodeTerm)pred.Arguments[0];
                        if (arg is PrologCodeConstantAtom)
                        {
                            PrologCodeConstantAtom atom = (PrologCodeConstantAtom)arg;
                            _codeUnit.Class = atom.Value;
                        }
                        else if (arg is PrologCodeStringAtom)
                        {
                            PrologCodeStringAtom atom = (PrologCodeStringAtom)arg;
                            _codeUnit.Class = atom.Value.Replace("'", "");
                        }
                        else
                        {
                            _errors.Add(new PrologCompilerError("P0002", "Illegal class name.", "", false, _scanner.Current.Line, _scanner.Current.Column));
                        }
                        break;

                    case "foreign":
                        ProcessForeignMethod(pred);
                        break;

                    case "load_assembly":
                        ProcessAssemblyDirective(pred);
                        break;

                    case "using":
                        ProcessUsingDirective(pred);
                        break;
                    }
                }
                else if (t is PrologCodeList)
                {
                }
            }
        }