summaryrefslogtreecommitdiff
path: root/Source/Dafny/Dafny.atg
diff options
context:
space:
mode:
authorGravatar Jason Koenig <unknown>2012-07-09 13:44:35 -0700
committerGravatar Jason Koenig <unknown>2012-07-09 13:44:35 -0700
commit88e8eb7376303394afc55e2d3ffb6b662ba27cd5 (patch)
tree5bc9ef9115d8f52f3eb5dd6b078224fc7c806a7a /Source/Dafny/Dafny.atg
parent68226762bab879cb8ba5b0fc456359682565a4b9 (diff)
Dafny: added named expressions and replacement
Diffstat (limited to 'Source/Dafny/Dafny.atg')
-rw-r--r--Source/Dafny/Dafny.atg44
1 files changed, 39 insertions, 5 deletions
diff --git a/Source/Dafny/Dafny.atg b/Source/Dafny/Dafny.atg
index 8f9a7717..958726fd 100644
--- a/Source/Dafny/Dafny.atg
+++ b/Source/Dafny/Dafny.atg
@@ -730,10 +730,23 @@ OneStmt<out Statement/*!*/ s>
SYNC
";" (. s = label != null ? new BreakStmt(x, label) : new BreakStmt(x, breakCount); .)
| ReturnStmt<out s>
- | "..." (. s = new SkeletonStatement(t); .)
+ | SkeletonStmt<out s>
";"
)
.
+
+SkeletonStmt<out Statement s>
+= (. List<IToken> names = null;
+ List<Expression> exprs = null;
+ IToken tok, dotdotdot;
+ Expression e; .)
+ "..." (. dotdotdot = t; .)
+ ["where" (. names = new List<IToken>(); exprs = new List<Expression>(); .)
+ Ident<out tok> "=" Expression<out e> (. names.Add(tok); exprs.Add(e); .)
+ {"," Ident<out tok> "=" Expression<out e> } (. names.Add(tok); exprs.Add(e); .)
+ ]
+ (. s = new SkeletonStatement(dotdotdot, names, exprs); .)
+ .
ReturnStmt<out Statement/*!*/ s>
= (.
IToken returnTok = null;
@@ -1443,8 +1456,6 @@ EndlessExpression<out Expression e>
= (. IToken/*!*/ x;
Expression e0, e1;
e = dummyExpr;
- BoundVar d;
- List<BoundVar> letVars; List<Expression> letRHSs;
.)
( "if" (. x = t; .)
Expression<out e>
@@ -1459,7 +1470,18 @@ EndlessExpression<out Expression e>
| "assume" (. x = t; .)
Expression<out e0> ";"
Expression<out e1> (. e = new AssumeExpr(x, e0, e1); .)
- | "var" (. x = t;
+ | LetExpr<out e>
+ | NamedExpr<out e>
+ )
+ .
+
+LetExpr<out Expression e>
+= (. IToken/*!*/ x;
+ e = dummyExpr;
+ BoundVar d;
+ List<BoundVar> letVars; List<Expression> letRHSs;
+ .)
+ "var" (. x = t;
letVars = new List<BoundVar>();
letRHSs = new List<Expression>(); .)
IdentTypeOptional<out d> (. letVars.Add(d); .)
@@ -1471,8 +1493,20 @@ EndlessExpression<out Expression e>
}
";"
Expression<out e> (. e = new LetExpr(x, letVars, letRHSs, e); .)
- )
.
+
+NamedExpr<out Expression e>
+= (. IToken/*!*/ x, d;
+ e = dummyExpr;
+ Expression expr;
+ .)
+ "expr" (. x = t; .)
+ NoUSIdent<out d>
+ ":"
+ Expression<out e> (. expr = e;
+ e = new NamedExpr(x, d, expr); .)
+ .
+
MatchExpression<out Expression/*!*/ e>
= (. Contract.Ensures(Contract.ValueAtReturn(out e) != null); IToken/*!*/ x; MatchCaseExpr/*!*/ c;
List<MatchCaseExpr/*!*/> cases = new List<MatchCaseExpr/*!*/>();