Last active
October 27, 2021 01:18
-
-
Save lemmy/1fba1b1f7466c89df5965a0621e738d7 to your computer and use it in GitHub Desktop.
Created from Lamport's TLA+ grammar at http://lamport.azurewebsites.net/tla/TLAPlus2Grammar.tla
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --------------------------- MODULE TLAPlus2Grammar --------------------------- | |
| EXTENDS Naturals, Sequences, BNFGrammars | |
| CommaList(L) == L & (tok(",") & L)^* | |
| AtLeast4(s) == Tok({s \o s \o s} & {s}^+) | |
| ReservedWord == | |
| { "ASSUME", "ELSE", "LOCAL", "UNION", | |
| "ASSUMPTION", "ENABLED", "MODULE", "VARIABLE", | |
| "AXIOM", "EXCEPT", "OTHER", "VARIABLES", | |
| "CASE", "EXTENDS", "SF_", "WF_", | |
| "CHOOSE", "IF", "SUBSET", "WITH", | |
| "CONSTANT", "IN", "THEN", | |
| "CONSTANTS" , "INSTANCE", "THEOREM", "COROLLARY", | |
| "DOMAIN", "LET", "UNCHANGED", | |
| "BY", "HAVE", "QED", "TAKE", | |
| "DEF", "HIDE", "RECURSIVE", "USE", | |
| "DEFINE", "PROOF", "WITNESS", "PICK", | |
| "DEFS", "PROVE", "SUFFICES", "NEW", | |
| "LAMBDA", "STATE", "ACTION", "TEMPORAL", | |
| "OBVIOUS", "OMITTED", "LEMMA", "PROPOSITION", | |
| "ONLY"} | |
| Letter == OneOf("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") | |
| Numeral == OneOf("0123456789") | |
| NameChar == Letter \cup Numeral \cup {"_"} | |
| Name == Tok((NameChar^* & Letter & NameChar^*) | |
| \ ({"WF_","SF_"} & NameChar^+)) | |
| Identifier == Name \ Tok(ReservedWord) | |
| IdentifierOrTuple == | |
| Identifier | tok("<<") & CommaList(Identifier) & tok(">>") | |
| NumberLexeme == | |
| Numeral^+ | |
| | (Numeral^* & {"."} & Numeral^+) | |
| | {"\\b","\\B" } & OneOf("01")^+ | |
| | {"\\o", "\\O"} & OneOf("01234567")^+ | |
| | {"\\h", "\\H"} & OneOf("0123456789abcdefABCDEF")^+ | |
| Number == Tok(NumberLexeme) | |
| ProofStepId == Tok({"<"} & (Numeral^+ | {"*"}) & {">"} & (Letter | Numeral | {"_"})^+) | |
| BeginStepToken == Tok({"<"} & (Numeral^+ | {"*", "+"}) & {">"} & | |
| (Letter | Numeral)^* & {"."}^* ) | |
| String == Tok({"\""} & STRING & {"\""}) | |
| PrefixOp == | |
| Tok({ "-", "~", "\\lnot", "\\neg", "[]", "<>", | |
| "DOMAIN", "ENABLED", "SUBSET", "UNCHANGED", "UNION"}) | |
| InfixOp == | |
| Tok({ "!!", "#", "##", "$", "$$", "%", "%%", | |
| "&", "&&", "(+)", "(-)", "(.)", "(/)", "(\\X)", | |
| "*", "**", "+", "++", "-", "-+->", "--", | |
| "-|", "..", "...", "/", "//", "/=", "/\\", | |
| "::=", ":=", ":>", "<", "<:", "<=>", "=", | |
| "=<", "=>", "=|", ">", ">=", "??", | |
| "@@", "\\", "\\/", "^", "^^", "|", "|-", | |
| "|=", "||", "~>", ".", "<=", | |
| "\\approx", "\\geq", "\\oslash", "\\sqsupseteq", | |
| "\\asymp", "\\gg", "\\otimes", "\\star", | |
| "\\bigcirc", "\\in", "\\prec", "\\subset", | |
| "\\bullet", "\\intersect", "\\preceq", "\\subseteq", | |
| "\\cap", "\\land", "\\propto", "\\succ", | |
| "\\cdot", "\\leq", "\\sim", "\\succeq", | |
| "\\circ", "\\ll", "\\simeq", "\\supset", | |
| "\\cong", "\\lor", "\\sqcap", "\\supseteq", | |
| "\\cup", "\\o", "\\sqcup", "\\union", | |
| "\\div", "\\odot", "\\sqsubset", "\\uplus", | |
| "\\doteq", "\\ominus", "\\sqsubseteq", "\\wr", | |
| "\\equiv", "\\oplus", "\\sqsupset", "\\notin" }) | |
| PostfixOp == Tok({ "^+", "^*", "^#", "'" }) | |
| TLAPlusGrammar == | |
| LET P(G) == | |
| /\ G.Module ::= AtLeast4("-") | |
| & tok("MODULE") & Name & AtLeast4("-") | |
| & (Nil | (tok("EXTENDS") & CommaList(Name))) | |
| & (G.Unit)^* | |
| & AtLeast4("=") | |
| /\ G.Unit ::= | |
| G.VariableDeclaration | |
| | G.ConstantDeclaration | |
| | G.Recursive | |
| | G.UseOrHide | |
| | (Nil | tok("LOCAL")) & G.OperatorDefinition | |
| | (Nil | tok("LOCAL")) & G.FunctionDefinition | |
| | (Nil | tok("LOCAL")) & G.Instance | |
| | (Nil | tok("LOCAL")) & G.ModuleDefinition | |
| | G.Assumption | |
| | G.Theorem & (Nil | G.Proof) | |
| | G.Module | |
| | AtLeast4("-") | |
| /\ G.VariableDeclaration ::= | |
| Tok({"VARIABLE", "VARIABLES"}) & CommaList(Identifier) | |
| /\ G.ConstantDeclaration ::= | |
| Tok({"CONSTANT", "CONSTANTS"}) & CommaList(G.OpDecl) | |
| /\ G.Recursive ::= tok("RECURSIVE") & CommaList(G.OpDecl) | |
| /\ G.OpDecl ::= Identifier | |
| | Identifier & tok("(") & | |
| CommaList(tok("_")) & tok(")") | |
| | PrefixOp & tok("_") | |
| | tok("_") & InfixOp & tok("_") | |
| | tok("_") & PostfixOp | |
| /\ G.OperatorDefinition ::= | |
| ( G.NonFixLHS | |
| | PrefixOp & Identifier | |
| | Identifier & InfixOp & Identifier | |
| | Identifier & PostfixOp ) | |
| & tok("==") | |
| & G.Expression | |
| /\ G.NonFixLHS ::= | |
| Identifier | |
| & ( Nil | |
| | tok("(") | |
| & CommaList(Identifier | G.OpDecl) | |
| & tok(")") ) | |
| /\ G.FunctionDefinition ::= | |
| Identifier | |
| & tok("[") & CommaList(G.QuantifierBound) & tok("]") | |
| & tok("==") | |
| & G.Expression | |
| /\ G.QuantifierBound ::= | |
| (IdentifierOrTuple | CommaList(Identifier)) | |
| & tok("\\in") | |
| & G.Expression | |
| /\ G.Instance ::= | |
| tok("INSTANCE") | |
| & Name | |
| & (Nil | tok("WITH") & CommaList(G.Substitution)) | |
| /\ G.Substitution ::= | |
| (Identifier | PrefixOp | InfixOp | PostfixOp ) | |
| & tok("<-") | |
| & G.Argument | |
| /\ G.Argument ::= G.Expression | G.Opname | G.Lambda | |
| /\ G.Lambda ::= tok("LAMBDA") & CommaList(Identifier) | |
| & tok(":") & G.Expression | |
| /\ G.OpName ::= | |
| (Identifier | PrefixOp | InfixOp | PostfixOp | ProofStepId) | |
| & ( tok("!") | |
| & (Identifier | PrefixOp | InfixOp | PostfixOp | |
| | Tok({"<<", ">>", "@"} \cup Numeral^+) ) | |
| )^* | |
| /\ G.OpArgs ::= tok("(") & CommaList(G.Argument) & tok(")") | |
| /\ G.InstOrSubexprPrefix ::= | |
| ( (Nil | ProofStepId & tok("!")) | |
| & ( ( Identifier & (Nil | G.OpArgs) | |
| | Tok({"<<", ">>", ":"} \cup Numeral^+) | |
| | G.OpArgs | |
| | (PrefixOp | PostfixOp) & tok("(") & G.Expression & tok(")") | |
| | InfixOp & tok("(") & G.Expression & tok(",") | |
| & G.Expression & tok(")") | |
| ) | |
| & tok("!") | |
| ) ^* | |
| ) \ Nil | |
| \* /\ G.InstancePrefix ::= ... | |
| /\ G.GeneralIdentifier ::= | |
| (G.InstOrSubexprPrefix | Nil) & Identifier | |
| | ProofStepId | |
| \* /\ G.GeneralIdentifier ::= ... | |
| \* /\ G.GeneralPrefixOp ::= ... | |
| \* /\ G.GeneralInfixOp ::= ... | |
| \* /\ G.GeneralPostfixOp ::= ... | |
| /\ G.ModuleDefinition ::= G.NonFixLHS | |
| & tok("==") | |
| & G.Instance | |
| /\ G.Assumption ::= | |
| Tok({"ASSUME", "ASSUMPTION", "AXIOM"}) | |
| & (Nil | Name & tok("==")) & G.Expression | |
| /\ G.Theorem ::= | |
| Tok({"THEOREM", "PROPOSITION", "LEMMA", "COROLLARY"}) | |
| & (Nil | Name & tok("==")) & (G.Expression | G.AssumeProve) | |
| /\ G.AssumeProve ::= tok("ASSUME") | |
| & CommaList(G.Expression | G.New | G.InnerAssumeProve) | |
| & tok("PROVE") | |
| & G.Expression | |
| /\ G.InnerAssumeProve ::= (Nil | Name & tok("::")) & G.AssumeProve | |
| /\ G.New ::= (( (Nil | tok("NEW")) | |
| & (Nil | tok("CONSTANT") | tok("VARIABLE") | tok("STATE") | |
| | tok("ACTION") | tok("TEMPORAL") ) | |
| ) \ Nil) | |
| & ((Identifier & tok("\\in") & G.Expression) | G.OpDecl) | |
| /\ G.Proof ::= G.TerminalProof | |
| | G.NonTerminalProof | |
| /\ G.TerminalProof ::= (tok("PROOF") | Nil) | |
| & ( tok("BY") & (tok("ONLY") | Nil) & G.UseBody | |
| | tok("OBVIOUS") | |
| | tok("OMITTED") | |
| ) | |
| /\ G.NonTerminalProof ::= | |
| (Nil | tok("PROOF")) | |
| & G.Step^* | |
| & G.QEDStep | |
| /\ G.Step ::= | |
| BeginStepToken | |
| & ( ( G.UseOrHide | |
| | ( (Nil | tok("DEFINE")) | |
| & ( G.OperatorDefinition | |
| | G.FunctionDefinition | |
| | G.ModuleDefinition )^+ | |
| ) | |
| | G.Instance | |
| | tok("HAVE") & G.Expression | |
| | tok("WITNESS") & CommaList(G.Expression) | |
| | tok("TAKE") & ( CommaList(G.QuantifierBound) | |
| | CommaList(Identifier) ) | |
| ) | |
| | ( ( ( (Nil | tok("SUFFICES")) | |
| & (G.Expression | G.AssumeProve) | |
| ) | |
| | (tok("CASE") & G.Expression) | |
| | ( tok("PICK") | |
| & ( CommaList(G.QuantifierBound) | CommaList(Identifier) ) | |
| & tok(":") | |
| & G.Expression | |
| ) | |
| ) | |
| & (Nil | G.Proof) | |
| ) | |
| ) | |
| /\ G.QEDStep ::= | |
| BeginStepToken & tok("QED") & (Nil | G.Proof) | |
| /\ G.UseOrHide ::= ( (tok("USE") & (Nil | tok("ONLY"))) | |
| | tok("HIDE") ) | |
| & G.UseBody | |
| /\ G.UseBody ::= ( (Nil | CommaList(G.Expression | tok("MODULE") & Name )) | |
| & (Nil | Tok({"DEF", "DEFS"}) | |
| & CommaList(G.OpName | | |
| tok("MODULE") & Name )) | |
| ) \ Nil | |
| /\ G.Expression ::= | |
| \* G.GeneralIdentifier | |
| Name & (Nil | tok("(") & CommaList(Identifier) & tok(")")) | |
| & tok("::") & G.Expression | |
| | G.InstOrSubexprPrefix | |
| & (Tok({"<<", ">>", ":"} \cup Numeral^+) | G.OpArgs) | |
| | G.GeneralIdentifier & (Nil | G.OpArgs) | |
| | PrefixOp & G.Expression | |
| | G.Expression & InfixOp & G.Expression | |
| | G.Expression & PostfixOp | |
| | tok("(") & G.Expression & tok(")") | |
| | Tok({"\\A", "\\E"}) | |
| & CommaList(G.QuantifierBound) | |
| & tok(":") | |
| & G.Expression | |
| | Tok({"\\A", "\\E", "\\AA", "\\EE"}) | |
| & CommaList(Identifier) | |
| & tok(":") | |
| & G.Expression | |
| | tok("CHOOSE") | |
| & IdentifierOrTuple | |
| & (Nil | tok("\\in") & G.Expression) | |
| & tok(":") | |
| & G.Expression | |
| | tok("{") | |
| & (Nil | CommaList(G.Expression)) | |
| & tok("}") | |
| | tok("{") | |
| & IdentifierOrTuple & tok("\\in") & G.Expression | |
| & tok(":") | |
| & G.Expression | |
| & tok("}") | |
| | tok("{") | |
| & G.Expression | |
| & tok(":") | |
| & CommaList(G.QuantifierBound) | |
| & tok("}") | |
| | G.Expression & tok("[") & CommaList(G.Expression) | |
| & tok("]") | |
| | tok("[") | |
| & CommaList(G.QuantifierBound) | |
| & tok("|->") | |
| & G.Expression | |
| & tok("]") | |
| | tok("[") & G.Expression & tok("->") | |
| & G.Expression & tok("]") | |
| | tok("[") | |
| & CommaList(Name & tok("|->") & G.Expression) | |
| & tok("]") | |
| | tok("[") | |
| & CommaList(Name & tok(":") & G.Expression) | |
| & tok("]") | |
| | tok("[") | |
| & G.Expression | |
| & tok("EXCEPT") | |
| & CommaList( tok("!") | |
| & ( tok(".") & Name | |
| | tok("[") & CommaList(G.Expression) & tok("]") )^+ | |
| & tok("=") & G.Expression ) | |
| & tok("]") | |
| | G.Expression & tok(".") & Name | |
| | tok("<<") & (CommaList(G.Expression) | Nil) & tok(">>") | |
| | G.Expression & (Tok({"\\X", "\\times"}) | |
| & G.Expression)^+ | |
| | tok("[") & G.Expression & tok("]_") | |
| & G.Expression | |
| | tok("<<") & G.Expression & tok(">>_") & G.Expression | |
| | Tok({"WF_", "SF_"}) | |
| & G.Expression | |
| & tok("(") & G.Expression & tok(")") | |
| | tok("IF") & G.Expression | |
| & tok("THEN") & G.Expression | |
| & tok("ELSE") & G.Expression | |
| | tok("CASE") | |
| & ( LET CaseArm == | |
| G.Expression & tok("->") & G.Expression | |
| IN CaseArm & (tok("[]") & CaseArm)^* ) | |
| & ( Nil | |
| | (tok("[]") & tok("OTHER") & tok("->") & G.Expression)) | |
| | tok("LET") | |
| & ( G.OperatorDefinition | |
| | G.FunctionDefinition | |
| | G.ModuleDefinition)^+ | |
| & tok("IN") | |
| & G.Expression | |
| | (tok("/\\") & G.Expression)^+ | |
| | (tok("\\/") & G.Expression)^+ | |
| | Number | |
| | String | |
| | tok("@") | |
| IN LeastGrammar(P) | |
| ============================================================================= |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment