-
Notifications
You must be signed in to change notification settings - Fork 3
/
FishLanguage.g4
71 lines (69 loc) · 1.94 KB
/
FishLanguage.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
grammar FishLanguage;
program : mainBlock (functions)*;
mainBlock : 'startFISH' statements+ 'endFISH';
statements : (assignmentStatement
| ifStatement
| loopStatement
| writeStatement
| declarationStatement
| readStatement
| functionCallStatement
| returnStatement);
declarationStatement : DOLLAR IDENTIFIER;
functions : 'fun' FUNCNAME LBRACE parameters RBRACE ':' statements+ 'endfun';
parameters : (DOLLAR IDENTIFIER) (',' parameters)?;
functionCallStatement : FUNCNAME LBRACE arguments RBRACE;
arguments : (expression) (','arguments)?;
returnStatement : 'return' expression;
assignmentStatement : IDENTIFIER ASSIGNMENT expression;
ifStatement : ifBlock (elseBlock)? 'endif';
ifBlock : 'if' LBRACE booleanExpression RBRACE ':' statements+ ;
elseBlock : 'else' ':' statements+;
loopStatement : 'loop' LBRACE booleanExpression RBRACE ':' statements+ 'endloop';
writeStatement : 'write' expression
| 'write' STRING
| 'write' booleanExpression;
readStatement : 'read' IDENTIFIER;
booleanExpression: expression EQUALS expression
| expression GTE expression
| expression LTE expression
| expression NE expression
| expression GT expression
| expression LT expression
| expression AND expression
| expression OR expression
| BOOLEAN;
expression : expression (MULTIPLY|DIVIDE|MOD) expression
| expression (ADD|SUBTRACT) expression
| NUMBER
| BOOLEAN
| STRING
| IDENTIFIER
| REAL
| functionCallStatement
| LBRACE expression RBRACE;
BOOLEAN : 'True'
| 'False';
SUBTRACT : '-';
NUMBER : [-]?[0-9]+;
REAL : [-]?[0-9]+[.][0-9]+;
IDENTIFIER : [a-z]+;
DOLLAR : '$';
ASSIGNMENT : '=';
MULTIPLY : '*';
DIVIDE : '/';
MOD : '%';
ADD : '+';
LBRACE : '(';
RBRACE : ')';
EQUALS : '==';
GTE : '>=';
LTE : '<=';
NE : '!=';
GT : '>';
LT : '<';
AND : '&&';
STRING : ["][ a-zA-Z:=><+*/%!\-]+["];
OR : '||';
FUNCNAME : [A-Z]+;
NEWLINE : [ \n\t\r] -> skip;