-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkmmszarp.g4
128 lines (97 loc) · 3.48 KB
/
kmmszarp.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
grammar kmmszarp;
program : (statement NEWLINE? | NEWLINE)*;
statement
: loopFor
| loopWhile
| conditionalStatement
| conditionalStatementElse
| functionDefinition
| variableDeclaration
| arrayDeclaration
| variableAssignment
| arrayAssignment
| functionCall
;
loopFor :
'pętla' 'zakres' (pureVariableDeclaration | ID) 'od' expression 'do' expression 'początek pętli'
NEWLINE* ((statement NEWLINE) | NEWLINE)*
'koniec pętli';
loopWhile :
'pętla' 'podczas' expression 'początek pętli'
NEWLINE* ((statement NEWLINE) | NEWLINE)*
'koniec pętli';
conditionalStatement :
'jeżeli' expression 'wtedy' 'początek jeżeli'
NEWLINE* (statement NEWLINE)*
'koniec jeżeli';
conditionalStatementElse:
conditionalStatement
(NEWLINE)* 'w przeciwnym wypadku' 'początek jeżeli'
NEWLINE* (statement NEWLINE)*
'koniec jeżeli';
functionDefinition :
'czynność' ID ('parametry' parameterList)? 'zwraca' dtype 'początek czynności'
NEWLINE* (statement NEWLINE)* returnStatement? NEWLINE*?
'koniec czynności';
parameterList : (parameter ('i' parameter)*)?;
parameter : 'zmienna' dtype ID;
returnStatement : 'zwróć' expression;
pureVariableDeclaration
: 'zmienna' dtype ID
;
variableDeclarationWithAssignment
: 'zmienna' dtype ID 'to' expression
;
variableDeclaration
: pureVariableDeclaration
| variableDeclarationWithAssignment
;
arrayDeclaration : 'tablica' dtype ID 'to' arrayValue ('i' arrayValue)* ('o długości' PINT)?;
arrayValue : expression;
variableReference : ID | arrayAccess;
arrayAccess : 'weź' expression 'element' expression;
variableAssignment : ID 'to' expression;
arrayAssignment : 'włóż' expression 'na' expression 'miejsce' expression;
functionCall : 'wywołaj' ID argumentList;
argumentList : ((variableDeclaration|expression) ('i' (variableDeclaration|expression))*)?;
cast : 'rzuć' expression 'na' dtype;
expression
: LPAR expression RPAR # ParenthesizedExpression
| cast # CastExpression
| 'minus' expression # UnaryMinus
| expression op=('razy'|'przez'|'moduł') expression # Multiplication
| expression op=('dodać'|'odjąć') expression # Addition
| expression op=('większe niż'|'mniejsze niż'|'większe lub równe'|'mniejsze lub równe') expression # Comparison
| ('przemień'|'zaneguj'|'nie') expression # Negation
| expression eq=('równe'|'nierówne') expression # Equality
| expression and='oraz' expression # LogicAnd
| expression or='lub' expression # LogicOr
| primary # PrimaryExpression
;
primary
: INT # IntLiteral
| STRING # StringLiteral
| BOOL # BoolLiteral
| variableReference # VariableReferencePrimary
| functionCall # FunctionCallPrimary
;
dtype : 'liczba' | 'napis' | 'prawdziwość' | 'nicość';
EXID : 'odkryj' ID;
ID : ULETTER (ULETTER | DIGIT)*;
INT : DIGIT+;
PINT : DIGIT+;
STRING : 'początek cudzysłowu' ~('\r' | '\n')* 'koniec cudzysłowu';
BOOL : 'prawda' | 'kłamstwo';
LPAR : 'początek nawiasu';
RPAR : 'koniec nawiasu';
WHITESPACE : [ \t]+ -> skip;
NEWLINE: '\r'? '\n';
COMMENT: 'opis' ~[\r\n]* -> skip;
fragment ULETTER
: 'A'..'Z'
| '\u0104' | '\u0106' | '\u0118' | '\u0141' | '\u0143' | '\u00D3' | '\u015A' | '\u0179' | '\u017B';
fragment LETTER
: 'a'..'z' | 'A'..'Z'
| [\u0104-\u0107] | [\u0118-\u0119] | [\u0141-\u0144]
| '\u00D3' | '\u00F3' | '\u015A' | '\u015B' | '\u0179' | '\u017A' | '\u017B' | '\u017C';
fragment DIGIT: '0'..'9';