public Value readNextValue(Qontext context, ValueType expected = ValueType.Any) { Log.spam("Interpretoken.readNextValue()"); Token t = peek(); Value result = null; if ((t.check(ValueType.Identifier)) || (t.check(ValueType.Keyword) && (t.check(Keyword.CURRENT_CONTEXT.name) || t.check(Keyword.PARENT_CONTEXT.name)))) { Log.spam("detected possible reference / identifier"); Reference[] _r = rrra(context); Reference r = _r[_r.Length - 1]; if (peek().check(Struqture.Call[OPEN])) { Log.spam("hey, it's a funqtion call!"); if (r.getValueType() == ValueType.Funqtion || r.getValueType() == ValueType.NativeCall) { Value[] p = Funqtionizer.parseParameters(context, readBody(true)); result = (r.getTrueValue() as Funqtion).execute(p, (_r.Length > 1 ? _r[_r.Length - 2] : null)); } else { throw new ParseException("can not call " + peek(-1) + ": not a funqtion."); } } else { result = r; } } else if (t.check(ValueType.Struqture)) { Log.spam("detected possible structure"); if (t.check(Struqture.Funqtion[OPEN])) { Log.spam("...it's a funqtion"); Funqtion f = Funqtionizer.parse(context, readBody(true)); if (peek().check(Struqture.Call[OPEN])) { Value[] p = Funqtionizer.parseParameters(context, readBody(true)); result = f.execute(p); } else { result = f; } } else if (t.check(Struqture.Context[OPEN])) { Obqect o = Colleqtionizer.readObqect(context, readBody(true)); result = o; } else if (t.check(Struqture.Collection[OPEN])) { Array a = Colleqtionizer.readArray(context, readBody(true)); result = a; } else if (t.check(Struqture.Call[OPEN])) { Segment s = Segmentizer.parseOne(context, readBody()); result = s.execute(context); } } else if (t.check(ValueType.Primitive)) { result = digest().makeValue(); } else if (t.check(ValueType.Operator)) { throw new ParseException("next token was unreadable as value: " + t, t); } return(result); }
public Segment[] parse(Qontext context, bool first = false) { Log.spam("Statementizer.execute()"); if (stack.Length == 0) { return(new Segment[0]); } List <Token> buffer = new List <Token>(); List <Segment> segments = new List <Segment>(); int level = 0; do { Token t = digest(); if (t.check(ValueType.Keyword) && t.getValue <Keyword>().isType(Keyword.KeywordType.DECLARATION)) { if (buffer.Count > 0) { throw new ParseException("unexpected declaration keyword '" + t.str() + "' while parsing segment.", t); } Keyword keyword = t.getValue <Keyword>(); if (keyword == Keyword.FUNQTION) { t = peek(); if (!t.check(ValueType.Identifier)) { throw new ParseException("expected identifier for declaration of '" + keyword.name + "', got '" + t.str() + "' instead.", t); } string name = digest().str(); Funqtion fq = Funqtionizer.parse(context, readBody(true)); context.set(name, new Reference(fq)); } if (peek().check(";")) { digest(); } } else if (t.check(ValueType.Keyword) && t.getValue <Keyword>().isType(Keyword.KeywordType.CONDITION)) { segments.Add(parseCondition(context, t.getValue <Keyword>())); } else { if (t.check(";") && level == 0) { if (first) { return new Segment[] { new Segment(buffer.ToArray()) } } ; else { segments.Add(new Segment(buffer.ToArray())); } buffer.Clear(); } else { if (t.check(Struqture.Context[OPEN])) { level++; } else if (t.check(Struqture.Context[CLOSE])) { level--; } buffer.Add(t); if (endOfStack()) { segments.Add(new Segment(buffer.ToArray())); } } } } while (!endOfStack()); return(segments.ToArray()); }