From e4da5fcd52bbdd0b8345056a3475333d6e27e65f Mon Sep 17 00:00:00 2001 From: qunyanm Date: Fri, 29 Jan 2016 13:01:02 -0800 Subject: Implement module export so we can export a subset of items defined in the module. --- Source/Dafny/Cloner.cs | 5 + Source/Dafny/Dafny.atg | 47 +- Source/Dafny/DafnyAst.cs | 36 ++ Source/Dafny/Parser.cs | 1069 +++++++++++++++++++---------------- Source/Dafny/Resolver.cs | 106 +++- Source/Dafny/Scanner.cs | 175 +++--- Test/dafny0/ModuleExport.dfy | 68 +++ Test/dafny0/ModuleExport.dfy.expect | 9 + 8 files changed, 923 insertions(+), 592 deletions(-) create mode 100644 Test/dafny0/ModuleExport.dfy create mode 100644 Test/dafny0/ModuleExport.dfy.expect diff --git a/Source/Dafny/Cloner.cs b/Source/Dafny/Cloner.cs index 6b3b0caa..8971d2c1 100644 --- a/Source/Dafny/Cloner.cs +++ b/Source/Dafny/Cloner.cs @@ -126,6 +126,11 @@ namespace Microsoft.Dafny abs.Signature = a.Signature; abs.OriginalSignature = a.OriginalSignature; return abs; + } else if (d is ModuleExportDecl) { + var a = (ModuleExportDecl)d; + var export = new ModuleExportDecl(a.tok, m, a.IsDefault, a.Exports, a.Extends); + export.Signature = a.Signature; + return export; } else { Contract.Assert(false); // unexpected declaration return null; // to please compiler diff --git a/Source/Dafny/Dafny.atg b/Source/Dafny/Dafny.atg index eb0c3303..e3696c5b 100644 --- a/Source/Dafny/Dafny.atg +++ b/Source/Dafny/Dafny.atg @@ -502,6 +502,13 @@ bool IsType(ref IToken pt) { } } + +bool IsDefaultImport() { + scanner.ResetPeek(); + Token x = scanner.Peek(); // lookahead token again + return la.val == "default" && x.val != "export"; +} + /*--------------------------------------------------------------------------*/ CHARACTERS letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz". @@ -708,7 +715,7 @@ SubModuleDecl (. isExclusively = false; .) ] (. module = new ModuleDefinition(id, id.val, isAbstract, false, isExclusively, idRefined == null ? null : idRefined, parent, attrs, false, this); .) "{" (. module.BodyStartTok = t; .) - { TopDecl } + { TopDecl} "}" (. module.BodyEndTok = t; module.TopLevelDecls.Add(new DefaultClassDecl(module, namedModuleDefaultClassMembers)); submodule = new LiteralModuleDecl(module, parent); .) @@ -718,8 +725,16 @@ SubModuleDecl ["default" QualifiedModuleName ] + | "as" QualifiedModuleName [IF(IsDefaultImport()) "default" QualifiedModuleName ] + (. submodule = new ModuleFacadeDecl(idPath, id, parent, idAssignment, opened); + //errors.Warning(t, "\"import A as B\" has been deprecated; in the new syntax, it is \"import A:B\""); + .) + | ":" QualifiedModuleName (. submodule = new ModuleFacadeDecl(idPath, id, parent, idAssignment, opened); .) + | "." QualifiedModuleName + (. idPath.Insert(0, id); + submodule = new AliasModuleDecl(idPath, id, parent, opened); + .) ] [ SYNC ";" // This semi-colon used to be required, but it seems silly to have it. @@ -733,6 +748,33 @@ SubModuleDecl exports = new List();; + List extends = new List(); + .) + ["default" (. isDefault = true; .) ] + "export" + NoUSIdent + ["extends" + NoUSIdent(. extends.Add(id.val); .) + {"," NoUSIdent (. extends.Add(id.val); .) } + ] + "{" + NoUSIdent (. includeBody = false; .) + ['+' (. includeBody = true; .)] + (. exports.Add(new ExportSignature(id, includeBody)); .) + { "," + NoUSIdent (. includeBody = false; .) + ['+' (. includeBody = true; .)] + (. exports.Add(new ExportSignature(id, includeBody)); .) + } + "}" + (. + submodule = new ModuleExportDecl(exportId, parent, isDefault, exports, extends); + .) ) . @@ -744,6 +786,7 @@ QualifiedModuleName<.out List ids.> } . + ClassDecl = (. Contract.Requires(module != null); Contract.Ensures(Contract.ValueAtReturn(out c) != null); diff --git a/Source/Dafny/DafnyAst.cs b/Source/Dafny/DafnyAst.cs index a51e30de..33186a76 100644 --- a/Source/Dafny/DafnyAst.cs +++ b/Source/Dafny/DafnyAst.cs @@ -1662,6 +1662,8 @@ namespace Microsoft.Dafny { public class LiteralModuleDecl : ModuleDecl { public readonly ModuleDefinition ModuleDef; + public ModuleSignature DefaultExport; // the default export of the module. fill in by the resolver. + public LiteralModuleDecl(ModuleDefinition module, ModuleDefinition parent) : base(module.tok, module.Name, parent, false) { ModuleDef = module; @@ -1680,6 +1682,7 @@ namespace Microsoft.Dafny { } public override object Dereference() { return Signature.ModuleDef; } } + // Represents "module name as path [ = compilePath];", where name is a identifier and path is a possibly qualified name. public class ModuleFacadeDecl : ModuleDecl { @@ -1698,6 +1701,39 @@ namespace Microsoft.Dafny { public override object Dereference() { return this; } } + // Represents the exports of a module. + public class ModuleExportDecl : ModuleDecl + { + public bool IsDefault; + public List Exports; // list of TopLevelDecl that are included in the export + public List Extends; // list of exports that are extended + public readonly List ExtendDecls = new List(); // fill in by the resolver + + public ModuleExportDecl(IToken tok, ModuleDefinition parent, bool isDefault, + List exports, List extends) + : base(tok, tok.val, parent, false) { + IsDefault = isDefault; + Exports = exports; + Extends = extends; + } + + public override object Dereference() { return this; } + } + + public class ExportSignature + { + public bool IncludeBody; + public IToken Id; + public string Name; + public Declaration Decl; // fill in by the resolver + + public ExportSignature(IToken id, bool includeBody) { + Id = id; + Name = id.val; + IncludeBody = includeBody; + } + } + public class ModuleSignature { private ModuleDefinition exclusiveRefinement = null; public readonly Dictionary TopLevels = new Dictionary(); diff --git a/Source/Dafny/Parser.cs b/Source/Dafny/Parser.cs index 943e2cf6..c7955dc8 100644 --- a/Source/Dafny/Parser.cs +++ b/Source/Dafny/Parser.cs @@ -73,7 +73,7 @@ public class Parser { public const int _star = 57; public const int _notIn = 58; public const int _ellipsis = 59; - public const int maxT = 139; + public const int maxT = 140; const bool _T = true; const bool _x = false; @@ -574,6 +574,13 @@ bool IsType(ref IToken pt) { } } + +bool IsDefaultImport() { + scanner.ResetPeek(); + Token x = scanner.Peek(); // lookahead token again + return la.val == "default" && x.val != "export"; +} + /*--------------------------------------------------------------------------*/ @@ -697,47 +704,47 @@ bool IsType(ref IToken pt) { DeclModifier(ref dmod); } switch (la.kind) { - case 66: case 69: { + case 66: case 69: case 73: case 74: { SubModuleDecl(dmod, module, out submodule); module.TopLevelDecls.Add(submodule); break; } - case 74: { + case 77: { ClassDecl(dmod, module, out c); module.TopLevelDecls.Add(c); break; } - case 77: case 78: { + case 79: case 80: { DatatypeDecl(dmod, module, out dt); module.TopLevelDecls.Add(dt); break; } - case 80: { + case 82: { NewtypeDecl(dmod, module, out td); module.TopLevelDecls.Add(td); break; } - case 81: { + case 83: { OtherTypeDecl(dmod, module, out td); module.TopLevelDecls.Add(td); break; } - case 82: { + case 84: { IteratorDecl(dmod, module, out iter); module.TopLevelDecls.Add(iter); break; } - case 76: { + case 78: { TraitDecl(dmod, module, out trait); module.TopLevelDecls.Add(trait); break; } - case 38: case 39: case 40: case 41: case 42: case 79: case 85: case 86: case 87: case 88: { + case 38: case 39: case 40: case 41: case 42: case 81: case 87: case 88: case 89: case 90: { ClassMemberDecl(dmod, membersDefaultClass, false, !DafnyOptions.O.AllowGlobals, !isTopLevel && DafnyOptions.O.IronDafny && isAbstract); break; } - default: SynErr(140); break; + default: SynErr(141); break; } } @@ -764,7 +771,7 @@ bool IsType(ref IToken pt) { dmod.ExternName = new StringLiteralExpr(t, s, isVerbatimString); } - } else SynErr(141); + } else SynErr(142); } void SubModuleDecl(DeclModifierData dmod, ModuleDefinition parent, out ModuleDecl submodule) { @@ -815,23 +822,35 @@ bool IsType(ref IToken pt) { } NoUSIdent(out id); EncodeExternAsAttribute(dmod, ref attrs, id, /* needAxiom */ false); - if (la.kind == 71 || la.kind == 72) { + if (StartOf(3)) { if (la.kind == 71) { Get(); QualifiedModuleName(out idPath); submodule = new AliasModuleDecl(idPath, id, parent, opened); - } else { + } else if (la.kind == 72) { Get(); QualifiedModuleName(out idPath); - if (la.kind == 73) { - Get(); + if (IsDefaultImport()) { + Expect(73); QualifiedModuleName(out idAssignment); } submodule = new ModuleFacadeDecl(idPath, id, parent, idAssignment, opened); + //errors.Warning(t, "\"import A as B\" has been deprecated; in the new syntax, it is \"import A:B\""); + + } else if (la.kind == 21) { + Get(); + QualifiedModuleName(out idPath); + submodule = new ModuleFacadeDecl(idPath, id, parent, idAssignment, opened); + } else { + Get(); + QualifiedModuleName(out idPath); + idPath.Insert(0, id); + submodule = new AliasModuleDecl(idPath, id, parent, opened); + } } if (la.kind == 28) { - while (!(la.kind == 0 || la.kind == 28)) {SynErr(142); Get();} + while (!(la.kind == 0 || la.kind == 28)) {SynErr(143); Get();} Get(); errors.Warning(t, "the semi-colon that used to terminate a sub-module declaration has been deprecated; in the new syntax, just leave off the semi-colon"); } @@ -841,7 +860,51 @@ bool IsType(ref IToken pt) { submodule = new AliasModuleDecl(idPath, id, parent, opened); } - } else SynErr(143); + } else if (la.kind == 73 || la.kind == 74) { + bool isDefault = false; + bool includeBody; + IToken exportId; + List exports = new List();; + List extends = new List(); + + if (la.kind == 73) { + Get(); + isDefault = true; + } + Expect(74); + NoUSIdent(out exportId); + if (la.kind == 75) { + Get(); + NoUSIdent(out id); + extends.Add(id.val); + while (la.kind == 22) { + Get(); + NoUSIdent(out id); + extends.Add(id.val); + } + } + Expect(46); + NoUSIdent(out id); + includeBody = false; + if (la.kind == 76) { + Get(); + includeBody = true; + } + exports.Add(new ExportSignature(id, includeBody)); + while (la.kind == 22) { + Get(); + NoUSIdent(out id); + includeBody = false; + if (la.kind == 76) { + Get(); + includeBody = true; + } + exports.Add(new ExportSignature(id, includeBody)); + } + Expect(47); + submodule = new ModuleExportDecl(exportId, parent, isDefault, exports, extends); + + } else SynErr(144); } void ClassDecl(DeclModifierData dmodClass, ModuleDefinition/*!*/ module, out ClassDecl/*!*/ c) { @@ -857,8 +920,8 @@ bool IsType(ref IToken pt) { CheckDeclModifiers(dmodClass, "Classes", AllowedDeclModifiers.Extern); DeclModifierData dmod; - while (!(la.kind == 0 || la.kind == 74)) {SynErr(144); Get();} - Expect(74); + while (!(la.kind == 0 || la.kind == 77)) {SynErr(145); Get();} + Expect(77); while (la.kind == 46) { Attribute(ref attrs); } @@ -879,7 +942,7 @@ bool IsType(ref IToken pt) { } Expect(46); bodyStart = t; - while (StartOf(3)) { + while (StartOf(4)) { dmod = new DeclModifierData(); while (StartOf(2)) { DeclModifier(ref dmod); @@ -904,13 +967,13 @@ bool IsType(ref IToken pt) { bool co = false; CheckDeclModifiers(dmod, "Datatypes or codatatypes", AllowedDeclModifiers.None); - while (!(la.kind == 0 || la.kind == 77 || la.kind == 78)) {SynErr(145); Get();} - if (la.kind == 77) { + while (!(la.kind == 0 || la.kind == 79 || la.kind == 80)) {SynErr(146); Get();} + if (la.kind == 79) { Get(); - } else if (la.kind == 78) { + } else if (la.kind == 80) { Get(); co = true; - } else SynErr(146); + } else SynErr(147); while (la.kind == 46) { Attribute(ref attrs); } @@ -926,7 +989,7 @@ bool IsType(ref IToken pt) { DatatypeMemberDecl(ctors); } if (la.kind == 28) { - while (!(la.kind == 0 || la.kind == 28)) {SynErr(147); Get();} + while (!(la.kind == 0 || la.kind == 28)) {SynErr(148); Get();} Get(); errors.Warning(t, "the semi-colon that used to terminate a (co)datatype declaration has been deprecated; in the new syntax, just leave off the semi-colon"); } @@ -948,7 +1011,7 @@ bool IsType(ref IToken pt) { Expression wh; CheckDeclModifiers(dmod, "Newtypes", AllowedDeclModifiers.None); - Expect(80); + Expect(82); while (la.kind == 46) { Attribute(ref attrs); } @@ -964,10 +1027,10 @@ bool IsType(ref IToken pt) { Expect(23); Expression(out wh, false, true); td = new NewtypeDecl(theVerifyThisFile ? id : new IncludeToken(id), id.val, module, new BoundVar(bvId, bvId.val, baseType), wh, attrs); - } else if (StartOf(4)) { + } else if (StartOf(5)) { Type(out baseType); td = new NewtypeDecl(theVerifyThisFile ? id : new IncludeToken(id), id.val, module, baseType, attrs); - } else SynErr(148); + } else SynErr(149); } void OtherTypeDecl(DeclModifierData dmod, ModuleDefinition module, out TopLevelDecl td) { @@ -979,7 +1042,7 @@ bool IsType(ref IToken pt) { Type ty; CheckDeclModifiers(dmod, "Type aliases", AllowedDeclModifiers.None); - Expect(81); + Expect(83); while (la.kind == 46) { Attribute(ref attrs); } @@ -992,7 +1055,7 @@ bool IsType(ref IToken pt) { if (la.kind == 52) { GenericParameters(typeArgs); } - } else if (StartOf(5)) { + } else if (StartOf(6)) { if (la.kind == 52) { GenericParameters(typeArgs); } @@ -1001,13 +1064,13 @@ bool IsType(ref IToken pt) { Type(out ty); td = new TypeSynonymDecl(id, id.val, typeArgs, module, ty, attrs); } - } else SynErr(149); + } else SynErr(150); if (td == null) { td = new OpaqueTypeDecl(id, id.val, module, eqSupport, typeArgs, attrs); } if (la.kind == 28) { - while (!(la.kind == 0 || la.kind == 28)) {SynErr(150); Get();} + while (!(la.kind == 0 || la.kind == 28)) {SynErr(151); Get();} Get(); errors.Warning(t, "the semi-colon that used to terminate an opaque-type declaration has been deprecated; in the new syntax, just leave off the semi-colon"); } @@ -1037,8 +1100,8 @@ bool IsType(ref IToken pt) { IToken bodyEnd = Token.NoToken; CheckDeclModifiers(dmod, "Iterators", AllowedDeclModifiers.None); - while (!(la.kind == 0 || la.kind == 82)) {SynErr(151); Get();} - Expect(82); + while (!(la.kind == 0 || la.kind == 84)) {SynErr(152); Get();} + Expect(84); while (la.kind == 46) { Attribute(ref attrs); } @@ -1048,8 +1111,8 @@ bool IsType(ref IToken pt) { GenericParameters(typeArgs); } Formals(true, true, ins); - if (la.kind == 83 || la.kind == 84) { - if (la.kind == 83) { + if (la.kind == 85 || la.kind == 86) { + if (la.kind == 85) { Get(); } else { Get(); @@ -1060,8 +1123,8 @@ bool IsType(ref IToken pt) { } else if (la.kind == 59) { Get(); signatureEllipsis = t; - } else SynErr(152); - while (StartOf(6)) { + } else SynErr(153); + while (StartOf(7)) { IteratorSpec(reads, mod, decreases, req, ens, yieldReq, yieldEns, ref readsAttrs, ref modAttrs, ref decrAttrs); } if (la.kind == 46) { @@ -1080,8 +1143,8 @@ bool IsType(ref IToken pt) { void TraitDecl(DeclModifierData dmodIn, ModuleDefinition/*!*/ module, out TraitDecl/*!*/ trait) { Contract.Requires(module != null); - CheckDeclModifiers(dmodIn, "Traits", AllowedDeclModifiers.None); Contract.Ensures(Contract.ValueAtReturn(out trait) != null); + CheckDeclModifiers(dmodIn, "Traits", AllowedDeclModifiers.None); IToken/*!*/ id; Attributes attrs = null; List typeArgs = new List(); //traits should not support type parameters at the moment @@ -1089,8 +1152,8 @@ bool IsType(ref IToken pt) { IToken bodyStart; DeclModifierData dmod; - while (!(la.kind == 0 || la.kind == 76)) {SynErr(153); Get();} - Expect(76); + while (!(la.kind == 0 || la.kind == 78)) {SynErr(154); Get();} + Expect(78); while (la.kind == 46) { Attribute(ref attrs); } @@ -1100,7 +1163,7 @@ bool IsType(ref IToken pt) { } Expect(46); bodyStart = t; - while (StartOf(3)) { + while (StartOf(4)) { dmod = new DeclModifierData(); while (StartOf(2)) { DeclModifier(ref dmod); @@ -1119,7 +1182,7 @@ bool IsType(ref IToken pt) { Method/*!*/ m; Function/*!*/ f; - if (la.kind == 79) { + if (la.kind == 81) { if (moduleLevelDecl) { SemErr(la, "fields are not allowed to be declared at the module level; instead, wrap the field in a 'class' declaration"); dmod.IsStatic = false; @@ -1134,7 +1197,7 @@ bool IsType(ref IToken pt) { FunctionDecl(dmod, isWithinAbstractModule, out f); mm.Add(f); - } else if (StartOf(7)) { + } else if (StartOf(8)) { if (moduleLevelDecl && dmod.StaticToken != null) { errors.Warning(dmod.StaticToken, "module-level methods are always non-instance, so the 'static' keyword is not allowed here"); dmod.IsStatic = false; @@ -1142,7 +1205,7 @@ bool IsType(ref IToken pt) { MethodDecl(dmod, allowConstructors, isWithinAbstractModule, out m); mm.Add(m); - } else SynErr(154); + } else SynErr(155); } void Attribute(ref Attributes attrs) { @@ -1153,7 +1216,7 @@ bool IsType(ref IToken pt) { Expect(21); NoUSIdent(out x); name = x.val; - if (StartOf(8)) { + if (StartOf(9)) { Expressions(args); } Expect(47); @@ -1228,8 +1291,8 @@ bool IsType(ref IToken pt) { IToken/*!*/ id; Type/*!*/ ty; CheckDeclModifiers(dmod, "Fields", AllowedDeclModifiers.Ghost); - while (!(la.kind == 0 || la.kind == 79)) {SynErr(155); Get();} - Expect(79); + while (!(la.kind == 0 || la.kind == 81)) {SynErr(156); Get();} + Expect(81); while (la.kind == 46) { Attribute(ref attrs); } @@ -1264,7 +1327,7 @@ bool IsType(ref IToken pt) { if (la.kind == 38) { Get(); - if (la.kind == 85) { + if (la.kind == 87) { Get(); isFunctionMethod = true; } @@ -1290,11 +1353,11 @@ bool IsType(ref IToken pt) { } else if (la.kind == 59) { Get(); signatureEllipsis = t; - } else SynErr(156); + } else SynErr(157); } else if (la.kind == 39) { Get(); isPredicate = true; - if (la.kind == 85) { + if (la.kind == 87) { Get(); isFunctionMethod = true; } @@ -1310,7 +1373,7 @@ bool IsType(ref IToken pt) { Attribute(ref attrs); } NoUSIdent(out id); - if (StartOf(9)) { + if (StartOf(10)) { if (la.kind == 52) { GenericParameters(typeArgs); } @@ -1327,7 +1390,7 @@ bool IsType(ref IToken pt) { } else if (la.kind == 59) { Get(); signatureEllipsis = t; - } else SynErr(157); + } else SynErr(158); } else if (la.kind == 40) { Get(); Expect(39); @@ -1351,7 +1414,7 @@ bool IsType(ref IToken pt) { } else if (la.kind == 59) { Get(); signatureEllipsis = t; - } else SynErr(158); + } else SynErr(159); } else if (la.kind == 42) { Get(); isCoPredicate = true; @@ -1374,10 +1437,10 @@ bool IsType(ref IToken pt) { } else if (la.kind == 59) { Get(); signatureEllipsis = t; - } else SynErr(159); - } else SynErr(160); + } else SynErr(160); + } else SynErr(161); decreases = isIndPredicate || isCoPredicate ? null : new List(); - while (StartOf(10)) { + while (StartOf(11)) { FunctionSpec(reqs, reads, ens, decreases); } if (la.kind == 46) { @@ -1437,9 +1500,9 @@ bool IsType(ref IToken pt) { AllowedDeclModifiers allowed = AllowedDeclModifiers.None; string caption = ""; - while (!(StartOf(11))) {SynErr(161); Get();} + while (!(StartOf(12))) {SynErr(162); Get();} switch (la.kind) { - case 85: { + case 87: { Get(); caption = "Methods"; allowed = AllowedDeclModifiers.Ghost | AllowedDeclModifiers.Static @@ -1453,14 +1516,14 @@ bool IsType(ref IToken pt) { | AllowedDeclModifiers.Protected; break; } - case 86: { + case 88: { Get(); isCoLemma = true; caption = "Colemmas"; allowed = AllowedDeclModifiers.AlreadyGhost | AllowedDeclModifiers.Static | AllowedDeclModifiers.Protected; break; } - case 87: { + case 89: { Get(); isCoLemma = true; caption = "Comethods"; allowed = AllowedDeclModifiers.AlreadyGhost | AllowedDeclModifiers.Static @@ -1476,7 +1539,7 @@ bool IsType(ref IToken pt) { allowed = AllowedDeclModifiers.AlreadyGhost | AllowedDeclModifiers.Static; break; } - case 88: { + case 90: { Get(); if (allowConstructor) { isConstructor = true; @@ -1488,7 +1551,7 @@ bool IsType(ref IToken pt) { break; } - default: SynErr(162); break; + default: SynErr(163); break; } keywordToken = t; CheckDeclModifiers(dmod, caption, allowed); @@ -1512,7 +1575,7 @@ bool IsType(ref IToken pt) { GenericParameters(typeArgs); } Formals(true, !dmod.IsGhost, ins); - if (la.kind == 84) { + if (la.kind == 86) { Get(); if (isConstructor) { SemErr(t, "constructors cannot have out-parameters"); } Formals(false, !dmod.IsGhost, outs); @@ -1520,8 +1583,8 @@ bool IsType(ref IToken pt) { } else if (la.kind == 59) { Get(); signatureEllipsis = t; - } else SynErr(163); - while (StartOf(12)) { + } else SynErr(164); + while (StartOf(13)) { MethodSpec(req, mod, ens, dec, ref decAttrs, ref modAttrs); } if (la.kind == 46) { @@ -1572,7 +1635,7 @@ bool IsType(ref IToken pt) { void FormalsOptionalIds(List/*!*/ formals) { Contract.Requires(cce.NonNullElements(formals)); IToken/*!*/ id; Type/*!*/ ty; string/*!*/ name; bool isGhost; Expect(50); - if (StartOf(13)) { + if (StartOf(14)) { TypeIdentOptional(out id, out name, out ty, out isGhost); formals.Add(new Formal(id, name, ty, true, isGhost)); while (la.kind == 22) { @@ -1593,14 +1656,14 @@ bool IsType(ref IToken pt) { } else if (la.kind == 2) { Get(); id = t; - } else SynErr(164); + } else SynErr(165); Expect(21); Type(out ty); } void OldSemi() { if (la.kind == 28) { - while (!(la.kind == 0 || la.kind == 28)) {SynErr(165); Get();} + while (!(la.kind == 0 || la.kind == 28)) {SynErr(166); Get();} Get(); } } @@ -1679,7 +1742,7 @@ bool IsType(ref IToken pt) { Get(); isGhost = true; } - if (StartOf(4)) { + if (StartOf(5)) { TypeAndToken(out id, out ty); if (la.kind == 21) { Get(); @@ -1697,7 +1760,7 @@ bool IsType(ref IToken pt) { id = t; name = id.val; Expect(21); Type(out ty); - } else SynErr(166); + } else SynErr(167); if (name != null) { identName = name; } else { @@ -1848,7 +1911,7 @@ bool IsType(ref IToken pt) { case 50: { Get(); tok = t; tupleArgTypes = new List(); - if (StartOf(4)) { + if (StartOf(5)) { Type(out ty); tupleArgTypes.Add(ty); while (la.kind == 22) { @@ -1885,7 +1948,7 @@ bool IsType(ref IToken pt) { ty = new UserDefinedType(e.tok, e); break; } - default: SynErr(167); break; + default: SynErr(168); break; } if (la.kind == 30) { Type t2; @@ -1924,7 +1987,7 @@ List/*!*/ yieldReq, List/*!* ref Attributes readsAttrs, ref Attributes modAttrs, ref Attributes decrAttrs) { Expression/*!*/ e; FrameExpression/*!*/ fe; bool isFree = false; bool isYield = false; Attributes ensAttrs = null; - while (!(StartOf(14))) {SynErr(168); Get();} + while (!(StartOf(15))) {SynErr(169); Get();} if (la.kind == 44) { Get(); while (IsAttribute()) { @@ -1951,14 +2014,14 @@ ref Attributes readsAttrs, ref Attributes modAttrs, ref Attributes decrAttrs) { mod.Add(fe); } OldSemi(); - } else if (StartOf(15)) { - if (la.kind == 89) { + } else if (StartOf(16)) { + if (la.kind == 91) { Get(); isFree = true; errors.Warning(t, "the 'free' keyword is soon to be deprecated"); } - if (la.kind == 91) { + if (la.kind == 93) { Get(); isYield = true; } @@ -1972,7 +2035,7 @@ ref Attributes readsAttrs, ref Attributes modAttrs, ref Attributes decrAttrs) { req.Add(new MaybeFreeExpression(e, isFree)); } - } else if (la.kind == 90) { + } else if (la.kind == 92) { Get(); while (IsAttribute()) { Attribute(ref ensAttrs); @@ -1985,7 +2048,7 @@ ref Attributes readsAttrs, ref Attributes modAttrs, ref Attributes decrAttrs) { ens.Add(new MaybeFreeExpression(e, isFree, ensAttrs)); } - } else SynErr(169); + } else SynErr(170); } else if (la.kind == 36) { Get(); while (IsAttribute()) { @@ -1993,7 +2056,7 @@ ref Attributes readsAttrs, ref Attributes modAttrs, ref Attributes decrAttrs) { } DecreasesList(decreases, false, false); OldSemi(); - } else SynErr(170); + } else SynErr(171); } void BlockStmt(out BlockStmt/*!*/ block, out IToken bodyStart, out IToken bodyEnd) { @@ -2002,7 +2065,7 @@ ref Attributes readsAttrs, ref Attributes modAttrs, ref Attributes decrAttrs) { Expect(46); bodyStart = t; - while (StartOf(16)) { + while (StartOf(17)) { Stmt(body); } Expect(47); @@ -2015,7 +2078,7 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo Contract.Requires(cce.NonNullElements(req)); Contract.Requires(cce.NonNullElements(mod)); Contract.Requires(cce.NonNullElements(ens)); Contract.Requires(cce.NonNullElements(decreases)); Expression/*!*/ e; FrameExpression/*!*/ fe; bool isFree = false; Attributes ensAttrs = null; - while (!(StartOf(17))) {SynErr(171); Get();} + while (!(StartOf(18))) {SynErr(172); Get();} if (la.kind == 43) { Get(); while (IsAttribute()) { @@ -2029,8 +2092,8 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo mod.Add(fe); } OldSemi(); - } else if (la.kind == 45 || la.kind == 89 || la.kind == 90) { - if (la.kind == 89) { + } else if (la.kind == 45 || la.kind == 91 || la.kind == 92) { + if (la.kind == 91) { Get(); isFree = true; errors.Warning(t, "the 'free' keyword is soon to be deprecated"); @@ -2041,7 +2104,7 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo Expression(out e, false, false); OldSemi(); req.Add(new MaybeFreeExpression(e, isFree)); - } else if (la.kind == 90) { + } else if (la.kind == 92) { Get(); while (IsAttribute()) { Attribute(ref ensAttrs); @@ -2049,7 +2112,7 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo Expression(out e, false, false); OldSemi(); ens.Add(new MaybeFreeExpression(e, isFree, ensAttrs)); - } else SynErr(172); + } else SynErr(173); } else if (la.kind == 36) { Get(); while (IsAttribute()) { @@ -2057,7 +2120,7 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo } DecreasesList(decreases, true, false); OldSemi(); - } else SynErr(173); + } else SynErr(174); } void FrameExpression(out FrameExpression fe, bool allowSemi, bool allowLambda) { @@ -2067,21 +2130,21 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo string fieldName = null; IToken feTok = null; fe = null; - if (StartOf(8)) { + if (StartOf(9)) { Expression(out e, allowSemi, allowLambda); feTok = e.tok; - if (la.kind == 92) { + if (la.kind == 94) { Get(); Ident(out id); fieldName = id.val; feTok = id; } fe = new FrameExpression(feTok, e, fieldName); - } else if (la.kind == 92) { + } else if (la.kind == 94) { Get(); Ident(out id); fieldName = id.val; fe = new FrameExpression(id, new ImplicitThisExpr(id), fieldName); - } else SynErr(174); + } else SynErr(175); } void DecreasesList(List decreases, bool allowWildcard, bool allowLambda) { @@ -2136,7 +2199,7 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo Contract.Requires(cce.NonNullElements(reads)); Contract.Requires(decreases == null || cce.NonNullElements(decreases)); Expression/*!*/ e; FrameExpression/*!*/ fe; - while (!(StartOf(18))) {SynErr(175); Get();} + while (!(StartOf(19))) {SynErr(176); Get();} if (la.kind == 45) { Get(); Expression(out e, false, false); @@ -2152,7 +2215,7 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo reads.Add(fe); } OldSemi(); - } else if (la.kind == 90) { + } else if (la.kind == 92) { Get(); Expression(out e, false, false); OldSemi(); @@ -2166,7 +2229,7 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo DecreasesList(decreases, false, false); OldSemi(); - } else SynErr(176); + } else SynErr(177); } void FunctionBody(out Expression/*!*/ e, out IToken bodyStart, out IToken bodyEnd) { @@ -2183,9 +2246,9 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo if (la.kind == 57) { Get(); fe = new FrameExpression(t, new WildcardExpr(t), null); - } else if (StartOf(19)) { + } else if (StartOf(20)) { FrameExpression(out fe, allowSemi, false); - } else SynErr(177); + } else SynErr(178); } void PossiblyWildExpression(out Expression e, bool allowLambda) { @@ -2194,9 +2257,9 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo if (la.kind == 57) { Get(); e = new WildcardExpr(t); - } else if (StartOf(8)) { + } else if (StartOf(9)) { Expression(out e, false, allowLambda); - } else SynErr(178); + } else SynErr(179); } void Stmt(List/*!*/ ss) { @@ -2213,14 +2276,14 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo IToken bodyStart, bodyEnd; int breakCount; - while (!(StartOf(20))) {SynErr(179); Get();} + while (!(StartOf(21))) {SynErr(180); Get();} switch (la.kind) { case 46: { BlockStmt(out bs, out bodyStart, out bodyEnd); s = bs; break; } - case 102: { + case 104: { AssertStmt(out s); break; } @@ -2228,31 +2291,31 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo AssumeStmt(out s); break; } - case 103: { + case 105: { PrintStmt(out s); break; } - case 1: case 2: case 3: case 4: case 8: case 10: case 19: case 20: case 23: case 50: case 132: case 133: case 134: case 135: case 136: case 137: { + case 1: case 2: case 3: case 4: case 8: case 10: case 19: case 20: case 23: case 50: case 133: case 134: case 135: case 136: case 137: case 138: { UpdateStmt(out s); break; } - case 62: case 79: { + case 62: case 81: { VarDeclStatement(out s); break; } - case 99: { + case 101: { IfStmt(out s); break; } - case 100: { + case 102: { WhileStmt(out s); break; } - case 101: { + case 103: { MatchStmt(out s); break; } - case 104: case 105: { + case 106: case 107: { ForallStmt(out s); break; } @@ -2260,11 +2323,11 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo CalcStmt(out s); break; } - case 106: { + case 108: { ModifyStmt(out s); break; } - case 93: { + case 95: { Get(); x = t; NoUSIdent(out id); @@ -2273,24 +2336,24 @@ List/*!*/ decreases, ref Attributes decAttrs, ref Attributes mo s.Labels = new LList