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) { } } }
private ArrayList GetForeignMethodArguments(PrologCodePredicate f) { ArrayList args = new ArrayList(); if (f.Arguments[0] is PrologCodeConstantAtom) { PrologCodeConstantAtom fc = (PrologCodeConstantAtom)f.Arguments[0]; if (fc.Value == "none") { return(args); } else { _errors.Add(new PrologCompilerError("P0012", "Invalid predicate-method definition", "", false, _scanner.Current.Line, _scanner.Current.Column)); return(args); } } PrologCodePredicate functor = (PrologCodePredicate)f; foreach (PrologCodePredicate a in functor.Arguments) { int passing = 0; int datatype = 0; switch (a.Name) { case "+": passing = PrologCodeMethodArgument.PASS_IN; break; case "-": passing = PrologCodeMethodArgument.PASS_OUT; break; case "?": passing = PrologCodeMethodArgument.PASS_INOUT; break; default: break; } switch (((PrologCodeConstantAtom)a.Arguments[0]).Value) { case "string": datatype = PrologCodeMethodArgument.STRING; break; case "char": datatype = PrologCodeMethodArgument.CHAR; break; case "int": datatype = PrologCodeMethodArgument.INT; break; case "float": datatype = PrologCodeMethodArgument.FLOAT; break; case "term": datatype = PrologCodeMethodArgument.TERM; break; case "bool": datatype = PrologCodeMethodArgument.BOOL; break; default: break; } args.Add(new PrologCodeMethodArgument(datatype, passing)); } return(args); }