public void CreateConditional(List <Parser.IfStatement.Clause> clauses, Block block, Dictionary <string, Yarn.Parser.Node> nodes, Dictionary <string, Block> blocks)
    {
        /**
         * NOTES:
         *  - clause.expression will be null if it's an else statement
         *  - refer to DialogueRunner for examples of parsing
         */
        for (int i = 0; i < clauses.Count; i++)
        {
            Parser.IfStatement.Clause clause = clauses[i];
            //if the expression is null, it is an else statement
            if (clause.expression == null)
            {
                Else elseStatement = currentFlowchartObj.AddComponent <Else>();
                block.CommandList.Add(elseStatement);
            }
            // if the clause is the first entry in clauses, then it is an if statement
            else if (i == 0)
            {
                If ifstatement = currentFlowchartObj.AddComponent <If>();
                block.CommandList.Add(ifstatement);
                if (clause.expression.function != null)
                {
                    //it is an operator statement
                    switch (clause.expression.function.name)
                    {
                    case "LessThanOrEqualTo":
                        ifstatement.SetCompareOperator(CompareOperator.LessThanOrEquals);
                        break;

                    case "GreaterThanOrEqualTo":
                        ifstatement.SetCompareOperator(CompareOperator.GreaterThanOrEquals);
                        break;

                    case "LessThan":
                        ifstatement.SetCompareOperator(CompareOperator.LessThan);
                        break;

                    case "GreaterThan":
                        ifstatement.SetCompareOperator(CompareOperator.GreaterThan);
                        break;

                    case "EqualTo":
                        ifstatement.SetCompareOperator(CompareOperator.Equals);
                        break;

                    case "NotEqualTo":
                        ifstatement.SetCompareOperator(CompareOperator.NotEquals);
                        break;

                    default:
                        Debug.LogError("NEW FUNCTION NAME: " + clause.expression.function.name);
                        break;
                    }

                    Flowchart currFlowchart = currentFlowchartObj.GetComponent <Flowchart>();

                    Parser.Expression secondExpression = clause.expression.parameters[1];
                    switch (secondExpression.value.value.type)
                    {
                    case Value.Type.String:
                        StringVariable sv = null;
                        if (currFlowchart.GetVariable <StringVariable>(clause.expression.parameters[0].value.value.GetVariableName()) == null)
                        {
                            sv       = currentFlowchartObj.AddComponent <StringVariable>();
                            sv.Scope = VariableScope.Public;
                            sv.Key   = clause.expression.parameters[0].value.value.GetVariableName();
                            sv.Value = "";
                            currFlowchart.AddVariable(sv);
                            currFlowchart.SetStringVariable(sv.Key, "");
                        }
                        else
                        {
                            sv = currFlowchart.GetVariable <StringVariable>(clause.expression.parameters[0].value.value.GetVariableName());
                        }
                        StringDataMulti data = new StringDataMulti();
                        data.stringVal = secondExpression.value.value.GetStringValue();
                        ifstatement.SetVariable(sv);
                        ifstatement.SetStringData(data);
                        break;

                    case Value.Type.Number:
                        FloatVariable fv = null;
                        if (currFlowchart.GetVariable <FloatVariable>(clause.expression.parameters[0].value.value.GetVariableName()) == null)
                        {
                            fv       = currentFlowchartObj.AddComponent <FloatVariable>();
                            fv.Scope = VariableScope.Public;
                            fv.Key   = clause.expression.parameters[0].value.value.GetVariableName();
                            fv.Value = 0;
                            currFlowchart.AddVariable(fv);
                            currFlowchart.SetFloatVariable(fv.Key, 0);
                        }
                        else
                        {
                            fv = currFlowchart.GetVariable <FloatVariable>(clause.expression.parameters[0].value.value.GetVariableName());
                        }
                        FloatData fdata = new FloatData();
                        fdata.floatVal = secondExpression.value.value.GetNumberValue();
                        ifstatement.SetVariable(fv);
                        ifstatement.SetFloatData(fdata);
                        break;

                    case Value.Type.Bool:
                        BooleanVariable bv = null;
                        if (currFlowchart.GetVariable <BooleanVariable>(clause.expression.parameters[0].value.value.GetVariableName()) == null)
                        {
                            bv       = currentFlowchartObj.AddComponent <BooleanVariable>();
                            bv.Scope = VariableScope.Public;
                            bv.Key   = clause.expression.parameters[0].value.value.GetVariableName();
                            bv.Value = false;
                            currFlowchart.AddVariable(bv);
                            currFlowchart.SetBooleanVariable(bv.Key, false);
                        }
                        else
                        {
                            bv = currFlowchart.GetVariable <BooleanVariable>(clause.expression.parameters[0].value.value.GetVariableName());
                        }
                        BooleanData bdata = new BooleanData();
                        bdata.booleanVal = secondExpression.value.value.GetBoolValue();
                        ifstatement.SetVariable(bv);
                        ifstatement.SetBooleanData(bdata);
                        break;

                    default:
                        Debug.LogError("Unknown Parser Value Type");
                        break;
                    }
                }
            }
            //otherwise, it's an elseif statement
            else
            {
                ElseIf ifstatement = currentFlowchartObj.AddComponent <ElseIf>();
                block.CommandList.Add(ifstatement);
                if (clause.expression.function != null)
                {
                    //it is an operator statement
                    switch (clause.expression.function.name)
                    {
                    case "LessThanOrEqualTo":
                        ifstatement.SetCompareOperator(CompareOperator.LessThanOrEquals);
                        break;

                    case "GreaterThanOrEqualTo":
                        ifstatement.SetCompareOperator(CompareOperator.GreaterThanOrEquals);
                        break;

                    case "LessThan":
                        ifstatement.SetCompareOperator(CompareOperator.LessThan);
                        break;

                    case "GreaterThan":
                        ifstatement.SetCompareOperator(CompareOperator.GreaterThan);
                        break;

                    case "EqualTo":
                        ifstatement.SetCompareOperator(CompareOperator.Equals);
                        break;

                    case "NotEqualTo":
                        ifstatement.SetCompareOperator(CompareOperator.NotEquals);
                        break;

                    default:
                        Debug.LogError("NEW FUNCTION NAME: " + clause.expression.function.name);
                        break;
                    }

                    Flowchart currFlowchart = currentFlowchartObj.GetComponent <Flowchart>();

                    Parser.Expression secondExpression = clause.expression.parameters[1];
                    switch (secondExpression.value.value.type)
                    {
                    case Value.Type.String:
                        StringVariable sv = null;
                        if (currFlowchart.GetVariable <StringVariable>(clause.expression.parameters[0].value.value.GetVariableName()) == null)
                        {
                            sv       = currentFlowchartObj.AddComponent <StringVariable>();
                            sv.Scope = VariableScope.Public;
                            sv.Key   = clause.expression.parameters[0].value.value.GetVariableName();
                            sv.Value = "";
                            currFlowchart.AddVariable(sv);
                            currFlowchart.SetStringVariable(sv.Key, "");
                        }
                        else
                        {
                            sv = currFlowchart.GetVariable <StringVariable>(clause.expression.parameters[0].value.value.GetVariableName());
                        }
                        StringDataMulti data = new StringDataMulti();
                        data.stringVal = secondExpression.value.value.GetStringValue();
                        ifstatement.SetVariable(sv);
                        ifstatement.SetStringData(data);
                        break;

                    case Value.Type.Number:
                        FloatVariable fv = null;
                        if (currFlowchart.GetVariable <FloatVariable>(clause.expression.parameters[0].value.value.GetVariableName()) == null)
                        {
                            fv       = currentFlowchartObj.AddComponent <FloatVariable>();
                            fv.Scope = VariableScope.Public;
                            fv.Key   = clause.expression.parameters[0].value.value.GetVariableName();
                            fv.Value = 0;
                            currFlowchart.AddVariable(fv);
                            currFlowchart.SetFloatVariable(fv.Key, 0);
                        }
                        else
                        {
                            fv = currFlowchart.GetVariable <FloatVariable>(clause.expression.parameters[0].value.value.GetVariableName());
                        }
                        FloatData fdata = new FloatData();
                        fdata.floatVal = secondExpression.value.value.GetNumberValue();
                        ifstatement.SetVariable(fv);
                        ifstatement.SetFloatData(fdata);
                        break;

                    case Value.Type.Bool:
                        BooleanVariable bv = null;
                        if (currFlowchart.GetVariable <BooleanVariable>(clause.expression.parameters[0].value.value.GetVariableName()) == null)
                        {
                            bv       = currentFlowchartObj.AddComponent <BooleanVariable>();
                            bv.Scope = VariableScope.Public;
                            bv.Key   = clause.expression.parameters[0].value.value.GetVariableName();
                            bv.Value = false;
                            currFlowchart.AddVariable(bv);
                            currFlowchart.SetBooleanVariable(bv.Key, false);
                        }
                        else
                        {
                            bv = currFlowchart.GetVariable <BooleanVariable>(clause.expression.parameters[0].value.value.GetVariableName());
                        }
                        BooleanData bdata = new BooleanData();
                        bdata.booleanVal = secondExpression.value.value.GetBoolValue();
                        ifstatement.SetVariable(bv);
                        ifstatement.SetBooleanData(bdata);
                        break;

                    default:
                        Debug.LogError("Unknown Parser Value Type");
                        break;
                    }
                }
            }

            //Parse the statements once you figure out what kind of if-else to use
            ParseNodeHelper(clause.statements, block, nodes, blocks);
        }

        //Put in an end-if
        End end = currentFlowchartObj.AddComponent <End>();

        block.CommandList.Add(end);
    }
Beispiel #2
0
        internal override void TryAlt(ref Worker wr, int i, Cont <T> aK, Else aE)
        {
Spin:
            var state = this.State;

Reconsider:
            if (state > Running)
            {
                goto Completed;
            }
            if (state < Delayed)
            {
                goto Spin;
            }
            var check = state;

            state = Interlocked.CompareExchange(ref this.State, state - MakeLocked, state);
            if (Delayed == state)
            {
                goto Delayed;
            }
            if (state != check)
            {
                goto Reconsider;
            }

            WaitQueue.AddTaker(ref this.Readers, i, aE.pk, aK);
            this.State = Running;
            aE.TryElse(ref wr, i + 1);
            return;

Delayed:
            var readers = this.Readers;

            this.Readers = null;
            this.State   = Running;

            var fulfill = readers as Fulfill;

            fulfill.reader = aK;
            fulfill.me     = i;
            fulfill.pk     = aE.pk;

            Worker.PushNew(ref wr, fulfill);
            aE.TryElse(ref wr, i + i);
            return;

Completed:
            var pkSelf = aE.pk;

TryPick:
            var stSelf = Pick.TryPick(pkSelf);

            if (stSelf > 0)
            {
                goto AlreadyPicked;
            }
            if (stSelf < 0)
            {
                goto TryPick;
            }

            Pick.SetNacks(ref wr, i, pkSelf);

            if (state == HasValue)
            {
                Cont.Do(aK, ref wr, this.Value);
            }
            else
            {
                aK.DoHandle(ref wr, (this.Readers as Fail <T>).exn);
            }
AlreadyPicked:
            return;
        }
Beispiel #3
0
        internal override void TryAlt(ref Worker wr, int i, Cont <T> xK, Else xE)
        {
            var pkSelf = xE.pk;

            this.Lock.Enter();
            var tail = this.Givers;

            if (null == tail)
            {
                goto TryTaker;
            }
            Send <T> cache  = null;
            var      cursor = tail.Next;

TryGiver:
            var giver = cursor as Giver <T>;
            Pick pkOther = null;

            if (null != giver)
            {
                goto Giver;
            }

TryPick:
            var st = Pick.TryPick(pkSelf);

            if (st > 0)
            {
                goto AlreadyPicked;
            }
            if (st < 0)
            {
                goto TryPick;
            }

            WaitQueue.RemoveRange(ref this.Givers, cursor);
            this.Lock.Exit();

            Pick.SetNacks(ref wr, i, pkSelf);
            Cont.Do(xK, ref wr, cursor.Value);
            return;

AlreadyPicked:
            WaitQueue.RemoveRangeInclusive(this.Givers, cursor);
            this.Lock.Exit();
            return;

Giver:
            cursor  = cursor.Next;
            pkOther = giver.Pick;

            if (null == pkOther)
            {
                goto TryPickSelf;
            }
            if (pkOther == pkSelf)
            {
                goto OtherIsSelf;
            }

TryPickOther:
            var stOther = Pick.TryClaim(pkOther);

            if (stOther > 0)
            {
                goto TryNextGiver;
            }
            if (stOther < 0)
            {
                goto TryPickOther;
            }

TryPickSelf:
            var stSelf = Pick.TryPick(pkSelf);

            if (stSelf > 0)
            {
                goto SelfAlreadyPicked;
            }
            if (stSelf < 0)
            {
                goto BackOff;
            }

            //GotGiver:
            WaitQueue.RemoveRange(ref this.Givers, giver);
            this.Lock.Exit();
            if (null != pkOther)
            {
                Pick.PickClaimedAndSetNacks(ref wr, giver.Me, pkOther);
            }
            Pick.SetNacks(ref wr, i, pkSelf);
            Worker.Push(ref wr, giver.Cont);
            Cont.Do(xK, ref wr, giver.Value);
            return;

BackOff:
            if (null == pkOther)
            {
                goto TryPickSelf;
            }
            Pick.Unclaim(pkOther);
            goto TryPickOther;

OtherIsSelf:
            WaitQueue.Enqueue(ref cache, giver);
            if (giver != tail)
            {
                goto TryGiver;
            }

            this.Givers = cache;
            goto TryTaker;

TryNextGiver:
            if (giver != tail)
            {
                goto TryGiver;
            }

            this.Givers = cache;
TryTaker:
            WaitQueue.AddTaker(ref this.Takers, i, pkSelf, xK);
            this.Lock.Exit();
            xE.TryElse(ref wr, i + 1);
            return;

SelfAlreadyPicked:
            if (null != pkOther)
            {
                Pick.Unclaim(pkOther);
            }

            WaitQueue.RemoveRangeInclusive(this.Givers, giver);
            this.Lock.Exit();
            return;
        }
Beispiel #4
0
 internal override void TryAlt(ref Worker wr, int i, Cont <X> xK, Else xE)
 {
     Handler.DoHandle(xK, ref wr, e);
 }
Beispiel #5
0
 internal WithNackCont(Cont <X> xK, Else xE)
 {
     this.xK = xK;
     this.xE = xE;
 }
Beispiel #6
0
 internal override void TryAlt(ref Worker wr, int i, Cont <X> xK, Else xE)
 {
     xE.TryElse(ref wr, i);
 }
Beispiel #7
0
        public override Expression CloneExpressionOnly()
        {
            ConditionExpression result = new ConditionExpression(Condition.CloneExpressionOnly(), Then.CloneExpressionOnly(), Else.CloneExpressionOnly(), null);

            return(result);
        }
Beispiel #8
0
            public override Expr UnEx()
            {
                Temp.Temp r    = new Temp.Temp();
                Label     join = new Label();
                Label     t    = new Label();
                Label     f    = new Label();

                return(new ESEQ(new SEQ(Test.UnCx(t, f),
                                        new SEQ(new LABEL(t),
                                                new SEQ(new MOVE(new TEMP(r), Then.UnEx()),
                                                        new SEQ(new JUMP(join),
                                                                new SEQ(new LABEL(f),
                                                                        new SEQ(new MOVE(new TEMP(r), Else.UnEx()),
                                                                                new LABEL(join))))))),
                                new TEMP(r)));
            }
Beispiel #9
0
 public string Visit(Else node)
 {
     return(VisitChildren(node));
 }
Beispiel #10
0
        public Node If()
        {
            var result = new If()
            {
                AnchorToken = Expect(TokenCategory.IF)
            };

            result.Add(Expression());
            Expect(TokenCategory.THEN);
            if (firstOfStatement.Contains(CurrentToken))
            {
                var statementList = new StatementList();
                while (firstOfStatement.Contains(CurrentToken))
                {
                    statementList.Add(Statement());
                }
                result.Add(statementList);
            }

            var elseIfList = new ElseIfList();

            if (CurrentToken == TokenCategory.ELSEIF)
            {
                while (CurrentToken == TokenCategory.ELSEIF)
                {
                    var elseIf = new ElseIf()
                    {
                        AnchorToken = Expect(TokenCategory.ELSEIF)
                    };

                    elseIf.Add(Expression());
                    Expect(TokenCategory.THEN);
                    if (firstOfStatement.Contains(CurrentToken))
                    {
                        var statementList = new StatementList();
                        while (firstOfStatement.Contains(CurrentToken))
                        {
                            statementList.Add(Statement());
                        }
                        elseIf.Add(statementList);
                    }
                    elseIfList.Add(elseIf);
                }
            }
            result.Add(elseIfList);

            var els = new Else();

            if (CurrentToken == TokenCategory.ELSE)
            {
                els.AnchorToken = Expect(TokenCategory.ELSE);
                if (firstOfStatement.Contains(CurrentToken))
                {
                    var statementList = new StatementList();
                    while (firstOfStatement.Contains(CurrentToken))
                    {
                        statementList.Add(Statement());
                    }
                    els.Add(statementList);
                }
            }
            result.Add(els);

            Expect(TokenCategory.END);
            Expect(TokenCategory.SEMICOLON);
            return(result);
        }
Beispiel #11
0
 internal PrepareAltCont(int i, Cont <X> xK, Else xE)
 {
     this.i  = i;
     this.xK = xK;
     this.xE = xE;
 }
Beispiel #12
0
        Stmt stmt()
        {
            Expr x;
            Stmt s, s1, s2;
            Stmt savedStmt;

            Stmt stmtResult;

            switch (look.tag)
            {
            case ';':
            {
                move();
                //return Stmt.Null;
                stmtResult = Stmt.Null;
                break;
            }

            case Tag.IF:
            {
                match(Tag.IF);
                match('(');
                x = bool_expr();
                match(')');
                s1 = stmt();
                if (look.tag != Tag.ELSE)
                {
                    return(new If(x, s1, compileRows));
                }
                match(Tag.ELSE);
                s2 = stmt();
                //return new Else(x, s1, s2);
                stmtResult = new Else(x, s1, s2, compileRows);
                break;
            }

            case Tag.WHILE:
            {
                While whilenode = new While(compileRows);
                savedStmt      = Stmt.Enclosing;
                Stmt.Enclosing = whilenode;
                match(Tag.WHILE);
                match('(');
                x = bool_expr();
                match(')');
                s1 = stmt();
                whilenode.init(x, s1);
                Stmt.Enclosing = savedStmt;
                //return whilenode;
                stmtResult = whilenode;
                break;
            }

            case Tag.DO:
            {
                Do donode = new Do(compileRows);
                savedStmt      = Stmt.Enclosing;
                Stmt.Enclosing = donode;
                match(Tag.DO);
                s1 = stmt();
                match(Tag.WHILE);
                match('(');
                x = bool_expr();
                match(')');
                match(';');
                donode.init(s1, x);
                Stmt.Enclosing = savedStmt;
                //return donode;
                stmtResult = donode;
                break;
            }

            case Tag.BREAK:
            {
                match(Tag.BREAK);
                match(';');
                //return new Break();
                stmtResult = new Break(compileRows);
                break;
            }

            case '{':
                return(block());

            default:
                //return assign();
                stmtResult = assign();
                break;
            }

/*
 *          for(int i = 0;i< stmtResult.rows.Count;i++)
 *          {
 *              compileRows.Add(stmtResult.rows[i]);
 *          }
 */
            return(stmtResult);
        }
 internal InsertElseIfBeforeElseCommand(If iif, ElseIf newElseIf, Else existedElse)
 {
     this.If             = iif;
     this.InsertedElseIf = newElseIf;
     this.ExistedElse    = existedElse;
 }
Beispiel #14
0
 public void Visit(Else node)
 {
 }
Beispiel #15
0
 public override void Optimize()
 {
     Expression = Expression.Reduce();
     Body.Optimize();
     Else.Optimize();
 }
Beispiel #16
0
        /// <summary>
        /// Converts an object to a <see cref="JsonValue"/>.
        /// </summary>
        /// <param name="serializer">The <see cref="JsonSerializer"/> instance to use for additional
        /// serialization of values.</param>
        /// <returns>The <see cref="JsonValue"/> representation of the object.</returns>
        public virtual JsonValue ToJson(JsonSerializer serializer)
        {
            if (BooleanSchemaDefinition != null)
            {
                return(BooleanSchemaDefinition);
            }

            serializer = serializer ?? _schemaSerializer;

            var json = new JsonObject();

            if (!string.IsNullOrWhiteSpace(Schema))
            {
                json["$schema"] = Schema;
            }
            if (Id != null)
            {
                json["$id"] = Id;
            }
            if (Comment != null)
            {
                json["$comment"] = Comment;
            }
            if (Title != null)
            {
                json["title"] = Title;
            }
            if (!string.IsNullOrWhiteSpace(Description))
            {
                json["description"] = Description;
            }
            if (Definitions != null)
            {
                json["definitions"] = Definitions.ToJson(serializer);
            }
            if (ReadOnly.HasValue)
            {
                json["readOnly"] = ReadOnly;
            }
            if (Type != JsonSchemaType.NotDefined)
            {
                var array = Type.ToJson();
                if (array.Type == JsonValueType.Array)
                {
                    array.Array.EqualityStandard = ArrayEquality.ContentsEqual;
                }
                json["type"] = array;
            }
            if (Properties != null)
            {
                json["properties"] = Properties.ToJson(serializer);
            }
            if (Maximum.HasValue)
            {
                json["maximum"] = Maximum;
            }
            if (ExclusiveMaximum.HasValue)
            {
                json["exclusiveMaximum"] = ExclusiveMaximum;
            }
            if (Minimum.HasValue)
            {
                json["minimum"] = Minimum;
            }
            if (ExclusiveMinimum.HasValue)
            {
                json["exclusiveMinimum"] = ExclusiveMinimum;
            }
            if (MultipleOf.HasValue)
            {
                json["multipleOf"] = MultipleOf;
            }
            if (MaxLength.HasValue)
            {
                json["maxLength"] = MaxLength;
            }
            if (MinLength.HasValue)
            {
                json["minLength"] = MinLength;
            }
            if (Pattern != null)
            {
                json["pattern"] = Pattern;
            }
            if (AdditionalItems != null)
            {
                json["additionalItems"] = AdditionalItems.ToJson(serializer);
            }
            if (Items != null)
            {
                json["items"] = Items.ToJson(serializer);
            }
            if (MaxItems.HasValue)
            {
                json["maxItems"] = MinItems;
            }
            if (MinItems.HasValue)
            {
                json["minItems"] = MinItems;
            }
            if (UniqueItems ?? false)
            {
                json["uniqueItems"] = UniqueItems;
            }
            if (Contains != null)
            {
                json["contains"] = Contains.ToJson(serializer);
            }
            if (MaxProperties.HasValue)
            {
                json["maxProperties"] = MaxProperties;
            }
            if (MinProperties.HasValue)
            {
                json["minProperties"] = MinProperties;
            }
            if (Required != null)
            {
                json["required"] = Required.ToJson();
            }
            if (AdditionalProperties != null)
            {
                json["additionalProperties"] = AdditionalProperties.ToJson(serializer);
            }
            if (PatternProperties != null && PatternProperties.Any())
            {
                json["patternProperties"] = PatternProperties.ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value).ToJson(serializer);
            }
            if (Dependencies != null && Dependencies.Any())
            {
                var jsonDependencies = new JsonObject();
                foreach (var dependency in Dependencies)
                {
                    jsonDependencies[dependency.PropertyName] = dependency.GetJsonData();
                }
                json["dependencies"] = jsonDependencies;
            }
            if (PropertyNames != null)
            {
                json["propertyNames"] = PropertyNames.ToJson(serializer);
            }
            if (Const != null)
            {
                json["const"] = Const;
            }
            if (Enum != null)
            {
                var array = Enum.ToJson(serializer);
                array.Array.EqualityStandard = ArrayEquality.ContentsEqual;
                json["enum"] = Enum.ToJson(serializer);
            }
            if (Format != null)
            {
                json["format"] = Format.Key;
            }
            if (ContentMediaType != null)
            {
                json["contentMediaType"] = ContentMediaType;
            }
            if (ContentEncoding != null)
            {
                json["contentEncoding"] = serializer.Serialize(ContentEncoding);
            }
            if (If != null)
            {
                json["if"] = If.ToJson(serializer);
            }
            if (Then != null)
            {
                json["then"] = Then.ToJson(serializer);
            }
            if (Else != null)
            {
                json["else"] = Else.ToJson(serializer);
            }
            if (AllOf != null)
            {
                var array = AllOf.Select(s => s.ToJson(serializer)).ToJson();
                array.EqualityStandard = ArrayEquality.ContentsEqual;
                json["allOf"]          = array;
            }
            if (AnyOf != null)
            {
                var array = AnyOf.Select(s => s.ToJson(serializer)).ToJson();
                array.EqualityStandard = ArrayEquality.ContentsEqual;
                json["anyOf"]          = array;
            }
            if (OneOf != null)
            {
                var array = OneOf.Select(s => s.ToJson(serializer)).ToJson();
                array.EqualityStandard = ArrayEquality.ContentsEqual;
                json["oneOf"]          = array;
            }
            if (Not != null)
            {
                json["not"] = Not.ToJson(serializer);
            }
            if (Default != null)
            {
                json["default"] = Default;
            }
            if (Examples != null)
            {
                json["examples"] = Examples;
            }
            if (ExtraneousDetails != null)
            {
                foreach (var kvp in ExtraneousDetails.Where(kvp => !_definedProperties.Contains(kvp.Key)))
                {
                    json[kvp.Key] = kvp.Value;
                }
            }
            return(json);
        }
Beispiel #17
0
 public Type Visit(Else node)
 {
     VisitChildren(node);
     return(Type.VOID);
 }
Beispiel #18
0
        public void TestTerminals()
        {
            AssertSuccess(LBrace.Parse("{"), '{', true);
            AssertSuccess(RBrace.Parse("}"), '}', true);
            AssertSuccess(LParen.Parse("("), '(', true);
            AssertSuccess(RParen.Parse(")"), ')', true);
            AssertSuccess(Comma.Parse(","), ',', true);
            AssertSuccess(UScore.Parse("_"), '_', true);
            AssertSuccess(DQuote.Parse("\""), '"', true);
            AssertSuccess(SQuote.Parse("'"), '\'', true);

            AssertSuccess(Str.Parse("\"abc\""), "abc", true);
            AssertSuccess(Chr.Parse("'a'"), "a", true);

            AssertSuccess(ExprParser.Int.Parse("234"), "234", true);
            AssertSuccess(Float.Parse("234.0"), "234.0", true);
            AssertSuccess(Float.Parse(".0"), ".0", true);
            AssertSuccess(Float.Parse("1e2"), "1e2", true);
            AssertSuccess(Float.Parse("1E2"), "1E2", true);
            AssertSuccess(Float.Parse("1E-2"), "1E-2", true);
            AssertSuccess(Float.Parse("1E+2"), "1E+2", true);
            AssertSuccess(Float.Parse("1.0E2"), "1.0E2", true);
            AssertSuccess(Float.Parse("1.0E-2"), "1.0E-2", true);
            AssertSuccess(Float.Parse("1.0E+2"), "1.0E+2", true);


            AssertSuccess(IdStart.Parse("_"), '_', true);
            AssertSuccess(IdStart.Parse("a"), 'a', true);
            AssertSuccess(IdRest.Parse("_"), '_', true);
            AssertSuccess(IdRest.Parse("1"), '1', true);
            AssertSuccess(IdRest.Parse("_"), '_', true);
            AssertSuccess(IdRest.Parse("a"), 'a', true);
            AssertSuccess(Id.Parse("_"), "_", true);
            AssertSuccess(Id.Parse("A"), "A", true);
            AssertSuccess(Id.Parse("z"), "z", true);
            AssertSuccess(Id.Parse("abc"), "abc", true);
            AssertSuccess(Id.Parse("_abc"), "_abc", true);
            AssertSuccess(Id.Parse("_1"), "_1", true);
            AssertSuccess(Id.Parse("_1_a_zZ"), "_1_a_zZ", true);
            AssertSuccess(Id.Parse("e"), "e", true);
            AssertSuccess(Id.Parse("el"), "el", true);
            AssertSuccess(Id.Parse("els"), "els", true);
            AssertSuccess(Id.Parse("else1"), "else1", true);
            AssertSuccess(Id.Parse("i"), "i", true);
            AssertSuccess(Id.Parse("if1"), "if1", true);
            AssertSuccess(Id.Parse("if_"), "if_", true);
            AssertSuccess(Id.Parse("t"), "t", true);
            AssertSuccess(Id.Parse("tr"), "tr", true);

            AssertSuccess(True.Parse("true"), "true", true);
            AssertSuccess(False.Parse("false"), "false", true);
            AssertSuccess(If.Parse("if"), "if", true);
            AssertSuccess(Else.Parse("else"), "else", true);
            AssertSuccess(Then.Parse("then"), "then", true);
            AssertSuccess(ExprParser.In.Parse("in"), "in", true);

            AssertSuccess(Bool.Parse("true"), "true", true);
            AssertSuccess(Bool.Parse("false"), "false", true);
            AssertSuccess(Bool.Parse("\"true\""), "true", true);
            AssertSuccess(Bool.Parse("\"false\""), "false", true);

            AssertSuccess(KeyWords.Parse("else"), "else", true);
            AssertSuccess(KeyWords.Parse("then"), "then", true);
            AssertSuccess(KeyWords.Parse("if"), "if", true);
            AssertSuccess(KeyWords.Parse("in "), "in", true);
        }
Beispiel #19
0
        public override Expression Clone()
        {
            ConditionExpression result = new ConditionExpression(Condition.Clone(), Then.Clone(), Else.Clone(), instructions);

            return(result);
        }
 protected internal override MAst Transform()
 {
     return(MAst.Condition(Test.Transform(), Then.Transform(), Else.Transform()));
 }
Beispiel #21
0
 internal abstract void TryAlt(ref Worker wr, int i, Cont <T> xK, Else xE);
Beispiel #22
0
 public virtual bool Visit(Else elseNode)
 {
     return(true);
 }
Beispiel #23
0
 internal WithNackElse(Nack nk, Else xE) : base(xE.pk)
 {
     this.nk = nk;
     this.xE = xE;
 }
Beispiel #24
0
        internal override void TryAlt(ref Worker wr, int i, Cont <T> aK, Else aE)
        {
            var pkSelf = aE.pk;

Spin:
            var state = this.State;

            if (state > Running)
            {
                goto Completed;
            }
            if (state < Delayed)
            {
                goto Spin;
            }
            if (state != Interlocked.CompareExchange(ref this.State, ~state, state))
            {
                goto Spin;
            }

            if (Delayed == state)
            {
                goto Delayed;
            }

            WaitQueue.AddTaker(ref this.Readers, i, pkSelf, aK);
            this.State = Running;
            aE.TryElse(ref wr, i + 1);
            return;

Delayed:
            var taker = new Taker <T>();

            taker.Cont = aK;
            taker.Me   = i;
            taker.Pick = pkSelf;
            taker.Next = taker;

            var readers = this.Readers;

            this.Readers = taker;
            this.State   = Running;

            var fulfill = readers as Fulfill;
            var tJ      = fulfill.tP;

            fulfill.tP = this;
            Worker.PushNew(ref wr, new JobWork <T>(tJ, fulfill));
            aE.TryElse(ref wr, i + i);
            return;

Completed:
            var stSelf = Pick.TryPick(pkSelf);

            if (stSelf > 0)
            {
                goto AlreadyPicked;
            }
            if (stSelf < 0)
            {
                goto Completed;
            }

            Pick.SetNacks(ref wr, i, pkSelf);

            if (state == HasValue)
            {
                Cont.Do(aK, ref wr, this.Value);
            }
            else
            {
                aK.DoHandle(ref wr, (this.Readers as Fail <T>).exn);
            }
AlreadyPicked:
            return;
        }
Beispiel #25
0
 internal override void TryAlt(ref Worker wr, int i, Cont <Y> yK, Else yE)
 {
     xA.TryAlt(ref wr, i, new ContBind(this, yK), yE);
 }
Beispiel #26
0
 /// <summary>
 /// User-friendly representation as string.
 /// </summary>
 /// <returns></returns>
 public override string ToString()
 {
     return($"{Condition.ToString()} ? {Then.ToString()} : {Else.ToString()}");
 }
Beispiel #27
0
            internal override void TryAlt(ref Worker wr, int i, Cont <Unit> uK, Else uE)
            {
                var pkSelf = uE.pk;
                var ch     = this.Ch;

                ch.Lock.Enter();
                var tail = ch.Takers;

                if (null == tail)
                {
                    goto TryGiver;
                }
                Cont <T> cache  = null;
                var      cursor = tail.Next;

TryTaker:
                var taker = cursor as Cont <T>;

                cursor = cursor.Next;

                int me      = 0;
                var pkOther = taker.GetPick(ref me);

                if (null == pkOther)
                {
                    goto TryPickSelf;
                }
                if (pkOther == pkSelf)
                {
                    goto OtherIsSelf;
                }

TryPickOther:
                var stOther = Pick.TryClaim(pkOther);

                if (stOther > 0)
                {
                    goto TryNextTaker;
                }
                if (stOther < 0)
                {
                    goto TryPickOther;
                }

TryPickSelf:
                var stSelf = Pick.TryPick(pkSelf);

                if (stSelf > 0)
                {
                    goto SelfAlreadyPicked;
                }
                if (stSelf < 0)
                {
                    goto BackOff;
                }

                WaitQueue.RemoveRange(ref ch.Takers, taker);
                ch.Lock.Exit();
                if (null != pkOther)
                {
                    Pick.PickClaimedAndSetNacks(ref wr, me, pkOther);
                }
                Pick.SetNacks(ref wr, i, pkSelf);
                taker.Value = this.X;
                Worker.Push(ref wr, taker);
                Work.Do(uK, ref wr);
                return;

BackOff:
                if (null == pkOther)
                {
                    goto TryPickSelf;
                }
                Pick.Unclaim(pkOther);
                goto TryPickOther;

OtherIsSelf:
                WaitQueue.Enqueue(ref cache, taker);
                if (taker != tail)
                {
                    goto TryTaker;
                }

                ch.Takers = cache;
                goto TryGiver;

TryNextTaker:
                if (taker != tail)
                {
                    goto TryTaker;
                }

                ch.Takers = cache;
TryGiver:
                WaitQueue.AddGiver(ref ch.Givers, this.X, i, pkSelf, uK);
                ch.Lock.Exit();
                uE.TryElse(ref wr, i + 1);
                return;

SelfAlreadyPicked:
                if (null != pkOther)
                {
                    Pick.Unclaim(pkOther);
                }

                WaitQueue.RemoveRangeInclusive(ch.Takers, taker);
                ch.Lock.Exit();
                return;
            }
Beispiel #28
0
 public override bool ResolveNames()
 {
     return(Cond.ResolveNames() && Then.ResolveNames() && Else.ResolveNames());
 }
 public void Visit(Else node)
 {
     VisitChildren(node);
 }
Beispiel #30
0
        public Node If()
        {
            var ifToken = Expect(TokenCategory.IF);
            var nodeIf  = new If()
            {
                AnchorToken = ifToken
            };

            nodeIf.Add(Expression());
            Expect(TokenCategory.THEN);
            var stmtList = new StatementList();

            while (firstOfStatement.Contains(CurrentToken))
            {
                stmtList.Add(Statement());
            }

            nodeIf.Add(stmtList);

            while (CurrentToken == TokenCategory.ELSEIF)
            {
                var nodeElseIf = new ElseIf()
                {
                    AnchorToken = Expect(TokenCategory.ELSEIF)
                };

                nodeElseIf.Add(Expression());
                Expect(TokenCategory.THEN);

                var stmtListElseIf = new StatementList();
                while (firstOfStatement.Contains(CurrentToken))
                {
                    stmtListElseIf.Add(Statement());
                }

                nodeElseIf.Add(stmtListElseIf);
                nodeIf.Add(nodeElseIf);
            }

            while (CurrentToken == TokenCategory.ELSE)
            {
                var nodeElse = new Else()
                {
                    AnchorToken = Expect(TokenCategory.ELSE)
                };

                var stmtListElse = new StatementList();
                while (firstOfStatement.Contains(CurrentToken))
                {
                    stmtListElse.Add(Statement());
                }

                nodeElse.Add(stmtListElse);
                nodeIf.Add(nodeElse);
            }

            Expect(TokenCategory.END);
            Expect(TokenCategory.ENDLINE);

            return(nodeIf);


            // var ifToken = Expect(TokenCategory.IF);
            // var exprList = new ExpressionList();
            // exprList.Add(Expression());
            // var thenNode = new Then() {
            //     AnchorToken = Expect(TokenCategory.THEN)
            // };
            // var stmtList = new StatementList();
            // while (firstOfStatement.Contains(CurrentToken)) {
            //     stmtList.Add(Statement());
            // }
            // if(CurrentToken == TokenCategory.ELSEIF) {
            //     while (CurrentToken == TokenCategory.ELSEIF) {
            //         var elseIf = new ElseIf() {
            //             AnchorToken = Expect(TokenCategory.ELSEIF)
            //         };
            //         exprList.Add(Expression());
            //         Console.WriteLine("Revisa then");
            //         var thenNodetwo = new Then() {
            //             AnchorToken = Expect(TokenCategory.THEN)
            //         };
            //         while (firstOfStatement.Contains(CurrentToken)) {
            //             stmtList.Add(Statement());
            //         }
            //     }
            // }
            // if(CurrentToken == TokenCategory.ELSE) {
            //     Expect(TokenCategory.ELSE);
            //     while (firstOfStatement.Contains(CurrentToken)) {
            //         stmtList.Add(Statement());

            //     }
            // }
            // Expect(TokenCategory.END);
            // Expect(TokenCategory.ENDLINE);
            // var result = new If() { exprList, stmtList };
            // result.AnchorToken = ifToken;
            // return result;
        }