-
Notifications
You must be signed in to change notification settings - Fork 0
/
broCode.g4
85 lines (56 loc) · 1.78 KB
/
broCode.g4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
grammar broCode;
// PARSER
program: start line* end;
start: START;
end: END;
line: statement | ifBlock | loopBlock;
statement: (assignment | printstmt ) SEMICOLON;
ifBlock: IF expression innerBlock (ELSEIF expression innerBlock)* (ELSE innerBlock)? ;
innerBlock: block | ifBlock | loopBlock;
loopBlock: LOOP expression innerBlock;
block: LSECONDPAREN line* RSECONDPAREN;
assignment: IDENTIFIER ASSIGN expression;
printstmt: PRINT term;
term: IDENTIFIER | INTEGER | STRING;
// functionCall: IDENTIFIER LFIRSTPAREN (expression (COMM expression)*)? RFIRSTPAREN;
expression
: constant #constantExpression
| IDENTIFIER #identifierExpression
// | functionCall #functionCallExpression
| LFIRSTPAREN expression RFIRSTPAREN #parenthesizedExpression
| NOT expression #notExpression
| expression MULTOP expression #multiplicativeExpression
| expression ADDOP expression #additiveExpression
| expression COMPAREOP expression #comparisionExpression
| expression BOOLOP expression #booleanExpression
;
constant: INTEGER | FLOAT | STRING | BOOL | NULL;
// LEXER
WS: [ \n\t\r]+ -> skip;
INTEGER: [0-9]+;
FLOAT: [0-9]+ '.' [0-9]+;
STRING: ('"' ~'"'* '"') | ('\'' ~'\''* '\'');
BOOL: 'true' | 'false';
NULL: 'null';
START: 'start bro\n';
END: 'stop bro' EOF;
// Keywords
LOOP: 'jotokhon bro';
IF: 'jodi bro';
ELSE: 'na hole bro';
ELSEIF: 'jodi na bro';
PRINT: 'bol bro';
IDENTIFIER: [a-zA-Z_][a-zA-Z0-9_]*;
// Opperators
ASSIGN: '->';
NOT: '!';
MULTOP: '*' | '/' | '%';
ADDOP: '+' | '-';
COMPAREOP: '==' | '!=' | '>' | '<' | '>=' | '<=';
BOOLOP: 'and' | 'or' | 'xor';
SEMICOLON: ';';
LSECONDPAREN: '{';
RSECONDPAREN: '}';
LFIRSTPAREN: '(';
RFIRSTPAREN: ')';
COMM: ',';