<commit_before>grammar MiniJava;

program : mainClassDecl (classDecl)* ;
mainClassDecl : 'class' ID '{' 'public' 'static' 'void' 'main' '(' 'String' '[' ']' ID')' '{' (stmt)* '}' '}' ;
classDecl : 'class' ID ('extends' ID)? '{' (classVarDecl)* (methodDecl)* '}' ;
classVarDecl : type ID ';' ;
methodDecl : 'public' type ID (LPAREN (formal (',' formal)*)? RPAREN | PAREN) '{' (stmt)* 'return' expr ';' '}' ;
formal : type ID;
type : INT_TYPE | BOOL_TYPE | ID ;
stmt : varDecl
 | block
 | ifElse
 | whileDecl
 | print
 | assigment ;
varDecl : type ID  '=' expr ';' ;
block : '{' (stmt)* '}' ;
ifElse : 'if' '(' expr ')' stmt 'else' stmt ;
whileDecl : 'while' '(' expr ')' stmt ;
print : 'System.out.println' '(' expr ')' ';' ;
assigment : ID  '=' expr ';' ;

expr : logicalOr ;

logicalOr :
      logicalAnd OR logicalOr
    | logicalAnd ;

logicalAnd :
      equalsOrNotEquals AND logicalAnd
    | equalsOrNotEquals;

equalsOrNotEquals :
      relation (EEQ|NEQ) equalsOrNotEquals
    | relation ;

relation :
      plusOrMinus (LEQ|GEQ|LT|GT) relation
    | plusOrMinus ;

plusOrMinus :
      multOrDiv (ADD|SUB) plusOrMinus
    | multOrDiv ;

multOrDiv :
      unary (MUL|DIV) multOrDiv
    | unary ;

unary :
      (BANG|SUB) expr
    | methodCall ;

methodCall :
      methodCall DOT ID (LPAREN expr (COMMA expr)* RPAREN | PAREN)
    | atom ;

atom :
      INT
    | BOOL
    | NULL
    | THIS
    | NEW ID (PAREN | LPAREN RPAREN)
    | ID
    | LPAREN expr RPAREN ;


// Reserved Words
NULL : 'null' ;
THIS : 'this' ;
NEW  : 'new' ;
BOOL_TYPE : 'boolean';
INT_TYPE : 'int';

// Types
INT   : NONZERODIGIT DIGIT* | '0' ;
DIGIT : [0-9] ;
NONZERODIGIT : [1-9] ;
BOOL  : TRUE | FALSE ;
FALSE : 'false' ;
TRUE  : 'true' ;

// Identifier
ID : LETTER (LETTER | DIGIT)* ;
LETTER : [a-z] | [A-Z] ;

// Logic operators
AND : '&&' ;
OR  : '||' ;

// Relational operators
EEQ : '==' ;
NEQ : '!=' ;
LEQ : '<=' ;
GEQ : '>=' ;
LT  : '<' ;
GT  : '>' ;

// Arithmetic operators
ADD : '+' ;
SUB : '-' ;
MUL : '*' ;
DIV : '/' ;

// Unary operators
BANG : '!' ;
//NEGATIVE : SUB ;

// Delimeters
LPAREN : '(' ;
RPAREN : ')' ;
PAREN  : '()';
DOT    : '.' ;
COMMA  : ',' ;

Whitespace : (' ' | '\t' | '\n' | '\r' | Comment) -> channel(HIDDEN);
Comment : ('//' ~('\r' | '\n')* | '/*' .*? '*/') -> channel(HIDDEN);
<commit_msg>Fix association of +- and */<commit_after>grammar MiniJava;

program : mainClassDecl (classDecl)* ;
mainClassDecl : 'class' ID '{' 'public' 'static' 'void' 'main' '(' 'String' '[' ']' ID')' '{' (stmt)* '}' '}' ;
classDecl : 'class' ID ('extends' ID)? '{' (classVarDecl)* (methodDecl)* '}' ;
classVarDecl : type ID ';' ;
methodDecl : 'public' type ID (LPAREN (formal (',' formal)*)? RPAREN | PAREN) '{' (stmt)* 'return' expr ';' '}' ;
formal : type ID;
type : INT_TYPE | BOOL_TYPE | ID ;
stmt : varDecl
 | block
 | ifElse
 | whileDecl
 | print
 | assigment ;
varDecl : type ID  '=' expr ';' ;
block : '{' (stmt)* '}' ;
ifElse : 'if' '(' expr ')' stmt 'else' stmt ;
whileDecl : 'while' '(' expr ')' stmt ;
print : 'System.out.println' '(' expr ')' ';' ;
assigment : ID  '=' expr ';' ;

expr : logicalOr ;

logicalOr :
      logicalAnd OR logicalOr
    | logicalAnd ;

logicalAnd :
      equalsOrNotEquals AND logicalAnd
    | equalsOrNotEquals;

equalsOrNotEquals :
      relation (EEQ|NEQ) equalsOrNotEquals
    | relation ;

relation :
      plusOrMinus (LEQ|GEQ|LT|GT) relation
    | plusOrMinus ;

plusOrMinus :
      plusOrMinus (ADD|SUB) multOrDiv
    | multOrDiv ;

multOrDiv :
      multOrDiv (MUL|DIV) unary
    | unary ;

unary :
      (BANG|SUB) expr
    | methodCall ;

methodCall :
      methodCall DOT ID (LPAREN expr (COMMA expr)* RPAREN | PAREN)
    | atom ;

atom :
      INT
    | BOOL
    | NULL
    | THIS
    | NEW ID (PAREN | LPAREN RPAREN)
    | ID
    | LPAREN expr RPAREN ;


// Reserved Words
NULL : 'null' ;
THIS : 'this' ;
NEW  : 'new' ;
BOOL_TYPE : 'boolean';
INT_TYPE : 'int';

// Types
INT   : NONZERODIGIT DIGIT* | '0' ;
DIGIT : [0-9] ;
NONZERODIGIT : [1-9] ;
BOOL  : TRUE | FALSE ;
FALSE : 'false' ;
TRUE  : 'true' ;

// Identifier
ID : LETTER (LETTER | DIGIT)* ;
LETTER : [a-z] | [A-Z] ;

// Logic operators
AND : '&&' ;
OR  : '||' ;

// Relational operators
EEQ : '==' ;
NEQ : '!=' ;
LEQ : '<=' ;
GEQ : '>=' ;
LT  : '<' ;
GT  : '>' ;

// Arithmetic operators
ADD : '+' ;
SUB : '-' ;
MUL : '*' ;
DIV : '/' ;

// Unary operators
BANG : '!' ;
//NEGATIVE : SUB ;

// Delimeters
LPAREN : '(' ;
RPAREN : ')' ;
PAREN  : '()';
DOT    : '.' ;
COMMA  : ',' ;

Whitespace : (' ' | '\t' | '\n' | '\r' | Comment) -> channel(HIDDEN);
Comment : ('//' ~('\r' | '\n')* | '/*' .*? '*/') -> channel(HIDDEN);

{'fraction_non_alphanumeric': 0.20825232231583496, 'fraction_numerical': 0.002160293799956794, 'mean_word_length': 2.813838550247117, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1974793', 'n_tokens_mistral': 1921, 'n_tokens_neox': 1866, 'n_words': 422}