valkyrie-antlr 0.0.1

The hand write parser of valkyrie language
Documentation
lexer grammar ValkyrieBasic;
// $antlr-format useTab false, alignColons hanging, alignSemicolons hanging
// $antlr-format alignFirstTokens true
@lexer::members {

}

DOT:        '.';
COMMA:      ',' | ',';
SEMICOLON:  ';';
FAKE_COLON: '⁏' | ';;';

// colon
OP_PROPORTION: '∷' | '::';
COLON:         ':' | '∶';

// brackets
PARENTHESES_L: '(';
PARENTHESES_R: ')';
BRACKET_L:     '[';
BRACKET_R:     ']';
BRACE_L:       '{';
BRACE_R:       '}';
GENERIC_L:     '⟨';
GENERIC_R:     '⟩';
OFFSET_L:      '⁅';
OFFSET_R:      '⁆';
RANGE_L:       '⟦';
RANGE_R:       '⟧';
CEILING_L:     '⌈';
CEILING_R:     '⌉';
FLOOR_L:       '⌊';
FLOOR_R:       '⌋';
COLLECTION_L:  '⦃';
COLLECTION_R:  '⦄';

// infix
OP_ADD:     '+';
OP_INC:     '++';
OP_SUB:     '-';
OP_DEC:     '--';
OP_MUL:     '*';
OP_DIV:     '/';
OP_DIV_REM: '/%' | '÷';
// equal
OP_EQ:  '==';
OP_NE:  '≠' | '!=';
OP_NEE: '≢' | '!==' | '=!=';
OP_EEE: '≡' | '===';
// compare
OP_LEQ: '⩽' | '≤' | '<=';
OP_LLE: '<<=';
OP_LLL: '⋘' | '<' '<' '<';
OP_LL:  '≪' | '<' '<';
OP_LT:  '<';
OP_GEQ: '⩾' | '≥' | '>=';
OP_GGE: '>>=';
OP_GGG: '⋙' | '>' '>' '>';
OP_GG:  '≫' | '>' '>';
OP_GT:  '>';
// arrow
OP_LEFT:   '←' | '<-';
OP_ARROW:  '⟶' | '->';
OP_ARROW2: '⇒' | '=>';
// assign
OP_ASSIGN:     '=';
OP_BIND:       '≔' | ':=';
OP_MAY_ASSIGN: '?=';
OP_ADD_ASSIGN: '+=';
OP_SUB_ASSIGN: '-=';
OP_MUL_ASSIGN: '*=';
OP_DIV_ASSIGN: '/=';
// logical
LOGIC_NOT:  '¬';
LOGIC_AND:  '&&' | '∧';
LOGIC_XAND: '⩟';
LOGIC_NAND: '⊼';
LOGIC_OR:   '||' | '∨';
LOGIC_XOR:  '⊻';
LOGIC_NOR:  '⊽';
// set
SET_INTERSECTION: '∩';
SET_UNION:        '∪';
// bitwise
OP_AND:  '&';
OP_OR:   '|';
OP_XOR:  '⊕';
OP_IMPL: '‽';
OP_IFF:  '⇔';

// macro call
OP_AT:   '@';
OP_HASH: '#' | '##' | '#!';
// macro slot
LAMBDA_SLOT: '$' | '$$';
MACRO_SLOT:  '§' | '§§';
// monadic
OP_UNIMPLEMENTED: '⅏' | '???';
OP_OR_ELSE:       '?:';
OP_THROW:         '?';
// not
OP_NOT: '!';
KW_NOT: 'not';
// in
OP_IN:        '∈' | '∊';
KW_IN:        'in';
OP_NOT_IN:    '∉';
OP_CONTINUES: '∋' | '∍';

// is
KW_IS:     'is';
OP_IS:     '⊑' | '<:';
OP_IS_NOT: '⋢' | '<!';
// as
KW_AS: 'as' | 'as!' | 'as*';
// until
OP_DECONSTRUCT: '...' | '..';
OP_UNTIL:       '..<' | '..=';
OP_POW:         '^';
// prefix
OP_INVERSE: '⅟';
OP_ROOT2:   '√';
OP_ROOT3:   '∛';
OP_ROOT4:   '∜';
// suffix
OP_TEMPERATURE: '℃' | '℉';
OP_TRANSPOSE:   'ᵀ' | 'ᴴ';
OP_PERCENT:     '%' | '‰' | '‱';
// standalone
OP_REFERENCE: '※';
OP_LABEL:     '¶';

// keywords
KW_NAMESPACE: 'namespace' ('!' | '*' | '?')?;
KW_IMPORT:    'using' ('!' | '*' | '?')?;
KW_EXTENSION: 'extension';
// 
KW_CLASS:    'class' | 'structure';
KW_TRAIT:    'trait' | 'interface';
KW_UNION:    'union';
KW_BITFLAGS: 'flags';
KW_TYPE:     'type';
//
KW_TEMPLATE:   'template' | 'generic' | 'forall';
KW_EXTENDS:    'extend' | 'extends';
KW_IMPLEMENTS: 'implement';
KW_WHERE:      'where';
//
KW_WHILE: 'while' | 'until';
KW_FOR:   'for';
//
KW_LET:      'let';
KW_WITCH:    'which';
KW_NEW:      'new';
KW_OBJECT:   'object';
KW_LAMBDA:   'lambda';
KW_FUNCTION: 'function' | 'micro' | 'macro';
// pattern match
KW_TRY:   'try';
KW_MATCH: 'match';
KW_CATCH: 'catch';
KW_WITH:  'with';
KW_CASE:  'case';
KW_WHEN:  'when';
// number
INTEGER: [0] | [1-9][0-9]*;
DECIMAL
    : INTEGER DOT INTEGER EXP? // 1.35, 1.35E-9, 0.3, -4.5
    | INTEGER EXP
    ;
fragment EXP: [Ee] [+\-]? INTEGER;

STRING_SINGLE: '\'' ~[']* '\'';
STRING_DOUBLE: '"' ~["]* '"';
STRING_BLOCK:  '"""' .*? '"""' | '\'\'\'' .*? '\'\'\'';

// conditional
KW_IF:        'if';
KW_ELSE:      'else';
KW_OTHERWISE: 'otherwise';
// control goto FROM: 'from';
RETURN:   'return';
RESUME:   'resume';
YIELD:    'yield';
BREAK:    'break';
CONTINUE: 'continue';
RAISE:    'raise';
// atom
SPECIAL: 'true' | 'false' | 'null' | 'nil' | '∅';
// atom
RAW_ID:     '`' ~[`]+ '`';
UNICODE_ID: [_\p{XID_start}] [\p{XID_continue}]*;

// comment
LINE_COMMENT:  '//' ~[\r\n]* -> channel(HIDDEN);
BLOCK_COMMENT: '/*' .*? '*/' -> channel(HIDDEN);

WHITE_SPACE:     [\p{White_Space}]+ -> channel(HIDDEN);
ERROR_CHARACTAR: . -> channel(HIDDEN);