Chapter 21. Formal Grammars
21.1. EBNF Grammar of Lojban
Lojban Machine Grammar, EBNF Version, Final Baseline
This EBNF document is explicitly dedicated to the public domain by its author, The Logical Language Group, Inc. Contact that organization at: 2904 Beau Lane, Fairfax VA 22031 USA 703-385-0273 (intl: +1 703 385 0273)
Explanation of notation: All rules have the form:
namenumber = bnf-expression
which means that the grammatical construct “name” is defined by “bnf-expression”. The number cross-references this grammar with the rule numbers in the YACC grammar. The names are the same as those in the YACC grammar, except that subrules are labeled with A, B, C, ... in the YACC grammar and with 1, 2, 3, ... in this grammar. In addition, rule 971 is “simple_tag” in the YACC grammar but “stag” in this grammar, because of its frequent appearance.
- Names in lower case are grammatical constructs.
- Names in UPPER CASE are selma'o (lexeme) names, and are terminals.
- Concatenation is expressed by juxtaposition with no operator symbol.
- | represents alternation (choice).
- [] represents an optional element.
- & represents and/or (“A & B” is the same as “A | B | A B”).
- ... represents optional repetition of the construct to the left. Left-grouping is implied; right-grouping is shown by explicit self-referential recursion with no “...”
- () serves to indicate the grouping of the other operators. Otherwise, “...” binds closer than &, which binds closer than |.
- # is shorthand for “[free ...]”, a construct which appears in many places.
- // encloses an elidable terminator, which may be omitted (without change of meaning) if no grammatical ambiguity results.
-
text0 =
[NAI ...] [CMENE ... # | (indicators & free ...)] [joik-jek] text-1
-
text-12 =
[(I [jek | joik] [[stag] BO] #) ... | NIhO ... #] [paragraphs]
-
paragraphs4 =
paragraph [NIhO ... # paragraphs]
-
paragraph10 =
(statement | fragment) [I # [statement | fragment]] ...
-
statement11 =
statement-1 | prenex statement
-
statement-112 =
statement-2 [I joik-jek [statement-2]] ...
-
statement-213 =
statement-3 [I [jek | joik] [stag] BO # [statement-2]]
-
statement-314 =
sentence | [tag] TUhE # text-1 /TUhU#/
-
fragment20 =
ek # | gihek # | quantifier | NA # | terms /VAU#/ | prenex | relative-clauses | links | linkargs
-
prenex30 =
terms ZOhU #
-
sentence40 =
[terms [CU #]] bridi-tail
-
subsentence41 =
sentence | prenex subsentence
-
bridi-tail50 =
bridi-tail-1 [gihek [stag] KE # bridi-tail /KEhE#/ tail-terms]
-
bridi-tail-151 =
bridi-tail-2 [gihek # bridi-tail-2 tail-terms] ...
-
bridi-tail-252 =
bridi-tail-3 [gihek [stag] BO # bridi-tail-2 tail-terms]
-
bridi-tail-353 =
selbri tail-terms | gek-sentence
-
gek-sentence54 =
gek subsentence gik subsentence tail-terms | [tag] KE # gek-sentence /KEhE#/ | NA # gek-sentence
-
tail-terms71 =
[terms] /VAU#/
-
terms80 =
terms-1 ...
-
terms-181 =
terms-2 [PEhE # joik-jek terms-2] ...
-
terms-282 =
term [CEhE # term] ...
-
term83 =
sumti | (tag | FA #) (sumti | /KU#/) | termset | NA KU #
-
termset85 =
NUhI # gek terms /NUhU#/ gik terms /NUhU#/ | NUhI # terms /NUhU#/
-
sumti90 =
sumti-1 [VUhO # relative-clauses]
-
sumti-191 =
sumti-2 [(ek | joik) [stag] KE # sumti /KEhE#/]
-
sumti-292 =
sumti-3 [joik-ek sumti-3] ...
-
sumti-393 =
sumti-4 [(ek | joik) [stag] BO # sumti-3]
-
sumti-494 =
sumti-5 | gek sumti gik sumti-4
-
sumti-595 =
[quantifier] sumti-6 [relative-clauses] | quantifier selbri /KU#/ [relative-clauses]
-
sumti-697 =
(LAhE # | NAhE BO #) [relative-clauses] sumti /LUhU#/ | KOhA # | lerfu-string /BOI#/ | LA # [relative-clauses] CMENE ... # | (LA | LE) # sumti-tail /KU#/ | LI # mex /LOhO#/ | ZO any-word # | LU text /LIhU#/ | LOhU any-word ... LEhU # | ZOI any-word anything any-word #
-
sumti-tail111 =
[sumti-6 [relative-clauses]] sumti-tail-1 | relative-clauses sumti-tail-1
-
sumti-tail-1112 =
[quantifier] selbri [relative-clauses] | quantifier sumti
-
relative-clauses121 =
relative-clause [ZIhE # relative-clause] ...
-
relative-clause122 =
GOI # term /GEhU#/ | NOI # subsentence /KUhO#/
-
selbri130 =
[tag] selbri-1
-
selbri-1131 =
selbri-2 | NA # selbri
-
selbri-2132 =
selbri-3 [CO # selbri-2]
-
selbri-3133 =
selbri-4 ...
-
selbri-4134 =
selbri-5 [joik-jek selbri-5 | joik [stag] KE # selbri-3 /KEhE#/] ...
-
selbri-5135 =
selbri-6 [(jek | joik) [stag] BO # selbri-5]
-
selbri-6136 =
tanru-unit [BO # selbri-6] | [NAhE #] guhek selbri gik selbri-6
-
tanru-unit150 =
tanru-unit-1 [CEI # tanru-unit-1] ...
-
tanru-unit-1151 =
tanru-unit-2 [linkargs]
-
tanru-unit-2152 =
BRIVLA # | GOhA [RAhO] # | KE # selbri-3 /KEhE#/ | ME # sumti /MEhU#/ [MOI #] | (number | lerfu-string) MOI # | NUhA # mex-operator | SE # tanru-unit-2 | JAI # [tag] tanru-unit-2 | any-word (ZEI any-word) ... | NAhE # tanru-unit-2 | NU [NAI] # [joik-jek NU [NAI] #] ... subsentence /KEI#/
-
linkargs160 =
BE # term [links] /BEhO#/
-
links161 =
BEI # term [links]
-
quantifier300 =
number /BOI#/ | VEI # mex /VEhO#/
-
mex310 =
mex-1 [operator mex-1] ... | FUhA # rp-expression
-
mex-1311 =
mex-2 [BIhE # operator mex-1]
-
mex-2312 =
operand | [PEhO #] operator mex-2 ... /KUhE#/
-
rp-expression330 =
rp-operand rp-operand operator
-
rp-operand332 =
operand | rp-expression
-
operator370 =
operator-1 [joik-jek operator-1 | joik [stag] KE # operator /KEhE#/] ...
-
operator-1371 =
operator-2 | guhek operator-1 gik operator-2 | operator-2 (jek | joik) [stag] BO # operator-1
-
operator-2372 =
mex-operator | KE # operator /KEhE#/
-
mex-operator374 =
SE # mex-operator | NAhE # mex-operator | MAhO # mex /TEhU#/ | NAhU # selbri /TEhU#/ | VUhU #
-
operand381 =
operand-1 [(ek | joik) [stag] KE # operand /KEhE#/]
-
operand-1382 =
operand-2 [joik-ek operand-2] ...
-
operand-2383 =
operand-3 [(ek | joik) [stag] BO # operand-2]
-
operand-3385 =
quantifier | lerfu-string /BOI#/ | NIhE # selbri /TEhU#/ | MOhE # sumti /TEhU#/ | JOhI # mex-2 ... /TEhU#/ | gek operand gik operand-3 | (LAhE # | NAhE BO #) operand /LUhU#/
-
number812 =
PA [PA | lerfu-word] ...
-
lerfu-string817 =
lerfu-word [PA | lerfu-word] ...
-
lerfu-word987 =
BY | any-word BU | LAU lerfu-word | TEI lerfu-string FOI
-
ek802 =
[NA] [SE] A [NAI]
-
gihek818 =
[NA] [SE] GIhA [NAI]
-
jek805 =
[NA] [SE] JA [NAI]
-
joik806 =
[SE] JOI [NAI] | interval | GAhO interval GAhO
-
interval932 =
[SE] BIhI [NAI]
-
joik-ek421 =
joik # | ek #
-
joik-jek422 =
joik # | jek #
-
gek807 =
[SE] GA [NAI] # | joik GI # | stag gik
-
guhek808 =
[SE] GUhA [NAI] #
-
gik816 =
GI [NAI] #
-
tag491 =
tense-modal [joik-jek tense-modal] ...
-
stag971 =
simple-tense-modal [(jek | joik) simple-tense-modal] ...
-
tense-modal815 =
simple-tense-modal # | FIhO # selbri /FEhU#/
-
simple-tense-modal972 =
[NAhE] [SE] BAI [NAI] [KI] | [NAhE] (time [space] | space [time]) & CAhA [KI] | KI | CUhE
-
time1030 =
ZI & time-offset ... & ZEhA [PU [NAI]] & interval-property ...
-
time-offset1033 =
PU [NAI] [ZI]
-
space1040 =
VA & space-offset ... & space-interval & (MOhI space-offset)
-
space-offset1045 =
FAhA [NAI] [VA]
-
space-interval1046 =
((VEhA & VIhA) [FAhA [NAI]]) & space-int-props
-
space-int-props1049 =
(FEhE interval-property) ...
-
interval-property1051 =
number ROI [NAI] | TAhE [NAI] | ZAhO [NAI]
-
free32 =
SEI # [terms [CU #]] selbri /SEhU/ | SOI # sumti [sumti] /SEhU/ | vocative [relative-clauses] selbri [relative-clauses] /DOhU/ | vocative [relative-clauses] CMENE ... # [relative-clauses] /DOhU/ | vocative [sumti] /DOhU/ | (number | lerfu-string) MAI | TO text /TOI/ | XI # (number | lerfu-string) /BOI/ | XI # VEI # mex /VEhO/
-
vocative415 =
(COI [NAI]) ... & DOI
-
indicators411 =
[FUhE] indicator ...
-
indicator413 =
(UI | CAI) [NAI] | Y | DAhO | FUhO
The following rules are non-formal:
-
word1100 =
[BAhE] any-word [indicators]
-
any-word =
“any single word (no compound cmavo)”
-
anything =
“any text at all, whether Lojban or not”
-
null1101 =
any-word SI | utterance SA | text SU
FAhO is a universal terminator and signals the end of parsable input.
21.2. EBNF Cross-Reference
-
A
-
BAI
-
BAhE
BNF rule #11001100
-
BE
-
BEI
-
BEhO
-
BIhE
-
BIhI
-
BO
BNF rule #5252, BNF rule #383383, BNF rule #385385, BNF rule #371371, BNF rule #135135, BNF rule #136136, BNF rule #1313, BNF rule #9393, BNF rule #9797, BNF rule #22
-
BOI
BNF rule #3232, BNF rule #385385, BNF rule #300300, BNF rule #9797
-
BRIVLA
-
BU
-
BY
-
CAI
-
CAhA
-
CEI
-
CEhE
-
CMENE
BNF rule #3232, BNF rule #9797, BNF rule #00
-
CO
-
COI
-
CU
BNF rule #3232, BNF rule #4040
-
CUhE
-
DAhO
-
DOI
-
DOhU
-
FA
-
FAhA
BNF rule #10461046, BNF rule #10451045
-
FEhE
BNF rule #10491049
-
FEhU
-
FIhO
-
FOI
-
FUhA
-
FUhE
-
FUhO
-
GA
-
GAhO
-
GEhU
-
GI
BNF rule #807807, BNF rule #816816
-
GIhA
-
GOI
-
GOhA
-
GUhA
-
I
BNF rule #1010, BNF rule #1212, BNF rule #1313, BNF rule #22
-
JA
-
JAI
-
JOI
-
JOhI
-
KE
BNF rule #5050, BNF rule #5454, BNF rule #381381, BNF rule #372372, BNF rule #370370, BNF rule #134134, BNF rule #9191, BNF rule #152152
-
KEI
-
KEhE
BNF rule #5050, BNF rule #5454, BNF rule #381381, BNF rule #372372, BNF rule #370370, BNF rule #134134, BNF rule #9191, BNF rule #152152
-
KI
-
KOhA
-
KU
BNF rule #9595, BNF rule #9797, BNF rule #8383
-
KUhE
-
KUhO
-
LA
-
LAU
-
LAhE
BNF rule #385385, BNF rule #9797
-
LE
-
LEhU
-
LI
-
LIhU
-
LOhO
-
LOhU
-
LU
-
LUhU
BNF rule #385385, BNF rule #9797
-
MAI
-
MAhO
-
ME
-
MEhU
-
MOI
-
MOhE
-
MOhI
BNF rule #10401040
-
NA
BNF rule #802802, BNF rule #2020, BNF rule #5454, BNF rule #818818, BNF rule #805805, BNF rule #131131, BNF rule #8383
-
NAI
BNF rule #802802, BNF rule #807807, BNF rule #818818, BNF rule #816816, BNF rule #808808, BNF rule #413413, BNF rule #10511051, BNF rule #932932, BNF rule #805805, BNF rule #806806, BNF rule #972972, BNF rule #10461046, BNF rule #10451045, BNF rule #152152, BNF rule #00, BNF rule #10331033, BNF rule #10301030, BNF rule #415415
-
NAhE
BNF rule #374374, BNF rule #385385, BNF rule #136136, BNF rule #972972, BNF rule #9797, BNF rule #152152
-
NAhU
-
NIhE
-
NIhO
-
NOI
-
NU
-
NUhA
-
NUhI
-
NUhU
-
PA
BNF rule #817817, BNF rule #812812
-
PEhE
-
PEhO
-
PU
BNF rule #10331033, BNF rule #10301030
-
RAhO
-
ROI
BNF rule #10511051
-
SA
BNF rule #11011101
-
SE
BNF rule #802802, BNF rule #807807, BNF rule #818818, BNF rule #808808, BNF rule #932932, BNF rule #805805, BNF rule #806806, BNF rule #374374, BNF rule #972972, BNF rule #152152
-
SEI
-
SEhU
-
SI
BNF rule #11011101
-
SOI
-
SU
BNF rule #11011101
-
TAhE
BNF rule #10511051
-
TEI
-
TEhU
BNF rule #374374, BNF rule #385385
-
TO
-
TOI
-
TUhE
-
TUhU
-
UI
-
VA
BNF rule #10451045, BNF rule #10401040
-
VAU
BNF rule #2020, BNF rule #7171
-
VEI
BNF rule #3232, BNF rule #300300
-
VEhA
BNF rule #10461046
-
VEhO
BNF rule #3232, BNF rule #300300
-
VIhA
BNF rule #10461046
-
VUhO
-
VUhU
-
XI
-
Y
-
ZAhO
BNF rule #10511051
-
ZEI
-
ZEhA
BNF rule #10301030
-
ZI
BNF rule #10331033, BNF rule #10301030
-
ZIhE
-
ZO
-
ZOI
-
ZOhU
-
any-word
BNF rule #987987, BNF rule #11011101, BNF rule #9797, BNF rule #152152, BNF rule #11001100
-
anything
-
bridi-tail
BNF rule #5050, BNF rule #4040
-
bridi-tail-1
-
bridi-tail-2
BNF rule #5151, BNF rule #5252
-
bridi-tail-3
-
ek
BNF rule #2020, BNF rule #421421, BNF rule #383383, BNF rule #381381, BNF rule #9191, BNF rule #9393
-
fragment
-
free
-
gek
BNF rule #5454, BNF rule #385385, BNF rule #9494, BNF rule #8585
-
gek-sentence
BNF rule #5353, BNF rule #5454
-
gihek
BNF rule #5151, BNF rule #5252, BNF rule #5050, BNF rule #2020
-
gik
BNF rule #5454, BNF rule #807807, BNF rule #385385, BNF rule #371371, BNF rule #136136, BNF rule #9494, BNF rule #8585
-
guhek
BNF rule #371371, BNF rule #136136
-
indicator
-
indicators
BNF rule #00, BNF rule #11001100
-
interval
-
interval-property
BNF rule #10491049, BNF rule #10301030
-
jek
BNF rule #422422, BNF rule #371371, BNF rule #135135, BNF rule #971971, BNF rule #1313, BNF rule #22
-
joik
BNF rule #807807, BNF rule #421421, BNF rule #422422, BNF rule #383383, BNF rule #381381, BNF rule #371371, BNF rule #370370, BNF rule #134134, BNF rule #135135, BNF rule #971971, BNF rule #1313, BNF rule #9191, BNF rule #9393, BNF rule #22
-
joik-ek
BNF rule #382382, BNF rule #9292
-
joik-jek
BNF rule #370370, BNF rule #134134, BNF rule #1212, BNF rule #491491, BNF rule #152152, BNF rule #8181, BNF rule #00
-
lerfu-string
BNF rule #3232, BNF rule #987987, BNF rule #385385, BNF rule #9797, BNF rule #152152
-
lerfu-word
BNF rule #817817, BNF rule #987987, BNF rule #812812
-
linkargs
BNF rule #2020, BNF rule #151151
-
links
BNF rule #2020, BNF rule #160160, BNF rule #161161
-
mex
BNF rule #3232, BNF rule #374374, BNF rule #300300, BNF rule #9797
-
mex-1
BNF rule #311311, BNF rule #310310
-
mex-2
BNF rule #311311, BNF rule #312312, BNF rule #385385
-
mex-operator
BNF rule #374374, BNF rule #372372, BNF rule #152152
-
number
BNF rule #3232, BNF rule #10511051, BNF rule #300300, BNF rule #152152
-
operand
BNF rule #312312, BNF rule #385385, BNF rule #381381, BNF rule #332332
-
operand-1
-
operand-2
BNF rule #382382, BNF rule #383383
-
operand-3
BNF rule #383383, BNF rule #385385
-
operator
BNF rule #311311, BNF rule #312312, BNF rule #310310, BNF rule #372372, BNF rule #370370, BNF rule #330330
-
operator-1
BNF rule #371371, BNF rule #370370
-
operator-2
-
paragraph
-
paragraphs
-
prenex
BNF rule #2020, BNF rule #1111, BNF rule #4141
-
quantifier
BNF rule #2020, BNF rule #385385, BNF rule #9595, BNF rule #112112
-
relative-clause
-
relative-clauses
BNF rule #2020, BNF rule #3232, BNF rule #9595, BNF rule #9797, BNF rule #112112, BNF rule #111111, BNF rule #9090
-
rp-expression
BNF rule #310310, BNF rule #332332
-
rp-operand
-
selbri
BNF rule #5353, BNF rule #3232, BNF rule #374374, BNF rule #385385, BNF rule #131131, BNF rule #136136, BNF rule #9595, BNF rule #112112, BNF rule #815815
-
selbri-1
-
selbri-2
BNF rule #131131, BNF rule #132132
-
selbri-3
BNF rule #132132, BNF rule #134134, BNF rule #152152
-
selbri-4
-
selbri-5
BNF rule #134134, BNF rule #135135
-
selbri-6
BNF rule #135135, BNF rule #136136
-
sentence
BNF rule #1414, BNF rule #4141
-
simple-tense-modal
BNF rule #971971, BNF rule #815815
-
space
-
space-int-props
BNF rule #10461046
-
space-interval
BNF rule #10401040
-
space-offset
BNF rule #10401040
-
stag
BNF rule #5252, BNF rule #5050, BNF rule #807807, BNF rule #383383, BNF rule #381381, BNF rule #371371, BNF rule #370370, BNF rule #134134, BNF rule #135135, BNF rule #1313, BNF rule #9191, BNF rule #9393, BNF rule #22
-
statement
BNF rule #1010, BNF rule #1111
-
statement-1
-
statement-2
BNF rule #1212, BNF rule #1313
-
statement-3
-
subsentence
BNF rule #5454, BNF rule #122122, BNF rule #4141, BNF rule #152152
-
sumti
BNF rule #3232, BNF rule #385385, BNF rule #9191, BNF rule #9494, BNF rule #9797, BNF rule #112112, BNF rule #152152, BNF rule #8383
-
sumti-1
-
sumti-2
-
sumti-3
BNF rule #9292, BNF rule #9393
-
sumti-4
BNF rule #9393, BNF rule #9494
-
sumti-5
-
sumti-6
BNF rule #9595, BNF rule #111111
-
sumti-tail
-
sumti-tail-1
-
tag
BNF rule #5454, BNF rule #130130, BNF rule #1414, BNF rule #152152, BNF rule #8383
-
tail-terms
BNF rule #5151, BNF rule #5252, BNF rule #5353, BNF rule #5050, BNF rule #5454
-
tanru-unit
-
tanru-unit-1
-
tanru-unit-2
BNF rule #151151, BNF rule #152152
-
tense-modal
-
term
BNF rule #160160, BNF rule #161161, BNF rule #122122, BNF rule #8282
-
terms
BNF rule #2020, BNF rule #3232, BNF rule #3030, BNF rule #4040, BNF rule #7171, BNF rule #8585
-
terms-1
-
terms-2
-
termset
-
text
BNF rule #3232, BNF rule #11011101, BNF rule #9797
-
text-1
-
time
-
time-offset
BNF rule #10301030
-
utterance
BNF rule #11011101
-
vocative