[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

New baseline grammar, BNF version



LOJBAN MACHINE GRAMMAR, BNF VERSION, BASELINED AS OF 20 JULY 1990
This version has tech fixes 1-28 in it.

COPYRIGHT 1989,1990 THE LOGICAL LANGUAGE GROUP, INC.
CONTACT THAT ORGANIZATION AT 2904 BEAU LANE, FAIRFAX VA 22031 USA 703-385-0273

PERMISSION TO COPY GRANTED SUBJECT TO YOUR VERIFICATION THAT THIS IS THE
LATEST VERSION OF THE LOJBAN GRAMMAR, THAT YOUR DISTRIBUTION BE FOR
PROMOTION OF LOJBAN, THAT THERE IS NO CHARGE FOR THE PRODUCT, AND THAT
THIS COPYRIGHT NOTICE IS INCLUDED INTACT IN THE COPY.

Explanation of notation:

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.

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 and/or ("A & B" is the same as "A | B | A B").
7)  ... represents optional repetition of the construct to the left.
    Left-grouping is implied; right-grouping is shown by explicit recursion.
8)  () serves to indicate the grouping of the other operators.
9)  # is shorthand for "[free ...]", a construct which appears in many places.
10) // encloses an elidable terminator, which may be omitted (without change
    of meaning) if no grammatical ambiguity results.


text<0> = [(CMENE ... #) | (indicators & free ...)]
	[joik-jek] [I [jek | joik] # | NIhO ... # ] [paragraphs]

paragraphs<4> = utt-string [NIhO ... # paragraphs]

paragraph<10>= paragraph-1 [I [jek | joik] # (paragraph-1 | /POhO#/)] ...

paragraph-1<11> = paragraph-2 [I [jek | joik] [stag] BO #
	(paragraph-1 | /POhO#/)]

paragraph-2<12> = utterance | [prenex | tag] TUhE paragraphs /TUhU#/

utterance<20> = (ek | gihek | zihek) # | quantifier /POhO#/ | NA /POhO#/ |
	term ... /VAU#/ | prenex | relative-clauses | links | linkargs |
	sentence

prenex<30> = term ... ZOhU #

sentence<40> = bridi-tail | sentence-1

sentence-1<41> = term ... [CU #] bridi-tail | gek sentence-1 gik sentence-1 |
	prenex sentence

bridi-tail<50> = bridi-tail-1 [gihek # bridi-tail-1 tail-terms] ...

bridi-tail-1<51> = bridi-tail-2 [gihek [stag] BO # bridi-tail-1 tail-terms]

bridi-tail-2<52> = bridi-tail-3
	[gihek [stag] KE # bridi-tail /KEhE#/ tail-terms] ...

bridi-tail-3<53> = selbri tail-terms | gek-bridi-tail

gek-bridi-tail<54> = gek bridi-tail gik bridi-tail-3 |
	tag KE gek-bridi-tail /KEhE#/ | NA gek-bridi-tail

tail-terms<71> = [term ...] /VAU#/

term<81> = sumti | (tag | FA #) (sumti | /KU#/) | termset | NA KU #

termset<83> = NUhI [NAhE] gek term ... /NUhU#/ gik term ... /NUhU#/ |
	NUhI term ... /NUhU#/ ek # term ... /NUhU#/

sumti<90> = sumti-1 [(joik # | ek #) sumti-1] ...

sumti-1<91> = sumti-2 [ek [stag] BO # sumti-1]

sumti-2<92> = sumti-3 [ek [stag] KE # sumti /KEhE#/] ...

sumti-3<93> = [quantifier] sumti-4 |
	quantifier [quantifier] selbri /KU#/ [relative-clauses]

sumti-4<96> = (LAhE | NAhE BO #) sumti-3 | sumti-5 [relative-clauses] |
	gek sumti gik sumti-3

sumti-5<99> = KOhA # | letteral-string # /BOI/ # | LA CMENE ... # |
	(LA | LE) sumti-tail /KU#/ | LI mex /LOhO/ | LUhI sumti /LUhU#/ |
	ZO any-word # | LU text /LIhU/ # | LOhU any-word ... LEhU # |
	ZOI any-word anything any-word #

relative-clauses<110> = relative-clause [zihek # relative-clause] ...

relative-clause<111> = GOI term /GEhU#/ | NOI sentence /KUhO#/

sumti-tail<113> = [sumti-4] [quantifier] selbri | quantifier sumti

selbri<130> = [tag] selbri-1

selbri-1<131> = (NA [tag]) ... selbri-2 ... [CO selbri-1]

selbri-2<133> = selbri-3 [joik-jek selbri-3] ...

selbri-3<134> = selbri-4 [BO selbri-3] | [NAhE] guhek selbri gik selbri-3

selbri-4<150> = selbri-5 [CEI selbri-5] ...

selbri-5<151> = selbri-6 [linkargs] | NAhE selbri-5
	NU [NAI] [joik-jek NU [NAI]] ... sentence /KEI#/

selbri-6<154> = BRIVLA # | GOhA [RAhO] # | KE selbri-2 ... /KEhE#/ |
	ME sumti /MEhU#/ [MOI] # | (number | letteral-string) MOI # |
	NUhA mex-operator | SE # selbri-6 | JAI tag selbri-6

linkargs<160> = BE term [links] /BEhO#/

links<161> = BEI term [links]

quantifier<300> = number # /BOI/ | VEI mex /VEhO#/

mex<310> = mex-1 [operator mex-1] ... | FUhA rp-expression

mex-1<311> = mex-2 [BO operator mex-1]

mex-2<312> = operand | [PEhO] operator mex-2 ... /KUhE#/

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

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

operator<370> = operator-1 [joik-jek operator-1] ...

operator-1<371> = operator-2 | guhek operator-1 gik operator-2

operator-2<372> = mex-operator # | KE operator /KEhE#/

mex-operator<374> = SE # mex-operator | NAhE mex-operator
	MAhO letteral-string # /BOI/ | NAhU bridi-tail /TEhU/ | VUhU

operand<381> = operand-1 [(joik | ek) # operand-1] ...

operand-1<382> = operand-2 [ek [stag] BO # operand-1]

operand-2<383> = operand-3 [ek [stag] KE # operand /KEhE#/] ...

operand-3<384> = quantifier | letteral-string # /BOI/ |
	NIhE selbri-6 [linkargs] /TEhU/ | MOhE sumti /TEhU/ |
	JOhI mex-2 ... /TEhU/ | gek operand gik operand-3 | LAhE operand-3

number<961> = PA [PA | letteral] ...

letteral-string<986> = letteral [PA | letteral] ...

letteral<987> = BY | any-word BU | LAU letteral | TEI letteral-string FOI

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

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

zihek<820> = [NA] [SE] ZIhA [NAI]

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

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

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

joik-jek<422> = joik # | jek #

gek<807> = [SE] GA [NAI] # | (stag | JOI | BIhI) GI [NAI] #

guhek<808> = [SE] GUhA [NAI] #

gik<816> = GI [NAI] #

tag<491> = tense-aspect [joik-jek tense-aspect] ... | CUhE #

stag<971> = simple-tense-aspect [(jek | joik) simple-tense-aspect] ... | CUhE

tense-aspect<815> = simple-tense-aspect # | FIhO selbri /FEhU#/

simple-tense-aspect<972> = [NAhE] [SE] BAI [NAI] [KI] | [NAhE] tense & CAhA | KI

tense<975> = time & space [KI]

time<1030> = ZI & time-offset ... & ZEhA [PU [NAI]] & interval-modifier

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

space<1040> = VA & space-offset ... & space-interval & (MOhI space-offset)

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

space-interval<1046> = ((VEhA & VIhA) [FAhA [NAI]]) & FEhE interval-modifier

interval-modifier<1050> = interval-property & [(ZAhO [interval-property]) ...]

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

free<32> = SEI # [term ... [CU #]] selbri /SEhU/ | SOI sumti [sumti] /SEhU/ |
	vocative selbri [relative-clauses] /DOhU/ |
	vocative CMENE ... # [relative-clauses] /DOhU/ |
	vocative [sumti] /DOhU/ | (number | letteral-string) MAI |
	TO text /TOI/ | XI number # /BOI/ | XI letteral-string # /BOI/ |
	XI VEI mex /VEhO/

vocative<415> = (COI [NAI]) ... & DOI

indicators<411> = [FUhE] indicator ...

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


The following rules are non-formal:

word<1100> = [BAhE | PEhA] 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.