// © Copyright 2022, Scott Gasch // // antlr4 -Dlanguage=Python3 ./chords.g4 // // Hi, self. In ANTLR grammars, there are two separate types of symbols: those // for the lexer and those for the parser. The former begin with a CAPITAL // whereas the latter begin with lowercase. The order of the lexer symbols // is the order that the lexer will recognize them in. There's a good tutorial // on this shit at: // // https://tomassetti.me/antlr-mega-tutorial/ // // There are also a zillion premade grammars at: // // https://github.com/antlr/grammars-v4 grammar chords; parse : rootNote majMinSusPowerExpr* addNotesExpr* overBassNoteExpr* | rootNote majMinSusPowerExpr* addNotesExpr extensionExpr* overBassNoteExpr ; rootNote : NOTE ; overBassNoteExpr : SLASH NOTE ; majMinSusPowerExpr : majExpr | minExpr | susExpr | diminishedExpr | augmentedExpr | powerChordExpr ; majExpr: MAJOR; minExpr: MINOR; susExpr: SUS ('2'|'4'); diminishedExpr: DIMINISHED; augmentedExpr: AUGMENTED; powerChordExpr: '5'; addNotesExpr : ADD* SIX | ADD* SEVEN | MAJ_SEVEN | MIN_SEVEN | ADD* NINE | ADD* ELEVEN ; extensionExpr : INTERVAL ; SPACE: [ \t\r\n] -> skip; NOTE: (AS|BS|CS|DS|ES|FS|GS) ; AS : ('A'|'a') | ('Ab'|'ab') | ('A#'|'a#') ; BS : ('B'|'b') | ('Bb'|'bb') ; CS : ('C'|'c') | ('C#'|'c#') ; DS : ('D'|'d') | ('Db'|'db') | ('D#'|'d#') ; ES : ('E'|'e') | ('Eb'|'eb') ; FS : ('F'|'f') | ('F#'|'f#') ; GS : ('G'|'g') | ('Gb'|'gb') | ('G#'|'g#') ; MAJOR: ('M'|'Maj'|'maj'|'Major'|'major'); MINOR: ('m'|'min'|'minor'); SUS: ('sus'|'suspended'); DIMINISHED: ('dim'|'diminished'|'-'); AUGMENTED: ('aug'|'augmented'|'+'); SLASH: ('/'|'\\'); ADD: ('add'|'Add'|'dom'); SIX: '6'; SEVEN: '7'; NINE: '9'; ELEVEN: '11'; MAJ_SEVEN: MAJOR '7'; MIN_SEVEN: MINOR '7'; INTERVAL: (MAJOR|MINOR)* ('b'|'#')* DIGITS ; DIGITS: [1-9]+ ;