/* 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* '"'
;