BNF for AbcParser.jj

NON-TERMINALS

AbcFile ::= ( AbcText | AbcTune )* <EOF>
AbcText ::= ( TextLine )+
TextLine ::= <TEXTLINE> Eol
Eol ::= <EOL>
| <EOL2>
| <HEOL>
AbcTune ::= AbcHeader AbcMusic
AbcHeader ::= FieldNumber ( FieldTitle )+ ( OtherFields )* FieldKey
FieldNumber ::= <INDEX> Digits Eol
Digits ::= ( <DIGITS> | <HDIGITS> )
FieldTitle ::= <TITLE> TitleText Eol
TitleText ::= <RESTOFLINE>
OtherFields ::= StructuredFields
| FreeTextFields
StructuredFields ::= FieldDefaultLength
| FieldMeter
| FieldTempo
| FieldParts
FreeTextFields ::= ( ( <AREA> ) | ( <BOOK> ) | ( <COMPOSER> ) | ( <DISC> ) | ( <ELEMSKIP> ) | ( <GROUP> ) | ( <HISTORY> ) | ( <INFO> ) | ( <NOTES> ) | ( <ORIGIN> ) | ( <RHYTHM> ) | ( <SOURCE> ) | ( <TRANSNOTES> ) ) Text Eol
Text ::= <RESTOFLINE>
FieldDefaultLength ::= <LENGTH> NoteLengthStrict Eol
NoteLengthStrict ::= Digits <SLASH> Digits
FieldMeter ::= <METER> Meter Eol
Meter ::= <RESTOFLINE>
FieldKey ::= <KEY> Key Eol
Key ::= <RESTOFKEY>
FieldTempo ::= <TEMPO> Tempo Eol
Tempo ::= <RESTOFLINE>
FieldParts ::= <PARTS> Parts Eol
Parts ::= <RESTOFLINE>
AbcMusic ::= AbcLine ( LineEnder AbcLine )* EndOfTune
AbcLine ::= ( Element )+
EndOfTune ::= <ENDOFTUNE>
| <EOF>
| Eol <EOF>
Element ::= ( NoteElement | Tuplet | BarLine | NthRepeat | BeginSlur | EndSlur | Space | GuitarChord )
LineEnder ::= Eol
Tuplet ::= ( TupletSpec ( TupletContents )+ )
TupletSpec ::= <OPAREN> Digits
TupletContents ::= NoteElement
BeginSlur ::= <OPAREN>
EndSlur ::= <CPAREN>
NoteElement ::= ( NoteStem ( BrokenRhythm )? )
NoteStem ::= ( GraceNotes )? ( Gracings )* ( Note | MultiNote )
BrokenRhythm ::= ( <GT> )+
| ( <LT> )+
MultiNote ::= <OBRACK> ( Note )+ <CBRACK>
Note ::= NoteOrRest ( NoteLength )? ( Tie )?
Tie ::= <MINUS>
Gracings ::= <GRACING>
GraceNotes ::= <OBRACE> ( Pitch )* <CBRACE>
GuitarChord ::= <QUOTEDSTRING>
NoteOrRest ::= ( Pitch | Rest )
Pitch ::= ( ( Accidental )? BaseNote ( Octave )? )
Accidental ::= <CARET2>
| <CARET>
| <UNDER>
| <UNDER2>
| <EQUALS>
Octave ::= ( HiOctave )+
| ( LoOctave )+
HiOctave ::= <APOS>
LoOctave ::= <COMMA>
NoteLength ::= ( Digits | ( Digits )? <SLASH2> ( Digits )? )
BaseNote ::= ( <HINOTE> | <LONOTE> )
Rest ::= <RESTNOTE>
BarLine ::= <BARLINE>
NthRepeat ::= <NTHREPEAT>
Space ::= <WHITESPACE>