#(* # Copyright (C) 2023 - 2024: # The Trinitrix Project # SPDX-License-Identifier: LGPL-3.0-or-later # # This file is part of the Trixy crate for Trinitrix. # # Trixy is free software: you can redistribute it and/or modify # it under the terms of the Lesser GNU General Public License as # published by the Free Software Foundation, either version 3 of # the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # and the Lesser GNU General Public License along with this program. # If not, see . #*) # (* # Trixy is fully whitespace independent, this means that you can # interleave whitespace in the definitions. # The same applies to comments: # - Line comments (`// \n`) and # - Block comments (`/* */`). # *) CommandSpec = {Function | Namespace | Enumeration | Structure } ; Function = {DocComment} {Attribute} "fn" Identifier "(" [NamedType {"," NamedType }] ")" [ "->" Type ] ";" ; Namespace = {DocComment} {Attribute} "mod" Identifier "{" {Function | Namespace | Enumeration | Structure} "}" ; Structure = {DocComment} {Attribute} "struct" Identifier "{" [DocNamedType {"," DocNamedType } [","]] "}"; Enumeration = {DocComment} {Attribute} "enum" Identifier "{" [DocIdentifier {"," DocIdentifier} [","]] "}"; Type = Identifier ["<" Type {"," Type} ">"] | "fn" "(" [NamedType {"," NamedType }] ")" [ "->" Type ]; StringLiteral = ["r"] "\"" {ANYTHING} "\"" | "r" "#" {"#"} "\"" {ANYTHING} "#" {"#"} "\""; Identifier = (CHARACTER | "_") { NUMBER | CHARACTER | "_" } ; DocIdentifier = {DocComment} {Attribute} (CHARACTER | "_") { NUMBER | CHARACTER | "_" } ; NamedType = Identifier ":" Type; DocNamedType = {DocComment} {Attribute} Identifier ":" Type; # (* This is syntax sugar for a `DocAttribute` *) DocComment = "///" {ANYTHING} LineEnding; Attribute = "#" "[" AttributeValue "]" LineEnding; AttributeValue = DeriveAttribute | DocAttribute | ErrorAttribute | MsgAttribute; ErrorAttribute = "error"; MsgAttribute = "msg" "(" StringLiteral ")"; DeriveAttribute = "derive" "(" "Error" ")"; DocAttribute = "doc" "=" StringLiteral; Comment = "//" [ NOT ("/" {ANYTHING} LineEnding) | "//"] {ANYTHING} LineEnding; LineEnding = "\\n" | "\\r" | "\\r\\n"; # (* # vim: ft=ebnf # *)