grammar LolSharp; options { language=CSharp; output=AST; ASTLabelType=CommonTree; } tokens { PROGRAM; USING; PRINT; LITERAL_STRING; LITERAL_INT; LITERAL_FLOAT; LITERAL_FALSE; LITERAL_TRUE; USINGDECLS; VARIABLE_DECLARATION; VARIABLE_REFERENCE; ASSIGN; } program : 'HAI' '\n' (using_decl '\n'+)* block+ 'KTHXBYE' '\n'* -> ^(PROGRAM ^(USINGDECLS using_decl*) block+) ; block : (statement '\n'+)+ -> statement+ ; statement : print_statement | var_decl | assignment | ; using_decl : 'I CAN HAS' ID '?' -> ^(USING ID) ; var_decl: 'I HAS A' ID /*('ITZ' expression)?*/ -> ^(VARIABLE_DECLARATION ID /*expression?*/) ; assignment : lh_expression 'R' expression -> ^(ASSIGN lh_expression expression) ; expression : literal_expression | ID -> ^(VARIABLE_REFERENCE ID) ; lh_expression : ID -> ^(VARIABLE_REFERENCE ID) ; literal_expression : literal_string | literal_int | literal_float | literal_boolean ; literal_string : RAW_QUOTED_STRING -> ^(LITERAL_STRING RAW_QUOTED_STRING) ; literal_int : s='-'? DIGITS -> ^(LITERAL_INT $s? DIGITS) ; literal_float : s='-'? lit=LITERAL_FLOAT_SEQ -> ^(LITERAL_FLOAT $s? $lit) ; literal_boolean : 'FAIL' -> ^(LITERAL_FALSE) | 'WIN' -> ^(LITERAL_TRUE) ; COMMENT : 'BTW' COMMENT_CHAR* '\n' { $channel=HIDDEN; } ; COMMENT_CHAR : ~('\n') { $channel=HIDDEN; } ; print_statement : 'VISIBLE' expression -> ^(PRINT expression) ; ID : LETTER (LETTER | DIGIT)* ; LETTER : 'a'..'z' | 'A'..'Z' ; DIGIT : '0'..'9' ; DIGITS : DIGIT+ ; LITERAL_FLOAT_SEQ : DIGITS '.' DIGITS ; WS : (' ' | '\t' | '\n' | '\r') { $channel=HIDDEN; } ; RAW_QUOTED_STRING : '"' ( ('\\' ESCAPE_CODE) | ~( '\\' | '\n' | '"'))* '"' ; ESCAPE_CODE : 'n' | 't' | '\\' | '"' | DIGIT DIGIT DIGIT DIGIT ;