module basic/Modules imports basic/NatCon exports context-free start-symbols Module sorts TermCon sorts Modules context-free syntax "modules" "(" "[" {Module ","}* "]"")" -> Modules {const("modules")} sorts Module context-free syntax %% A module constists of an identifier and optional attributes "module" "(" id:ModuleId "," "[" store:{Attribute ","}* "]"")" -> Module {cons("module")} sorts ModuleId context-free syntax %% An module-id is defined by a unique natcon "mid" "(" id:NatCon ")" -> ModuleId {cons("module-id")} sorts Attribute context-free syntax %% An attribute consists of a namespace and a list of table-entries "attribute" "(" namespace:TermCon "," "[" table:{TableEntry ","}* "]" ")" -> Attribute {cons("attribute")} sorts TableEntry context-free syntax %% table-entry pairs are key-value pairs of TermCons "table-entry" "(" key:TermCon "," value:TermCon ")" -> TableEntry {cons("table-entry")} sorts Dependencies context-free syntax %% List of dependencies "dependencies" "(" "[" {Dependency ","}* "]" ")" -> Dependencies {cons("dependencies")} sorts Dependency context-free syntax %% A module depends on zero or more module-id "dependency" "(" from:ModuleId "," list:{ModuleId ","}*")" -> Dependency {cons("dependency")} sorts AttributeMap context-free syntax "attribute-map" "(" "[" {ModuleAttribute ","}* "]" ")" -> AttributeMap {cons("attribute-map")} sorts ModuleAttribute context-free syntax "module-attribute" "(" id:ModuleId "," attribute:TermCon ")" -> ModuleAttribute {cons("module-attribute")}