-
Notifications
You must be signed in to change notification settings - Fork 0
/
Pascal.g4
105 lines (82 loc) · 2.62 KB
/
Pascal.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
grammar Pascal;
@header {
package ru.ifmo.ctddev.tenishchev.compiler;
}
program : nameOfProg defs block '.';
nameOfProg : 'program' PROGNAME SEMICOLON;
defs : varDef? procDef?;
varDef : 'var' variable SEMICOLON (variable SEMICOLON)*;
variable : VAR (',' VAR)* ':' type;
procDef : (procedure SEMICOLON)*;
procedure : 'procedure' header SEMICOLON body;
header : VAR (LPAREN (variable (SEMICOLON variable)*)* RPAREN)?;
body : (varDef)? block ;
type : 'integer' | 'double' | 'boolean';
block : 'begin' line SEMICOLON? (SEMICOLON line SEMICOLON?)* 'end';
line : ifStatement
| forLoop
| whileLoop
| repeatUntil
| assigment
| methodCall
| block
| read
| write
| writeln
| brk;
methodCall : VAR arguments;
assigment : VAR ':=' expressionLogic;
forLoop : 'for' assigment side expressionLogic step? doWord line; // for i := 1 to i step 5 do
repeatUntil : 'repeat' line ( SEMICOLON line )* untilWord expressionLogic;
whileLoop : 'while' expressionLogic doWord line;
ifStatement : 'if' expressionLogic thenWord line (elseWord line)?;
step : 'step' (VAR | INT);
read : 'read' LPAREN (VAR (',' VAR)*)* RPAREN;
write : 'write' arguments;
writeln : 'writeln' arguments;
brk : 'break' SEMICOLON;
expressionLogic : expressionCompare (('or' | 'and') expressionCompare)*;
expressionCompare : expressionDownArithmetic (op expressionDownArithmetic)*;
expressionDownArithmetic : expressionHighArithmetic ((PLUS | MINUS ) expressionHighArithmetic )*;
expressionHighArithmetic : expressionUnarity ((divWord | MULT | modWord | DIV) expressionUnarity )*;
expressionUnarity : (PLUS | MINUS | 'not') expressionUnarity
| expressionValueEmbeded;
expressionValueEmbeded : VAR
| INT
| DOUBLE
| (TRUE | FALSE)
| LPAREN expressionLogic RPAREN
;
op : LESS_SIGN | LESS_EQUAL | MORE_SIGN | MORE_EQUAL | equals | notEquals;
side : TO | DOWNTO ;
doWord : 'do';
untilWord : 'until';
elseWord : 'else';
thenWord : 'then';
divWord : 'div';
modWord : 'mod';
equals : EQUALS;
notEquals : NOT_EQUAL;
arguments : LPAREN (expressionLogic ( ',' expressionLogic )*)* RPAREN;
PLUS : '+';
MINUS : '-';
MULT : '*';
DIV : '/';
EQUALS : '=';
LPAREN : '(';
RPAREN : ')';
SEMICOLON : ';';
NOT_EQUAL : '<>';
LESS_SIGN : '<';
MORE_SIGN : '>';
LESS_EQUAL : '<=';
MORE_EQUAL : '>=';
TO : 'to';
DOWNTO : 'downto';
TRUE : 'true';
FALSE : 'false';
VAR : [a-z_] [a-z0-9_]*;
PROGNAME : [a-z]+;
INT : ([1-9] [0-9]+) | [0-9];
DOUBLE : ([0-9]+)'.'([0-9]+);
WS : [ \t\r\n]+ -> skip;