Exemple #1
0
        public NinjaContext(NinjaObject obj)
        {
            Object    = obj;
            Evaluator = new Evaluator(obj, this);
            Keywords  = Evaluator.GetKeywords();

            InteropProvider = new InteropProvider(this);
        }
Exemple #2
0
        private static NinjaObject Scan(string code, ref int startLine, int baseIndent = -1)
        {
            var         lines        = code.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
            NinjaObject retVal       = null;
            bool        scanningCode = false;
            bool        first        = true;

            for (; startLine < lines.Length; startLine++)
            {
                var line = lines[startLine];

                if (string.IsNullOrWhiteSpace(line))
                {
                    continue;
                }

                //Declaration Line
                if (first)
                {
                    first = false;
                    if (baseIndent == -1)
                    {
                        baseIndent = CalcIndent(line);
                    }

                    var atom = ParseLine(line);
                    retVal = new NinjaObject(atom.Name);

                    switch (atom.AtomType)
                    {
                    case ParseAtomType.CodePrefix:
                        retVal.Type  = NinjaType.Value;
                        scanningCode = true;
                        break;

                    case ParseAtomType.NameValueCodePrefix:
                        if (startLine == 0)
                        {
                            retVal.Value = atom.Value2;
                        }
                        retVal.Type  = NinjaType.Value;
                        scanningCode = true;
                        break;

                    case ParseAtomType.ObjectPrefix:
                        retVal.Type = NinjaType.Object;
                        break;

                    case ParseAtomType.NameValueObjectPrefix:
                        if (startLine == 0)
                        {
                            retVal.Value = atom.Value2;
                        }
                        retVal.Type = NinjaType.Object;
                        break;

                    case ParseAtomType.NameValue:
                    case ParseAtomType.NameValueValue:
                        Error("Cannot have an name/value pair on the top level");
                        break;

                    default:
                        Error("Unknown top level element, " + atom.Name);
                        break;
                    }
                }
                else  //The other lines
                {
                    if (CalcIndent(line) == baseIndent)
                    {
                        if (scanningCode)
                        {
                            if (line.Trim() != "}")
                            {
                                Error("Expected '}' to end object, not: " + line);
                            }
                        }
                        else
                        {
                            startLine -= 1;
                        }

                        return(retVal);
                    }
                    else
                    {
                        if (scanningCode)
                        {
                            retVal.Value += line;
                        }
                        else
                        {
                            var lineAtom = ParseLine(line);
                            switch (lineAtom.AtomType)
                            {
                            case ParseAtomType.NameValue:
                                retVal.Add(new NinjaField(lineAtom.Name, lineAtom.Value));
                                break;

                            case ParseAtomType.NameValueValue:
                                if (!lineAtom.HasSecondValue)
                                {
                                    Error("Name/Value Values must contain values, offending line: \n\t" + line);
                                }
                                retVal.Add(new NinjaField(lineAtom.Name, lineAtom.Value)
                                {
                                    MetaValue = lineAtom.Value2
                                });
                                break;

                            case ParseAtomType.CodePrefix:
                                retVal.Add(new NinjaField(lineAtom.Name, Scan(code, ref startLine, CalcIndent(line))));
                                break;

                            case ParseAtomType.NameValueCodePrefix:
                                if (!lineAtom.HasSecondValue)
                                {
                                    Error("Name/Value code prefixes must contain values, offending line: \n\t" + line);
                                }

                                var field = new NinjaField(lineAtom.Name, Scan(code, ref startLine, CalcIndent(line)));
                                field.MetaValue = lineAtom.Value2;
                                retVal.Add(field);
                                break;

                            case ParseAtomType.ObjectPrefix:
                                retVal.Add(new NinjaField(lineAtom.Name, Scan(code, ref startLine, CalcIndent(line))));
                                break;

                            case ParseAtomType.NameValueObjectPrefix:
                                if (!lineAtom.HasSecondValue)
                                {
                                    Error("Name/Value object prefixes must contain values, offending line: \n\t" + line);
                                }

                                var field2 = new NinjaField(lineAtom.Name, Scan(code, ref startLine, CalcIndent(line)));
                                field2.MetaValue = lineAtom.Value2;
                                retVal.Add(field2);
                                break;

                            default:
                                Error("New ParseAtomType not handled in line parser:  " + lineAtom.AtomType);
                                break;
                            }
                        }
                    }
                }
            }

            if (scanningCode)
            {
                Error("Expected '}' to end object, not end-of-code");
            }

            return(retVal);
        }
Exemple #3
0
 public static bool MetaedObject(NinjaObject o)
 {
     return(o.Type == NinjaType.Object && !string.IsNullOrEmpty(o.Value));
 }
Exemple #4
0
 public static bool MetaedObject(NinjaObject o, string mv)
 {
     return(o.Type == NinjaType.Object && o.Value?.ToLower() == mv.ToLower());
 }