protected virtual StateDescriptionDelegate EvalCompExpr(ParseTree tree) { bool complement = false; for (int i = 0; i < nodes.Count; i++) { ParseNode node = nodes[i]; if (node.Token.Type == TokenType.COMPLEMENT) { complement = true; } else if (node.Token.Type == TokenType.Atom) { StateDescriptionDelegate value = node.Compile(tree); if (complement) { return(delegate(int effects) { return !value(effects); }); } else { return(value); } } } return(null); }
protected virtual StateDescriptionDelegate EvalDiffExpr(ParseTree tree) { StateDescriptionDelegate a = null; StateDescriptionDelegate b = null; int i = 0; for (; i < nodes.Count; i++) { ParseNode node = nodes[i]; if (node.Token.Type == TokenType.IntExpr) { a = node.Compile(tree); i++; break; } } for (; i < nodes.Count; i++) { ParseNode node = nodes[i]; if (node.Token.Type == TokenType.IntExpr) { b = node.Compile(tree); break; } } if (b != null) { return(delegate(int effects) { return a(effects) && !b(effects); }); } else { return(a); } }
internal StateDescriptionDelegate Compile(ParseTree tree) { StateDescriptionDelegate Value = null; switch (Token.Type) { case TokenType.Start: Value = EvalStart(tree); break; case TokenType.UnionExpr: Value = EvalUnionExpr(tree); break; case TokenType.DiffExpr: Value = EvalDiffExpr(tree); break; case TokenType.IntExpr: Value = EvalIntExpr(tree); break; case TokenType.CompExpr: Value = EvalCompExpr(tree); break; case TokenType.Atom: Value = EvalAtom(tree); break; default: Value = delegate { return(true); }; break; } return(Value); }