/* This test file tests Kate's ANTLR highlighting 
   compilable bt ANTLR although not directly:
   grammar can be alone file for both parser and lexer
   or two files
   This file is merged TestParser.g4 and TestLexer.g4
   this lines also tests regions of multiline comment
*/
//file TestParser.g4
parser grammar TestParser;

options { tokenVocab = TestLexer; }

// The main entry point for parsing a grammar.

startRule
     :  (expression | STRING)+ EOF
     ;

expression
     :  expression PLUS mulExpr
     |  expression MINUS mulExpr
     |  mulExpr
     ;

mulExpr
    :  mulExpr MUL unaryExpr
    |  mulExpr DIV unaryExpr
    |  unaryExpr
    ;

unaryExpr
    : atom
    | LPAR expression RPAR
    ;

atom
    : IDENT
    | number
    ;

number
    : INT
    | FLOAT
    ;

//================================
//file TestLexer.g4

lexer grammar TestLexer;

/*'channels' and '{' must be in one line
 to correct highlighting, highlighter can't
 recognize regular expression "(options|tokens|channels)(?=([\s]*{))"
 where apart from \s whitrspaces are end of lines
 */
channels { OFF_CHANNEL , COMMENT }


PLUS
    : '+'
    ;

MINUS
    : '-'
    ;

MUL
    : '*'
    ;

DIV
    : '/'
    ;

LPAR
    : '('
    ;

RPAR
    : ')'
    ;

IDENT
    :   Nondigit
        (   Nondigit
        |   Digit
        )*
    ;

fragment
Digit
    :   [0-9]
    ;

fragment
NonzeroDigit
    :   [1-9]
    ;

fragment
Nondigit
    :   [a-zA-Z_]
    ;

Sign
    :   '+' | '-'
    ;

INT
    :  Sign? (NonzeroDigit Digit* | '0')
    ;

fragment
DigitSequence
    :   Digit+
    ;

fragment
ExponentPart
    :   [eE] Sign? DigitSequence
    ;

fragment
FractionalConstant
    :   DigitSequence? '.' DigitSequence
    |   DigitSequence '.'
    ;

FLOAT
    :   (FractionalConstant ExponentPart? | DigitSequence ExponentPart)
    ;


fragment
EscapeSequence
    :   '\\' ['"?abfnrtvhe\\]
    ;

//between [] is charset , test escape \
fragment
SChar
    :   ~["\\\r\n]
    |   EscapeSequence
    ;

STRING
    :   '"' SChar* '"'
    ;