grammar myprog; xPROG : xSTMT_S* EOF ; xSTMT_S : xSPSTMT | xBSTMT | xSTMT ; xIF : IF OPT xEXPR CPT (xBSTMT|xSTMT) (ELSE xSTMT_S)? ; xBSTMT : OBC xSTMT_S* CBC ; xSPSTMT : xIF ; xSTMT : xEXPR SEM ; xEXPR : xPRI_5 ; xPRI_5 : xPRI_4 ((ASS) xPRI_4)* ; xPRI_4 : xPRI_3 ((AND|OR) xPRI_3)* ; xPRI_3 : xPRI_2 ((LT|GT|LTE|GTE|EQ|NE) xPRI_2)* ; xPRI_2 : xPRI_1 ((ADD|SUB) xPRI_1)* ; xPRI_1 : xATOM ((MUL|DIV) xATOM)* ; xATOM : OPT xEXPR CPT | ID | xCONST ; xCONST : INT | FLOAT ; MUL : '*'; DIV : '/'; ADD : '+'; SUB : '-'; LT : '<'; GT : '>'; LTE : '<='; GTE : '>='; EQ : '=='; NE : '!='; AND : '&&'; OR : '||'; ASS : '='; SEM : ';'; OPT : '('; CPT : ')'; OBC : '{'; CBC : '}'; IF : 'if'; ELSE : 'else'; ID : ('a'..'z' |'A'..'Z')+ ; INT : '0'..'9' + ; FLOAT : '0'..'9'+'.''0'..'9'+; NEWLINE: '/r' ? '/n' {skip();}; WS : (' ' |'/t' |'/n' |'/r' )+ {skip();} ;