-
Notifications
You must be signed in to change notification settings - Fork 1
/
HCLANGrammar.g
68 lines (54 loc) · 2.27 KB
/
HCLANGrammar.g
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
grammar HCLANGrammar;
program : declaration* EOF ;
declaration : classDecl
| funDecl
| varDecl
| statement ;
classDecl : 'class' IDENTIFIER ( '{' IDENTIFIER )?
'{' function* '}' ;
funDecl : 'fun' function ;
varDecl : 'let' IDENTIFIER ( ':=' expression )? ';' ;
statement : exprStmt
| forStmt
| ifStmt
| loopStmt
| printStmt
| printLnStmt
| returnStmt
| whileStmt
| importStmt
| block ;
exprStmt : expression ';' ;
forStmt : 'for' '(' ( varDecl | exprStmt | ';' )
expression? ';'
expression? ')' statement ;
ifStmt : 'if' expression statement ( 'else' statement )? ;
loopStmt : 'loop' statement ;
printStmt : 'print' expression ';' ;
printLnStmt : 'println' expression ';' ;
returnStmt : 'return' expression? ';' ;
whileStmt : 'while' expression statement ;
importStmt : 'import' ('std')? STRING;
block : '{' declaration* '}' ;
expression : assignment ;
assignment : ( call '.' )? IDENTIFIER ':=' assignment
| logic_or ;
logic_or : logic_and ( 'or' logic_and )* ;
logic_and : equality ( 'and' equality )* ;
equality : comparison ( ( '!=' | '=' ) comparison )* ;
comparison : term ( ( '>' | '>=' | '<' | '<=' ) term )* ;
term : factor ( ( '-' | '+' ) factor )* ;
factor : unary ( ( '^' | '/' | '*' ) unary )* ;
unary : ( '!' | '-' ) unary | call ;
call : primary ( '(' arguments? ')' | '.' IDENTIFIER )* ;
primary : 'true' | 'false' | 'null' | 'self' | 'break' | 'continue'
| NUMBER | STRING | IDENTIFIER | '(' expression ')'
| 'super' '.' IDENTIFIER ;
function : IDENTIFIER '(' parameters? ')' block ;
parameters : IDENTIFIER ( ',' IDENTIFIER )* ;
arguments : expression ( ',' expression )* ;
NUMBER : DIGIT+ ( '.' DIGIT+ )? ;
STRING : '"' .+ '"' ;
IDENTIFIER : ALPHA ( ALPHA | DIGIT )* ;
ALPHA : ('a'..'z''A'..'Z''_')+ ;
DIGIT : ('0'..'9')+ ;