// -*- javascript -*- // Syntactic extensions to ES5 for Syndicate/js. See compiler.js for // the rest of the translator. Syndicate <: ES5 { //--------------------------------------------------------------------------- // Extensions to expressions. Statement += ActorStatement | DataspaceStatement | ActorFacetStatement | AssertionTypeDeclarationStatement | SendMessageStatement ActorStatement = actor CallExpression Block -- withConstructor | actor Block -- noConstructor DataspaceStatement = ground dataspace identifier? Block -- ground | dataspace Block -- normal ActorFacetStatement = react FacetBlock until FacetStateTransitionBlock -- state | react until FacetStateTransitionBlock -- until | react FacetBlock -- forever AssertionTypeDeclarationStatement = assertion type identifier "(" FormalParameterList ")" ("=" stringLiteral)? #(sc) SendMessageStatement = "::" Expression #(sc) //--------------------------------------------------------------------------- // Ongoing event handlers. FacetBlock = "{" FacetInitBlock? FacetSituation* FacetDoneBlock? "}" FacetStateTransitionBlock = "{" FacetStateTransition* "}" FacetInitBlock = do Block FacetDoneBlock = finally Block FacetSituation = assert FacetPattern AssertWhenClause? #(sc) -- assert | on FacetEventPattern Block -- event | during FacetPattern FacetBlock -- during AssertWhenClause = when "(" Expression ")" FacetEventPattern = message FacetPattern -- messageEvent | asserted FacetPattern -- assertedEvent | retracted FacetPattern -- retractedEvent FacetTransitionEventPattern = FacetEventPattern -- facetEvent | "(" Expression ")" -- risingEdge FacetStateTransition = case FacetTransitionEventPattern Block -- withContinuation | case FacetTransitionEventPattern #(sc) -- noContinuation FacetPattern = LeftHandSideExpression metalevel decimalIntegerLiteral -- withMetalevel | LeftHandSideExpression -- noMetalevel //--------------------------------------------------------------------------- // Keywords. We don't add them to the "keyword" production because // we don't want to make them unavailable to programs as // identifiers. actor = "actor" ~identifierPart assert = "assert" ~identifierPart asserted = "asserted" ~identifierPart assertion = "assertion" ~identifierPart dataspace = "dataspace" ~identifierPart during = "during" ~identifierPart ground = "ground" ~identifierPart message = "message" ~identifierPart metalevel = "metalevel" ~identifierPart on = "on" ~identifierPart react = "react" ~identifierPart retracted = "retracted" ~identifierPart type = "type" ~identifierPart until = "until" ~identifierPart when = "when" ~identifierPart }