Grammar Documentation
Grammar Reference
Generated April 18, 2026 · 67 rules · ANTLR · Generated by DevDiagrams

grammarSpec

entry point
The main entry point for parsing a v4 grammar.
grammarSpec
    : grammarDecl prequelConstruct* rules modeSpec* EOF
    ;
grammarDecl prequelConstruct rules modeSpec EOF

grammarDecl

grammarDecl
    : grammarType identifier SEMI
    ;
grammarType identifier SEMI

grammarType

grammarType
    : LEXER GRAMMAR
    | PARSER GRAMMAR
    | GRAMMAR
    ;
LEXER GRAMMAR PARSER GRAMMAR GRAMMAR

prequelConstruct

prequelConstruct
    : optionsSpec
    | delegateGrammars
    | tokensSpec
    | channelsSpec
    | action_
    ;
optionsSpec delegateGrammars tokensSpec channelsSpec action_

optionsSpec

optionsSpec
    : OPTIONS (option SEMI)* RBRACE
    ;
OPTIONS option SEMI RBRACE

option

option
    : identifier ASSIGN optionValue
    ;
identifier ASSIGN optionValue

optionValue

optionValue
    : identifier (DOT identifier)*
    | STRING_LITERAL
    | actionBlock
    | INT
    ;
identifier DOT identifier STRING_LITERAL actionBlock INT

delegateGrammars

delegateGrammars
    : IMPORT delegateGrammar (COMMA delegateGrammar)* SEMI
    ;
IMPORT delegateGrammar COMMA delegateGrammar SEMI

delegateGrammar

delegateGrammar
    : identifier ASSIGN identifier
    | identifier
    ;
identifier ASSIGN identifier identifier

tokensSpec

tokensSpec
    : TOKENS idList? RBRACE
    ;
TOKENS idList RBRACE

channelsSpec

channelsSpec
    : CHANNELS idList? RBRACE
    ;
CHANNELS idList RBRACE

idList

idList
    : identifier (COMMA identifier)* COMMA?
    ;
identifier COMMA identifier COMMA

action_

action_
    : AT (actionScopeName COLONCOLON)? identifier actionBlock
    ;
AT actionScopeName COLONCOLON identifier actionBlock

actionScopeName

actionScopeName
    : identifier
    | LEXER
    | PARSER
    ;
identifier LEXER PARSER

actionBlock

actionBlock
    : ACTION
    ;
ACTION

argActionBlock

argActionBlock
    : BEGIN_ARGUMENT ARGUMENT_CONTENT*? END_ARGUMENT
    ;
BEGIN_ARGUMENT ARGUMENT_CONTENT END_ARGUMENT

modeSpec

modeSpec
    : MODE identifier SEMI lexerRuleSpec*
    ;
MODE identifier SEMI lexerRuleSpec

rules

rules
    : ruleSpec*
    ;
ruleSpec

ruleSpec

ruleSpec
    : parserRuleSpec
    | lexerRuleSpec
    ;
parserRuleSpec lexerRuleSpec

parserRuleSpec

parserRuleSpec
    : ruleModifiers? RULE_REF argActionBlock? ruleReturns? throwsSpec? localsSpec? rulePrequel* COLON ruleBlock SEMI
        exceptionGroup
    ;
ruleModifiers RULE_REF argActionBlock ruleReturns throwsSpec localsSpec rulePrequel COLON ruleBlock SEMI exceptionGroup

exceptionGroup

exceptionGroup
    : exceptionHandler* finallyClause?
    ;
exceptionHandler finallyClause

exceptionHandler

exceptionHandler
    : CATCH argActionBlock actionBlock
    ;
CATCH argActionBlock actionBlock

finallyClause

finallyClause
    : FINALLY actionBlock
    ;
FINALLY actionBlock

rulePrequel

rulePrequel
    : optionsSpec
    | ruleAction
    ;
optionsSpec ruleAction

ruleReturns

ruleReturns
    : RETURNS argActionBlock
    ;
RETURNS argActionBlock

throwsSpec

-------------- Exception spec
throwsSpec
    : THROWS qualifiedIdentifier (COMMA qualifiedIdentifier)*
    ;
THROWS qualifiedIdentifier COMMA qualifiedIdentifier

localsSpec

localsSpec
    : LOCALS argActionBlock
    ;
LOCALS argActionBlock

ruleAction

ruleAction
    : AT identifier actionBlock
    ;
AT identifier actionBlock

ruleModifiers

ruleModifiers
    : ruleModifier+
    ;
ruleModifier

ruleModifier

ruleModifier
    : PUBLIC
    | PRIVATE
    | PROTECTED
    | FRAGMENT
    ;
PUBLIC PRIVATE PROTECTED FRAGMENT

ruleBlock

ruleBlock
    : ruleAltList
    ;
ruleAltList

ruleAltList

ruleAltList
    : labeledAlt (OR labeledAlt)*
    ;
labeledAlt OR labeledAlt

labeledAlt

labeledAlt
    : alternative (POUND identifier)?
    ;
alternative POUND identifier

lexerRuleSpec

lexerRuleSpec
    : FRAGMENT? TOKEN_REF optionsSpec? COLON lexerRuleBlock SEMI
    ;
FRAGMENT TOKEN_REF optionsSpec COLON lexerRuleBlock SEMI

lexerRuleBlock

lexerRuleBlock
    : lexerAltList
    ;
lexerAltList

lexerAltList

lexerAltList
    : lexerAlt (OR lexerAlt)*
    ;
lexerAlt OR lexerAlt

lexerAlt

lexerAlt
    : lexerElements lexerCommands?
    |
    // explicitly allow empty alts
    ;
lexerElements lexerCommands

lexerElements

lexerElements
    : lexerElement+
    |
    ;
lexerElement

lexerElement

lexerElement
    : lexerAtom ebnfSuffix?
    | lexerBlock ebnfSuffix?
    | actionBlock QUESTION?
    ;
lexerAtom ebnfSuffix lexerBlock ebnfSuffix actionBlock QUESTION

lexerBlock

lexerBlock
    : LPAREN lexerAltList RPAREN
    ;
LPAREN lexerAltList RPAREN

lexerCommands

lexerCommands
    : RARROW lexerCommand (COMMA lexerCommand)*
    ;
RARROW lexerCommand COMMA lexerCommand

lexerCommand

lexerCommand
    : lexerCommandName LPAREN lexerCommandExpr RPAREN
    | lexerCommandName
    ;
lexerCommandName LPAREN lexerCommandExpr RPAREN lexerCommandName

lexerCommandName

lexerCommandName
    : identifier
    | MODE
    ;
identifier MODE

lexerCommandExpr

lexerCommandExpr
    : identifier
    | INT
    ;
identifier INT

altList

altList
    : alternative (OR alternative)*
    ;
alternative OR alternative

alternative

alternative
    : elementOptions? element+
    |
    // explicitly allow empty alts
    ;
elementOptions element

element

element
    : labeledElement (ebnfSuffix |)
    | atom (ebnfSuffix |)
    | ebnf
    | actionBlock QUESTION? predicateOptions?
    ;
labeledElement ebnfSuffix atom ebnfSuffix ebnf actionBlock QUESTION predicateOptions

predicateOptions

predicateOptions
    : LT predicateOption (COMMA predicateOption)* GT
    ;
LT predicateOption COMMA predicateOption GT

predicateOption

predicateOption
    : elementOption
    | identifier ASSIGN (actionBlock | INT | STRING_LITERAL)
    ;
elementOption identifier ASSIGN actionBlock INT STRING_LITERAL

labeledElement

labeledElement
    : identifier (ASSIGN | PLUS_ASSIGN) (atom | block)
    ;
identifier ASSIGN PLUS_ASSIGN atom block

ebnf

ebnf
    : block blockSuffix?
    ;
block blockSuffix

blockSuffix

blockSuffix
    : ebnfSuffix
    ;
ebnfSuffix

ebnfSuffix

ebnfSuffix
    : QUESTION QUESTION?
    | STAR QUESTION?
    | PLUS QUESTION?
    ;
QUESTION QUESTION STAR QUESTION PLUS QUESTION

lexerAtom

lexerAtom
    : characterRange
    | terminalDef
    | notSet
    | LEXER_CHAR_SET
    | wildcard
    ;
characterRange terminalDef notSet LEXER_CHAR_SET wildcard

atom

atom
    : terminalDef
    | ruleref
    | notSet
    | wildcard
    ;
terminalDef ruleref notSet wildcard

wildcard

wildcard
    : DOT elementOptions?
    ;
DOT elementOptions

notSet

-------------------- Inverted element set
notSet
    : NOT setElement
    | NOT blockSet
    ;
NOT setElement NOT blockSet

blockSet

blockSet
    : LPAREN setElement (OR setElement)* RPAREN
    ;
LPAREN setElement OR setElement RPAREN

setElement

setElement
    : TOKEN_REF elementOptions?
    | STRING_LITERAL elementOptions?
    | characterRange
    | LEXER_CHAR_SET
    ;
TOKEN_REF elementOptions STRING_LITERAL elementOptions characterRange LEXER_CHAR_SET

block

------------- Grammar Block
block
    : LPAREN (optionsSpec? ruleAction* COLON)? altList RPAREN
    ;
LPAREN optionsSpec ruleAction COLON altList RPAREN

ruleref

---------------- Parser rule ref
ruleref
    : RULE_REF argActionBlock? elementOptions?
    ;
RULE_REF argActionBlock elementOptions

characterRange

--------------- Character Range
characterRange
    : STRING_LITERAL RANGE STRING_LITERAL
    ;
STRING_LITERAL RANGE STRING_LITERAL

terminalDef

terminalDef
    : TOKEN_REF elementOptions?
    | STRING_LITERAL elementOptions?
    ;
TOKEN_REF elementOptions STRING_LITERAL elementOptions

elementOptions

Terminals may be adorned with certain options when reference in the grammar: TOK<,,,>
elementOptions
    : LT elementOption (COMMA elementOption)* GT
    ;
LT elementOption COMMA elementOption GT

elementOption

elementOption
    : qualifiedIdentifier
    | identifier ASSIGN (qualifiedIdentifier | STRING_LITERAL | INT)
    ;
qualifiedIdentifier identifier ASSIGN qualifiedIdentifier STRING_LITERAL INT

identifier

identifier
    : RULE_REF
    | TOKEN_REF
    ;
RULE_REF TOKEN_REF

qualifiedIdentifier

qualifiedIdentifier
    : identifier (DOT identifier)*
    ;
identifier DOT identifier