; This is an RFC 2234 (ABNF) version of bnf.300.  See
; http://www.faqs.org/rfcs/rfc2234.html
; 
; The only part that is not ABNF is the elidable terminators.  The
; conversion was done entirely programatically, by a perl program.
; 
; All rules have the form:
; 
; 	name<number> = 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.
; 
; 1)  Names in lower case are grammatical constructs.
; 2)  Names in UPPER CASE are selma'o (lexeme) names, and are terminals.
; 3)  Concatenation is expressed by juxtaposition with no operator symbol.
; 4)  / represents alternation (choice).
; 5)  [] represents an optional element.
; 6)  * represents optional repetition of the construct to the right.
; 7)  1* represents one-or-more repetition of the construct to the right.
; 8)  () serves to indicate the grouping of the other operators.
; 9) {} encloses an elidable terminator, which may be omitted (without change
;     of meaning) if no grammatical ambiguity results.


text<0> = [1*NAI] [1*CMENE *free / (indicators / 1*free / indicators 1*free)] [joik-jek] text-1

text-1<2> = [1*(I [jek / joik] [[stag] BO] *free) / 1*NIhO *free] [paragraphs]

paragraphs<4> = paragraph [1*NIhO *free paragraphs]

paragraph<10> = (statement / fragment) *(I *free [statement / fragment])

statement<11> = statement-1 / prenex statement

statement-1<12> = statement-2 *(I joik-jek [statement-2])

statement-2<13> = statement-3 [I [jek / joik] [stag] BO *free [statement-2]]

statement-3<14> = sentence / [tag] TUhE *free text-1 {TUhU *free}

fragment<20> = ek *free / gihek *free / quantifier / NA *free / terms {VAU *free} / prenex / relative-clauses / links / linkargs

prenex<30> = terms ZOhU *free

sentence<40> = [terms [CU *free]] bridi-tail

subsentence<41> = sentence / prenex subsentence

bridi-tail<50> = bridi-tail-1 [gihek [stag] KE *free bridi-tail {KEhE *free} tail-terms]

bridi-tail-1<51> = bridi-tail-2 *(gihek *free bridi-tail-2 tail-terms)

bridi-tail-2<52> = bridi-tail-3 [gihek [stag] BO *free bridi-tail-2 tail-terms]

bridi-tail-3<53> = selbri tail-terms / gek-sentence

gek-sentence<54> = gek subsentence gik subsentence tail-terms / [tag] KE *free gek-sentence {KEhE *free} / NA *free gek-sentence

tail-terms<71> = [terms] {VAU *free}

terms<80> = 1*terms-1

terms-1<81> = terms-2 *(PEhE *free joik-jek terms-2)

terms-2<82> = term *(CEhE *free term)

term<83> = sumti / (tag / FA *free) (sumti / {KU *free}) / termset / NA KU *free

termset<85> = NUhI *free gek terms {NUhU *free} gik terms {NUhU *free} / NUhI *free terms {NUhU *free}

sumti<90> = sumti-1 [VUhO *free relative-clauses]

sumti-1<91> = sumti-2 [(ek / joik) [stag] KE *free sumti {KEhE *free}]

sumti-2<92> = sumti-3 *(joik-ek sumti-3)

sumti-3<93> = sumti-4 [(ek / joik) [stag] BO *free sumti-3]

sumti-4<94> = sumti-5 / gek sumti gik sumti-4

sumti-5<95> = [quantifier] sumti-6 [relative-clauses] / quantifier selbri {KU *free} [relative-clauses]

sumti-6<97> = (LAhE *free / NAhE BO *free) [relative-clauses] sumti {LUhU *free} / KOhA *free / lerfu-string {BOI *free} / LA *free [relative-clauses] 1*CMENE *free / (LA / LE) *free sumti-tail {KU *free} / LI *free mex {LOhO *free} / ZO any-word *free / LU text {LIhU *free} / LOhU 1*any-word LEhU *free / ZOI any-word anything any-word *free

sumti-tail<111> = [sumti-6 [relative-clauses]] sumti-tail-1 / relative-clauses sumti-tail-1

sumti-tail-1<112> = [quantifier] selbri [relative-clauses] / quantifier sumti

relative-clauses<121> = relative-clause *(ZIhE *free relative-clause)

relative-clause<122> = GOI *free term {GEhU *free} / NOI *free subsentence {KUhO *free}

selbri<130> = [tag] selbri-1

selbri-1<131> = selbri-2 / NA *free selbri

selbri-2<132> = selbri-3 [CO *free selbri-2]

selbri-3<133> = 1*selbri-4

selbri-4<134> = selbri-5 *(joik-jek selbri-5 / joik [stag] KE *free selbri-3 {KEhE *free})

selbri-5<135> = selbri-6 [(jek / joik) [stag] BO *free selbri-5]

selbri-6<136> = tanru-unit [BO *free selbri-6] / [NAhE *free] guhek selbri gik selbri-6

tanru-unit<150> = tanru-unit-1 *(CEI *free tanru-unit-1)

tanru-unit-1<151> = tanru-unit-2 [linkargs]

tanru-unit-2<152> = BRIVLA *free / GOhA [RAhO] *free / KE *free selbri-3 {KEhE *free} / ME *free sumti {MEhU *free} [MOI *free] / (number / lerfu-string) MOI *free / NUhA *free mex-operator / SE *free tanru-unit-2 / JAI *free [tag] tanru-unit-2 / any-word 1*(ZEI any-word) / NAhE *free tanru-unit-2 / NU [NAI] *free *(joik-jek NU [NAI] *free) subsentence {KEI *free}

linkargs<160> = BE *free term [links] {BEhO *free}

links<161> = BEI *free term [links]

quantifier<300> = number {BOI *free} / VEI *free mex {VEhO *free}

mex<310> = mex-1 *(operator mex-1) / FUhA *free rp-expression

mex-1<311> = mex-2 [BIhE *free operator mex-1]

mex-2<312> = operand / [PEhO *free] operator 1*mex-2 {KUhE *free}

rp-expression<330> = rp-operand rp-operand operator

rp-operand<332> = operand / rp-expression

operator<370> = operator-1 *(joik-jek operator-1 / joik [stag] KE *free operator {KEhE *free})

operator-1<371> = operator-2 / guhek operator-1 gik operator-2 / operator-2 (jek / joik) [stag] BO *free operator-1

operator-2<372> = mex-operator / KE *free operator {KEhE *free}

mex-operator<374> = SE *free mex-operator / NAhE *free mex-operator / MAhO *free mex {TEhU *free} / NAhU *free selbri {TEhU *free} / VUhU *free

operand<381> = operand-1 [(ek / joik) [stag] KE *free operand {KEhE *free}]

operand-1<382> = operand-2 *(joik-ek operand-2)

operand-2<383> = operand-3 [(ek / joik) [stag] BO *free operand-2]

operand-3<385> = quantifier / lerfu-string {BOI *free} / NIhE *free selbri {TEhU *free} / MOhE *free sumti {TEhU *free} / JOhI *free 1*mex-2 {TEhU *free} / gek operand gik operand-3 / (LAhE *free / NAhE BO *free) operand {LUhU *free}

number<812> = PA *(PA / lerfu-word)

lerfu-string<817> = lerfu-word *(PA / lerfu-word)

lerfu-word<987> = BY / any-word BU / LAU lerfu-word / TEI lerfu-string FOI

ek<802> = [NA] [SE] A [NAI]

gihek<818> = [NA] [SE] GIhA [NAI]

jek<805> = [NA] [SE] JA [NAI]

joik<806> = [SE] JOI [NAI] / interval / GAhO interval GAhO

interval<932> = [SE] BIhI [NAI]

joik-ek<421> = joik *free / ek *free

joik-jek<422> = joik *free / jek *free

gek<807> = [SE] GA [NAI] *free / joik GI *free / stag gik

guhek<808> = [SE] GUhA [NAI] *free

gik<816> = GI [NAI] *free

tag<491> = tense-modal *(joik-jek tense-modal)

stag<971> = simple-tense-modal *((jek / joik) simple-tense-modal)

tense-modal<815> = simple-tense-modal *free / FIhO *free selbri {FEhU *free}

simple-tense-modal<972> = [NAhE] [SE] BAI [NAI] [KI] / [NAhE] ((time [space] / space [time]) / CAhA / (time [space] / space [time]) CAhA) [KI] / KI / CUhE

time<1030> = ZI [1*time-offset] [ZEhA [PU [NAI]]] [1*interval-property] / [ZI] 1*time-offset [ZEhA [PU [NAI]]] [1*interval-property] / [ZI] [1*time-offset] ZEhA [PU [NAI]] [1*interval-property] / [ZI] [1*time-offset] [ZEhA [PU [NAI]]] 1*interval-property

time-offset<1033> = PU [NAI] [ZI]

space<1040> = VA [1*space-offset] [space-interval] [(MOhI space-offset)] / [VA] 1*space-offset [space-interval] [(MOhI space-offset)] / [VA] [1*space-offset] space-interval [(MOhI space-offset)] / [VA] [1*space-offset] [space-interval] (MOhI space-offset)

space-offset<1045> = FAhA [NAI] [VA]

space-interval<1046> = (((VEhA / VIhA / VEhA VIhA) [FAhA [NAI]]) / space-int-props / ((VEhA / VIhA / VEhA VIhA) [FAhA [NAI]]) space-int-props)

space-int-props<1049> = 1*(FEhE interval-property)

interval-property<1051> = number ROI [NAI] / TAhE [NAI] / ZAhO [NAI]

free<32> = SEI *free [terms [CU *free]] selbri {SEhU} / SOI *free sumti [sumti] {SEhU} / vocative [relative-clauses] selbri [relative-clauses] {DOhU} / vocative [relative-clauses] 1*CMENE *free [relative-clauses] {DOhU} / vocative [sumti] {DOhU} / (number / lerfu-string) MAI / TO text {TOI} / XI *free (number / lerfu-string) {BOI} / XI *free VEI *free mex {VEhO}

vocative<415> = (1*(COI [NAI]) / DOI / 1*(COI [NAI]) DOI)

indicators<411> = [FUhE] 1*indicator

indicator<413> =  (UI / CAI) [NAI] / Y / DAhO / FUhO


; The following rules are non-formal:
; 
; word<1100> = [BAhE] any-word [indicators]
; 
; any-word = "any single word (no compound cmavo)"
; 
; anything = "any text at all, whether Lojban or not"
; 
; null<1101> = any-word SI / utterance SA / text SU
; 
; FAhO is a universal terminator and signals the end of parsable input.
