// SysY 子集语法：支持形如
// int main() { int a = 1; int b = 2; return a + b; }
// 的最小返回表达式编译。

// 后续需要自行添加

grammar SysY;

/*===-------------------------------------------===*/
/* Lexer rules                                     */
/*===-------------------------------------------===*/

INT: 'int';
RETURN: 'return';

ASSIGN: '=';
ADD: '+';

LPAREN: '(';
RPAREN: ')';
LBRACE: '{';
RBRACE: '}';
SEMICOLON: ';';

ID: [a-zA-Z_][a-zA-Z_0-9]*;
ILITERAL: [0-9]+;

WS: [ \t\r\n] -> skip;
LINECOMMENT: '//' ~[\r\n]* -> skip;
BLOCKCOMMENT: '/*' .*? '*/' -> skip;

/*===-------------------------------------------===*/
/* Syntax rules                                    */
/*===-------------------------------------------===*/

compUnit
    : funcDef EOF
    ;

decl
    : btype varDef SEMICOLON
    ;

btype
    : INT
    ;

varDef
    : lValue (ASSIGN initValue)?
    ;

initValue
    : exp
    ;

funcDef
    : funcType ID LPAREN RPAREN blockStmt
    ;

funcType
    : INT
    ;

blockStmt
    : LBRACE blockItem* RBRACE
    ;

blockItem
    : decl
    | stmt
    ;

stmt
    : returnStmt
    ;

returnStmt
    : RETURN exp SEMICOLON
    ;

exp
    : LPAREN exp RPAREN          # parenExp
    | var                        # varExp
    | number                     # numberExp
    | exp ADD exp                # additiveExp
    ;

var
    : ID
    ;

lValue
    : ID
    ;

number
    : ILITERAL
    ;
