-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJump.g
67 lines (53 loc) · 842 Bytes
/
Jump.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
grammar Jump;
options {
language=Python;
output=AST;
}
tokens {
PROGRAM;
STATEMENT;
LABEL;
STMT;
EXPR;
ASSIGN1;
ASSIGN2;
GOTO;
IF;
RETURN;
}
prog :
statement*
-> ^(PROGRAM statement*)
;
statement :
label stmt ';'
-> ^(STATEMENT label? stmt)
;
label :
lbl=LABEL ':'
-> ^(LABEL $lbl ':')
| // epsilon
;
stmt :
IDENT '=' expr
-> ^(ASSIGN1 IDENT '=' expr)
| IDENT '=' e1=expr OP e2=expr
-> ^(ASSIGN2 IDENT '=' $e1 OP $e2)
| 'goto' LABEL
-> ^(GOTO LABEL)
| 'if' expr 'goto' LABEL
-> ^(IF expr LABEL)
| 'return' expr
-> ^(RETURN 'return' expr)
;
expr :
IDENT
-> IDENT
| NUM
-> NUM
;
OP : ('+'|'-'|'*'|'/'|'<'|'>'|'==') ;
NUM : '-'?'0'..'9'+ ;
IDENT : 'a'..'z'('a'..'z'|'0'..'9')* ;
LABEL : 'A'..'Z'('A'..'Z'|'0'..'9')* ;
WS : (' '|'\r'|'\n')+ {$channel = HIDDEN;} ;