64 lines
2.5 KiB
EBNF
64 lines
2.5 KiB
EBNF
#(*
|
|
# Copyright (C) 2023 - 2024:
|
|
# The Trinitrix Project <soispha@vhack.eu, antifallobst@systemausfall.org>
|
|
# 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 <https://www.gnu.org/licenses/>.
|
|
#*)
|
|
|
|
# (*
|
|
# 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} NamedType;
|
|
|
|
|
|
# (* 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
|
|
# *)
|