grammar xlang; file : function+ EOF; function : Identifier LeftParen parameterList? RightParen Colon type block; parameterList : Identifier Colon type (Comma Identifier Colon type)*; type : TypeInteger | TypeBoolean ; block : LeftBrace statement* RightBrace; statement : If condition block (Else block)? | While condition block | Break Semicolon | Continue Semicolon | Return value Semicolon | Print value Semicolon | value Semicolon ; value : expr | condition ; condition : condition (And|Or|Xor) boolean | boolean ; boolean : Not boolean | True | False | expr (Less|LessEqual|Greater|GreaterEqual|Equal|NotEqual) expr | variable | LeftParen condition RightParen ; expr : expr (Plus|Minus|BitAnd|BitOr|BitXor|ShiftLeft|ShiftRight) term | term ; term : term (Mul|Div|Rem) factor | factor ; factor : Minus factor | BitNot factor | Integer | variable | LeftParen expr RightParen ; variable : Identifier | Identifier Define value | Identifier Assign value | Identifier LeftParen argumentList? RightParen ; argumentList : value (Comma value)*; TypeInteger : 'int'; TypeBoolean : 'bool'; If : 'if'; Else : 'else'; While : 'while'; Break : 'break'; Continue : 'continue'; Return : 'return'; Print : 'print'; And : 'and'; Or : 'or'; Xor : 'xor'; Not : 'not'; True : 'true'; False : 'false'; LeftParen : '('; RightParen : ')'; Colon : ':'; LeftBrace : '{'; RightBrace : '}'; Define : ':='; Assign : '='; Less : '<'; LessEqual : '<='; Greater : '>'; GreaterEqual : '>='; Equal : '=='; NotEqual : '!='; Plus : '+'; Minus : '-'; BitAnd : '&'; BitOr : '|'; BitXor : '^'; ShiftLeft : '<<'; ShiftRight : '>>'; BitNot : '~'; Mul : '*'; Div : '/'; Rem : '%'; Comma : ','; Semicolon : ';'; Identifier : [_a-zA-Z][_a-zA-Z0-9]*; Integer : [0-9]+; Comment : '//' ~[\n]* '\n' -> skip; Whitespace : [ \t\r\n]+ -> skip; Unknown : .;