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)); }
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)); }
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)); }
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); }
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); }
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); }