-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPLang.g4
More file actions
101 lines (78 loc) · 1.79 KB
/
PLang.g4
File metadata and controls
101 lines (78 loc) · 1.79 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// generate java files:
grammar PLang;
// comments
COMMENT : '//' ~[\r\n]* -> skip ;
// arithmetic
MUL : '*' ;
DIV : '/' ;
ADD : '+' ;
SUB : '-' ;
EXP : '^' ;
// logical operators
NEQ : '<>' ;
GTE : '>=' ;
LTE : '<=' ;
GT : '>' ;
LT : '<' ;
EQ : '==' ;
AND : 'and' | '&&' ;
OR : 'or' | '||' ;
// keywords
IF : 'if' ;
ELSE : 'else' ;
LOOP : 'loop' ;
DEF : 'def' ;
// brackets
ROUND_LEFT : '(' ;
ROUND_RIGHT : ')' ;
SQUARE_LEFT : '[' ;
SQUARE_RIGHT : ']' ;
CURLY_LEFT : '{' ;
CURLY_RIGHT : '}' ;
// boolean
TRUE : 'true' ;
FALSE : 'false' ;
// literals
NUMBER : [0-9]+ ('.' [0-9]+)? ;
STRINGLITERAL : '"' ~ ["\r\n]* '"' ;
ID : [a-zA-Z0-9_]+ ;
NEWLINE :'\r'? '\n' -> skip ;
WS : [ \t]+ -> skip ;
SEMI : ';' -> skip ;
SPACE : ' ' -> skip ;
COMMA : ',' ;
program: block EOF;
block : statement* ;
statement
: variable
| variableAssignment
| newVariableAssignment
| if_
| loop
| function
| functionCall
| COMMENT
| NEWLINE; // shouldn't be here.. but it is
stringLiteral : STRINGLITERAL ;
number : NUMBER ;
bool : TRUE | FALSE ;
id : ID ;
funcBlock: CURLY_LEFT block CURLY_RIGHT ;
function: DEF name=id ROUND_LEFT (id (COMMA id)*)? ROUND_RIGHT funcBlock ;
functionCall : id ROUND_LEFT (expr (COMMA expr)*)? ROUND_RIGHT ;
variable : DEF id ;
newVariableAssignment : DEF id '=' expr ;
variableAssignment : id '=' expr ;
// conditionals
if_ : IF expr funcBlock elseIf* else_? ;
elseIf : ELSE IF expr funcBlock ;
else_ : ELSE funcBlock ;
// loops
loop : LOOP expr funcBlock ;
expr
: left=expr op=(MUL | DIV) right=expr
| left=expr op=(ADD | SUB) right=expr
| left=expr op=(LT | LTE | GTE | GT | EQ | NEQ) right=expr
| left=expr op=( AND | OR ) right=expr
| ROUND_LEFT nested=expr ROUND_RIGHT
| bool | number | stringLiteral | id | functionCall ;