For the sake of completeness please find a formal grammar of our architecture DSL in EBNF form. The semantics of the language have been described in the preceding sections.
Body = Declaration* Connection* ;
Declaration = ArtifactDecl | ExtendDecl | ApplyDecl | RequireDecl | IncludeDecl | ExcludeDecl | InterfaceExt | ConnectorExt | InterfaceDecl | ConnectorDecl | Scheme | ClassDecl | TemplateDecl ;
ClassDecl = "class" IDENT "{" ClassMember* "}" ; ClassMember = "interface" List | "connector" List ;
List = IDENT ("," IDENT)* ; ArtifactDecl = StereoTypes "artifact" IDENT (":" IDENT)? "{" Priority? Body "}" ;
ExtendDecl = "extend" IDENT "{" ExtendBody "}" | StereoType+ "extend" IDENT "{" ExtendBody "}" ; Priority = "priority" NUMBER ; ExtendBody = Declaration* DisconnectDecl* Connection* ;
DisconnectDecl = "disconnect" IDENT? "from" IdentList ; StereoTypes = StereoType* ; StereoType = "public" | "hidden" | "local" | "exposed" | "unrestricted" | "relaxed" | "strict" | "optional" | "deprecated" ;
ApplyDecl = "apply" STRING ; RequireDecl = "require" STRING ; IncludeDecl = "strong"? "include" STRING | "include" "all" | "include" "dependency-types" DependencyTypes ;
ExcludeDecl = "exclude" STRING | "exclude" "dependency-types" DependencyTypes ; DependencyTypes = DependencyType ("," DependencyType)* ; DependencyType = IDENT ; InterfaceDecl = ("override"|"optional")? "interface" IDENT "{" InterfaceBody "}" ;
InterfaceExt = "extend" "interface" IDENT "{" InterfaceBody "}" ; InterfaceBody = IDeclaration* ; IDeclaration = IncludeDecl | ExcludeDecl | Export ;
ConnectorDecl = "override"? "connector" IDENT "{" ConnectorBody "}" ; ConnectorExt = "extend" "connector" IDENT "{" ConnectorBody "}" ; ConnectorBody = CDeclaration* ;
CDeclaration = IncludeDecl | ExcludeDecl | Include ; Export = "export" SpecIdentList ;
Include = "include" SpecIdentList ; SpecIdentList = SpecIdent ("," SpecIdent)* ; SpecIdent = "any" ("." IDENT)* | IDENT ("." IDENT)* ;
IdentList = Identifier ("," Identifier)* ; Identifier = IDENT ("." IDENT)* ; Connection = "connect" "to" IdentList "transitively"? | "connect" Identifier "to" IdentList "transitively"? | "connect" "to" IdentList "using" IDENT ;
Scheme = "connection-scheme" IDENT (":" IDENT "to" IDENT)? "{" TargetUse* "}" ; TargetUse = "connect" Identifier "to" TargetIdentList | "connect" "any" "." Identifier "to" TargetIdentList ; TargetIdentList = TargetIdent ("," TargetIdent)* ; TargetIdent = "target" ("." IDENT)+ | "target" "." "any" ("." IDENT)+ ;
IDENT = ("A" .. "Z" | "a" .. "z")("A" .. "Z" | "a" .. "z" | "0" .. "9" | "_" | "-")* ; TemplateDecl = StereoTypes "template" IDENT (":" IDENT)? "{" TemplateBody "}" ; TemplateBody = TemplateInclude+ TemplateExclude* TemplArtifact TemplateConnect* ; TemplateInclude = "include" STRING ; TemplateExclude = "exclude" STRING ; TemplateConnect = "connect" "to" IdentList "transitively"? | "connect" Identifier "to" IdentList "transitively"? | "connect" "to" IdentList "using" IDENT | "connect" "all" "using" IDENT ;
TemplArtifact = StereoTypes "artifact" NameExpr (":" IDENT)? "{" Body "}" ; NameExpr = NameItem | NameItem "+" NameExpr ; NameItem = STRING | "$" ["1"-"9"] | IDENT "(" NameExpr ")" ; // '@' stands for any character except the context specific terminator STRING = '"' (@ | '\\' @)* '"' | "'" (@ | '\\' @)* "'" ;