Пример #1
0
        private Rule parseUpdateRule(string pname, string rule, Declarations decls)
        {
            int len   = 1;
            int equal = rule.IndexOf(":=");

            if (equal < 0)
            {
                equal = rule.IndexOf('=');
            }
            else
            {
                len = 2;
            }
            if (equal < 0)
            {
                throw new ParseException(String.Format("Invalid update rule '{0}'!", rule));
            }

            string varname = rule.Substring(0, equal).Trim();
            string upexpr  = rule.Substring(equal + len).Trim();

            VarDecl vd = decls.getVar(varname);

            if (vd == null)
            {
                throw new ParseException(String.Format("Unknown variable {0}!", varname));
            }

            string       expr     = String.Format("int _UPDATE_{0} = {1};", varname, upexpr);
            Declarations newdecls = parseDeclarations(expr, decls);
            Expression   e        = newdecls.getFirstDecl().Expr;

            e.fold(newdecls);
            return(new UpdateRule(varname, e));
        }
Пример #2
0
        private Rule parseSyncRule(string pname, string rule, Declarations decls)
        {
            SyncRule.Direction dir;

            if (rule.EndsWith("?"))
            {
                dir = SyncRule.Direction.Receive;
            }
            else
            if (rule.EndsWith("!"))
            {
                dir = SyncRule.Direction.Send;
            }
            else
            {
                throw new ParseException(String.Format("Synchronization rule '{0}' must end with '!' or '?'!"));
            }

            rule = rule.TrimEnd(new char[] { '?', '!' });
            string       expr     = String.Format("chan _CHANNEL_ = {0};", rule);
            Declarations newdecls = parseDeclarations(expr, decls);
            Expression   e        = newdecls.getVar("_CHANNEL_").Expr;

            e.fold(newdecls);
            return(new SyncRule(e, dir));
        }
Пример #3
0
        private Rule parseGuardRule(string pname, string rule, Declarations decls)
        {
            string       expr     = String.Format("bool _GUARD_ = {0};", rule);
            Declarations newdecls = parseDeclarations(expr, decls);
            Expression   e        = newdecls.getVar("_GUARD_").Expr;

            e.fold(newdecls);
            return(new GuardRule(e));
        }
Пример #4
0
        public bool getExprValue(Expression expr, out int val)
        {
            val = 0;

            expr.fold(this);
            if (expr.Type != Expression.ExpType.Const)
            {
                return(false);
            }
            val = expr.Value;
            return(true);
        }
Пример #5
0
        static bool getFoldedValue(Expression e, Declarations symtab, out int val)
        {
            val = 0;
            if (e == null)
            {
                return(false);
            }

            e.fold(symtab);

            if (e.Type != ExpType.Const)
            {
                return(false);
            }

            val = e.Value;
            return(true);
        }
Пример #6
0
        static bool getFoldedBoolValue(Expression e, Declarations symtab, out bool val)
        {
            val = false;
            if (e == null)
            {
                return(false);
            }

            e.fold(symtab);

            if (e.Type != ExpType.ConstBool)
            {
                return(false);
            }

            val = e.Value != 0;
            return(true);
        }