MLW.ebnf 9.97 KB
Newer Older
1
2
# EBNF-Syntax für MLW-Artikel

di68kap's avatar
di68kap committed
3
4
# TODO: Vervollständigen!!!!

5

di68kap's avatar
di68kap committed
6
@ comment         =  /(?:\/\/.*)|(?:\/\*(?:.|\n)*?\*\/)/   # Kommentare im C++ Stil
di68kap's avatar
di68kap committed
7
                                      # ohne das Zeilenende zu beinhalten
8
9
@ whitespace      =  /[\t ]*/         # Zeilensprünge zählen nicht als Leerraum
@ literalws       =  right            # Leerraum vor und nach Literalen wird automatisch entfernt
10

11
12
13

##############################################################################

14
Artikel           = [LZ]
di68kap's avatar
di68kap committed
15
16
                    §{ LemmaPosition }+
                    [EtymologiePosition]
17
                    [ArtikelKopf]
di68kap's avatar
di68kap committed
18
                    BedeutungsPosition
di68kap's avatar
di68kap committed
19
                    [VerweisPosition]
20
                    { UnterArtikel }
di68kap's avatar
di68kap committed
21
                    ArtikelVerfasser
di68kap's avatar
di68kap committed
22
23
                    [Stellenverzeichnis]
                    [LZ] DATEI_ENDE
24

25

26
27
#### LEMMA-POSITION ##########################################################

di68kap's avatar
di68kap committed
28
29
LemmaPosition     = [ABS] "LEMMA" [LZ] §Lemma TR [LemmaVarianten]
                    GrammatikPosition [Zusatz]
30

di68kap's avatar
di68kap committed
31
Lemma             = [< klassisch | gesichert >] LemmaWort
32
  klassisch       = "*"
di68kap's avatar
di68kap committed
33
  gesichert       = "$"  # TODO: Noch fragen: Welches Zeichen?
34

di68kap's avatar
di68kap committed
35
36
LemmaWort         = LAT_WORT

di68kap's avatar
di68kap committed
37
LemmaVarianten    = LemmaVariante { [";" | ","] [ZW] LemmaVariante } [ ABS Zusatz ]
38

di68kap's avatar
di68kap committed
39
LemmaVariante     = LAT_WORT  # Ist eine Lemma immer ein einzelnes Wort?
40

41

42
## GRAMMATIK-POSITION ##
43

di68kap's avatar
di68kap committed
44
GrammatikPosition = ZWW "GRAMMATIK" [LZ] §Grammatik { ABS GrammatikVariante }
di68kap's avatar
di68kap committed
45

di68kap's avatar
di68kap committed
46
Grammatik        = wortart §ABS flexion [[";"] genus]
47

eckhart's avatar
eckhart committed
48
49
50
51
52
53
wortart          = nomen | verb | adverb | adjektiv | praeposition
nomen            = "nomen"  | "n."
verb             = "verb"   | "v."
adverb           = "adverb" | "adv."
adjektiv         = "adjektiv" | "adj."
praeposition     = "praeposition" | "praep."
54

55
flexion          = deklination | konjugation
di68kap's avatar
di68kap committed
56
deklination      = FLEX ["," FLEX]
57
konjugation      = FLEX
58
FLEX             = /-?[a-z]+/~
59

eckhart's avatar
eckhart committed
60
61
62
63
genus            = maskulinum | femininum | neutrum
maskulinum       = "maskulinum" | "m."
femininum        = "femininum" | "f."
neutrum          = "neutrum" | "n."
64

di68kap's avatar
di68kap committed
65
66

GrammatikVariante  = [wortart ABS] flexion [[";"] genus] DPP Beleg { FORTSETZUNG Beleg }   # Beleg { SEM Beleg }
di68kap's avatar
di68kap committed
67

68

69

di68kap's avatar
di68kap committed
70
#### ETYMOLOGIE-POSITION #####################################################
71

di68kap's avatar
di68kap committed
72
EtymologiePosition = ZWW "ETYMOLOGIE" [LZ] { EtymologieVariante }+
di68kap's avatar
di68kap committed
73
EtymologieVariante = LAT | GRI [EtymologieBesonderheit] ["ETYM" Etymologie] DPP Beleg
di68kap's avatar
di68kap committed
74
75
EtymologieBesonderheit = EINZEILER
Etymologie         = EINZEILER
76
77


78
79
#### ARTIKEL-KOPF ############################################################

di68kap's avatar
di68kap committed
80
81
ArtikelKopf     = <   SchreibweisenPosition
                    | StrukturPosition
di68kap's avatar
di68kap committed
82
                    | GebrauchsPosition
di68kap's avatar
di68kap committed
83
                    | MetrikPosition
di68kap's avatar
di68kap committed
84
                    | VerwechselungsPosition >
di68kap's avatar
di68kap committed
85

di68kap's avatar
di68kap committed
86
87
SchreibweisenPosition = ZWW "SCHREIBWEISE"  Position
StrukturPosition      = ZWW "STRUKTUR"      Position
di68kap's avatar
di68kap committed
88
GebrauchsPosition     = ZWW "GEBRAUCH"      Position
di68kap's avatar
di68kap committed
89
MetrikPosition        = ZWW "METRIK"        Position
di68kap's avatar
di68kap committed
90
VerwechselungsPosition = ZWW "VERWECHSELBAR" Position
di68kap's avatar
di68kap committed
91

di68kap's avatar
di68kap committed
92
## ARTIKELKOPF POSITIONEN ##
di68kap's avatar
di68kap committed
93

di68kap's avatar
di68kap committed
94
95
96
97
98
99
100
Position       = [LZ] §Kategorien
Kategorien     = Kategorie { ZWW Kategorie }
Kategorie      = Besonderheit §DPP [LZ] ( Varianten | Kategorien )
Besonderheit   = EINZEILER
Varianten      = Variante { ZWW Variante }
Variante       = !KATEGORIENZEILE Gegenstand DPP Belege
Gegenstand     = EINZEILER
di68kap's avatar
di68kap committed
101

di68kap's avatar
di68kap committed
102

103
104
#### BEDEUTUNGS-POSITION #####################################################

di68kap's avatar
di68kap committed
105
BedeutungsPosition   = { ZWW "BEDEUTUNG" [LZ] §Bedeutung [U1Bedeutung] }+
di68kap's avatar
di68kap committed
106
107
U1Bedeutung          = { ZWW ("U_BEDEUTUNG" | "UNTER_BEDEUTUNG") [LZ] §Bedeutung [U2Bedeutung] }+
U2Bedeutung          = { ZWW ("UU_BEDEUTUNG" | "UNTER_UNTER_BEDEUTUNG") [LZ] §Bedeutung [U3Bedeutung] }+
108
109
110
U3Bedeutung          = { ZWW "UUU_BEDEUTUNG" [LZ] §Bedeutung [U4Bedeutung] }+
U4Bedeutung          = { ZWW "UUUU_BEDEUTUNG" [LZ] §Bedeutung [U5Bedeutung] }+
U5Bedeutung          = { ZWW "UUUUU_BEDEUTUNG" [LZ] §UntersteBedeutung }+
111

di68kap's avatar
di68kap committed
112
Bedeutung            = (Interpretamente | Bedeutungskategorie) [BelegPosition]
di68kap's avatar
di68kap committed
113
UntersteBedeutung    = Interpretamente [BelegPosition]
114
Bedeutungskategorie  = { EINZEILER [LZ] [Zusatz] [LZ] } §":"
115
116
117
118

Interpretamente      = LateinischeBedeutung (LZ | " " | "--") §DeutscheBedeutung [":"]
LateinischeBedeutung = LAT [ZW] LateinischerAusdruck { "," LateinischerAusdruck }
DeutscheBedeutung    = DEU [ZW] DeutscherAusdruck { "," DeutscherAusdruck }
119
120
121
122
LateinischerAusdruck = { <LateinischesWort [Zusatz]> }+
DeutscherAusdruck    = { <DeutschesWort [Zusatz]> }+
LateinischesWort     = (LAT_WORT | "(" { LAT_WORT }+ ")")
DeutschesWort        = (DEU_WORT | "(" { DEU_WORT }+ ")")
123
124
125
126
127

LAT = "LATEINISCH" | "LAT"
DEU = "DEUTSCH" | "DEU"
GRI = "GRIECHISCH" | "GRIECH" | "GRIE" | "GRI"

128

di68kap's avatar
di68kap committed
129
BelegPosition = ZWW ["BELEGE" [LZ]] Belege
130
131


di68kap's avatar
di68kap committed
132
#### VERWEIS-POSITION ########################################################
133

di68kap's avatar
di68kap committed
134
VerweisPosition = ZWW "VERWEISE"
135
136


di68kap's avatar
di68kap committed
137
#### UNTER-ARTIKEL ###########################################################
138

di68kap's avatar
di68kap committed
139
UnterArtikel = ZWW "UNTER-ARTIKEL"
140
141


142
143
#### AUTOR/AUTORIN ###########################################################

144
ArtikelVerfasser = ZWW ("AUTORIN" | "AUTOR") §Name
eckhart's avatar
eckhart committed
145
146
Name             = { NAME | NAMENS_ABKÜRZUNG | unbekannt }+
unbekannt        = "unbekannt"
147

di68kap's avatar
di68kap committed
148
#### STELLENVERZEICHNIS ######################################################
di68kap's avatar
di68kap committed
149

di68kap's avatar
di68kap committed
150
151
152
153
Stellenverzeichnis = ZWW "STELLENVERZEICHNIS" [LemmaWort] ZWW Verweisliste
Verweisliste       = { [LZ] "*" Stellenverweis }
Stellenverweis     = BelegQuelle { [ABS] Stelle (NullVerweis | Verweis) }
NullVerweis        = "{" "-" "}"
di68kap's avatar
di68kap committed
154

155

di68kap's avatar
di68kap committed
156
157
#### ZUSATZ an verschiedenen Stellen der Struktur ############################

di68kap's avatar
di68kap committed
158
Zusatz       = { "{" !("=>" | "@" | "^") §EinzelnerZusatz { ";;" EinzelnerZusatz } "}" }+  # mehrteilige Zusätze unnötig
di68kap's avatar
di68kap committed
159
  EinzelnerZusatz  = FesterZusatz | GemischterZusatz | FreierZusatz
eckhart's avatar
eckhart committed
160
161
162
163
  FesterZusatz     = adde | saepe | persaepe
    adde     = "adde"
    saepe    = "saepe"
    persaepe = "persaepe"
di68kap's avatar
di68kap committed
164
165
166
  GemischterZusatz = ( GebrauchsHinweis | PlurSingHinweis ) FreierZusatz
  GebrauchsHinweis = "usu"
  PlurSingHinweis  = "plur. sensu sing."
di68kap's avatar
di68kap committed
167
  FreierZusatz     = { FREITEXT | VerweisKern | Verweis }+
di68kap's avatar
di68kap committed
168

169

di68kap's avatar
di68kap committed
170
#### BELEGE ##################################################################
171

172
173
Belege           = ["*"] Beleg { [LZ] (SonderBelege | "*" Beleg) }
SonderBelege     = "**" Beleg { [LZ] "**" Beleg }
di68kap's avatar
di68kap committed
174
Beleg            = [Zusatz] ((Verweis [Zitat]) | Zitat) [ABS Zusatz] ["."]
175
Zitat            = Quellenangabe { SEM [ZW] BelegStelle }
di68kap's avatar
di68kap committed
176
Quellenangabe    = [<Anker | Zusatz>] < BelegQuelle | Verweis >
di68kap's avatar
di68kap committed
177
BelegQuelle      = AutorWerk &SEM
178
BelegStelle      = [<Anker | Zusatz>] (Stelle [[ZW] BelegText] | Verweis) [[ZW] Zusatz]
di68kap's avatar
di68kap committed
179
BelegText        = /"/ { MEHRZEILER | Anker | Zusatz } §/"/~ ["."]
180

di68kap's avatar
di68kap committed
181
AutorWerk = EINZEILER
182
Werk      = EINZEILER
di68kap's avatar
di68kap committed
183
184
185
Stelle    = EINZEILER
Datierung = EINZEILER
Edition   = EINZEILER
di68kap's avatar
di68kap committed
186

187

di68kap's avatar
di68kap committed
188
189
190
#### VERWEISE (LINKS) ########################################################

Verweis          = "{" VerweisKern "}"
di68kap's avatar
di68kap committed
191
VerweisKern      = "=>" §((alias "|" ("-" | URL)) | URL)
di68kap's avatar
di68kap committed
192
Anker            = "{" "@" §ziel "}"
di68kap's avatar
di68kap committed
193
194
# URL              = [ ([protokoll] domäne /\//) | /\// ] { pfad /\// } ziel
URL              = [protokoll] [/\//] { pfad /\// } ziel
di68kap's avatar
di68kap committed
195
196
197

alias            = FREITEXT
protokoll        = /\w+:\/\//
di68kap's avatar
di68kap committed
198
199
200
# domäne           = /\w+\.\w+(?:\.\w+)*/
pfad             = PFAD_NAME # /\w+/
ziel             = PFAD_NAME # /[\w=?.%&\[\] ]+/
di68kap's avatar
di68kap committed
201
202


di68kap's avatar
di68kap committed
203
204
#### GENERISCHE UND ATOMARE AUSDRÜCKE ########################################

di68kap's avatar
di68kap committed
205
206
PFAD_NAME        = /[\w=?.%&\[\] ]+/

207
208
NAMENS_ABKÜRZUNG = /[A-ZÄÖÜÁÀÂÓÒÔÚÙÛ]\./~
NAME             = /[A-ZÄÖÜÁÀÓÒÚÙÂÔÛ][a-zäöüßáàâóòôúùû]+/~
209

di68kap's avatar
di68kap committed
210
DEU_WORT         = DEU_GROSS | DEU_KLEIN | GROSSBUCHSTABE
di68kap's avatar
di68kap committed
211
DEU_GROSS        = /[A-ZÄÖÜ][a-zäöüßę_\-.]+/~
di68kap's avatar
di68kap committed
212
213
GROSSBUCHSTABE   = /[A-ZÄÖÜ](?=[ \t\n])/~
KLEINBUCHSTABE   = /[a-zäöü](?=[ \t\n])/~
di68kap's avatar
di68kap committed
214
GRI_BUCHSTABE    = /[αβγδεζηθικλμνξοπρςστυφχψω]/
di68kap's avatar
di68kap committed
215
216
217
DEU_KLEIN        = /(?!--)[a-zäöüßęõ_\-.]+/~
LAT_WORT         = /(?!--)[a-z|\-_.]+/~
GROSSSCHRIFT     = /(?!--)[A-ZÄÖÜ_\-]+/~
di68kap's avatar
di68kap committed
218
ZAHL             = /[\d]+/~
di68kap's avatar
di68kap committed
219
SEITENZAHL       = /[\d]+(?:\^(?:(?:\{[\d\w.,!? ]+\})|[\d\w.]+))?/~     # Zahl mit optionale folgendem hochgestelltem Buchstaben oder Text
di68kap's avatar
di68kap committed
220
ROEMISCHE_ZAHL   = /(?=[MDCLXVI])M*(C[MD]|D?C*)(X[CL]|L?X*)(I[XV]|V?I*)(?=[^\w])/~
221
SCHLUESSELWORT   = { //~ /\n/ }+ !ROEMISCHE_ZAHL /[A-ZÄÖÜ]{3,}\s+/
di68kap's avatar
di68kap committed
222

di68kap's avatar
di68kap committed
223
224
SATZZEICHEN      = /(?!->)(?:(?:,(?!,))|(?:;(?!;))|(?::(?!:))|(?:-(?!-))|[.()\[\]]+)|[`''‘’?]/~  # div. Satzzeichen, aber keine doppelten ,, ;; oder ::
TEIL_SATZZEICHEN = /(?!->)(?:(?:,(?!,))|(?:-(?!-))|[.()]+)|[`''‘’?]/~ # Satzeichen bis auf Doppelpunkt ":", Semikolon ";" und eckige Klammern
di68kap's avatar
di68kap committed
225

226
227
BUCHSTABENFOLGE  = /\w+/~
ZEICHENFOLGE     = /[\w()-]+/~
di68kap's avatar
di68kap committed
228
TEXTELEMENT      = DEU_WORT | SEITENZAHL | ROEMISCHE_ZAHL
di68kap's avatar
di68kap committed
229
EINZEILER        = { TEXTELEMENT | TEIL_SATZZEICHEN }+
di68kap's avatar
di68kap committed
230
FREITEXT         = { TEXTELEMENT | SATZZEICHEN | GROSSSCHRIFT }+
di68kap's avatar
di68kap committed
231
MEHRZEILER       = { FREITEXT | /\s+(?=[\w,;:.\(\)\-])/ | /\n\s*/ }+
232

di68kap's avatar
di68kap committed
233
TR               = ABS | LZ                  # (beliebiger) Trenner
di68kap's avatar
di68kap committed
234
ABS              = /\s*;;?\s*/ | ZWW         # Abschluss (durch Semikolon oder Zeilenwechsel)
di68kap's avatar
di68kap committed
235
# ZW               = /\n/~                   # Zeilenwechsel
di68kap's avatar
di68kap committed
236
LZ               = { COMMENT__ | /\s+/ }+    # Leerzeichen oder -zeilen
di68kap's avatar
di68kap committed
237
238
DPP              = /::?/~                    # Doppelpunkt als Trenner
SEM              = /;;?/~                    # Semikolon als Trenner
di68kap's avatar
di68kap committed
239

di68kap's avatar
di68kap committed
240
ZW               = !LÜCKE ZEILENSPRUNG       # Zeilenwechsel, aber keine Leerzeile(n)
di68kap's avatar
di68kap committed
241
242
ZWW              = ZEILENSPRUNG [ LZ ]       # mindestens ein Zeilenwechsel
LÜCKE            = KOMMENTARZEILEN LEERZEILE [LZ] # Leerraum mit mindestens einer echten Leerzeile
di68kap's avatar
di68kap committed
243
244
245
246
247
LEERZEILE        = /[ \t]*(?:\n[ \t]*)+\n/ ~/\n?/ # eine oder mehrere echte LEERZEILEN
RZS              = /\s*?\n|$/               # Rückwärtiger Zeilensprung oder Textanfang

ZEILENSPRUNG     = /[ \t]*\n/~
KOMMENTARZEILEN  = { /[ \t]*\n?[ \t]*/ COMMENT__ }  # echte Kommentarzeilen
248
KATEGORIENZEILE  = /[^:\n]+[:][ \t]*\n/     # Kategorienzeilen enthalten genau einen Doppelpunkt am Ende der Zeile
249
FORTSETZUNG      = !(ZWW /[^:\n]+[:]/)
di68kap's avatar
di68kap committed
250

251
252
DATEI_ENDE       = !/./
NIEMALS          = /(?!.)/
di68kap's avatar
di68kap committed
253