forked from thufv/CMinor-Verifier
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CMinorLexer.g4
113 lines (96 loc) · 1.85 KB
/
CMinorLexer.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
/*
* This lexer grammar only targets C#.
*/
lexer grammar CMinorLexer;
@header {#pragma warning disable 3021}
@preinclude {
using Antlr4.Runtime;
}
@members {
bool inAnnot = false;
bool inLineAnnot = false;
}
/* --- literals --- */
VOID: 'void';
STRUCT: 'struct';
LPAR: '(';
RPAR: ')';
LBRACE: '{';
RBRACE: '}';
COMMA: ',';
SEMICOLON: ';';
LBRACKET: '[';
RBRACKET: ']';
PERIOD: '.';
INT: 'int';
FLOAT: 'float';
BOOL: 'bool';
IF: 'if';
ELSE: 'else';
BREAK: 'break';
CONTINUE: 'continue';
RETURN: 'return';
WHILE: 'while';
DO: 'do';
FOR: 'for';
ASSIGN: '=';
EQ: '==';
NE: '!=';
LE: '<=';
LT: '<';
GE: '>=';
GT: '>';
ADD: '+';
MINUS: '-';
MUL: '*';
DIV: '/';
NEG: '!';
MOD: '%';
AND: '&&';
OR: '||';
EXPR_TRUE: 'true';
EXPR_FALSE: 'false';
ANNO_TRUE: '\\true';
ANNO_FALSE: '\\false';
RESULT: '\\result';
LENGTH: '\\length';
OLD: '\\old';
WITH: '\\with';
IMPLY: '==>';
EQUIV: '<==>';
XOR: '^^';
FORALL: '\\forall';
EXISTS: '\\exists';
BOOLEAN: 'boolean';
INTEGER: 'integer';
REAL: 'real';
REQUIRES: 'requires';
DECREASES: 'decreases';
ENSURES: 'ensures';
ASSERT: 'assert';
LOOP: 'loop';
INVARIANT: 'invariant';
VARIANT: 'variant';
PREDICATE: 'predicate';
VALID: '\\valid';
APOSTROPHE: '..';
/* --- constants --- */
INT_CONSTANT: [0-9]+;
FLOAT_CONSTANT: [0-9]+ '.' [0-9]+;
IDENT: [a-zA-Z] [a-zA-Z0-9_]*;
/* --- comments --- */
COMMENT: '/*' ('*/' | ~('@') .*? '*/') -> skip;
LINE_COMMENT: '//' ([\r\n] | ~('@') ~[\r\n]*) -> skip;
/* --- annotationss --- */
ANNOT_START: '/*@' { inAnnot = true; };
ANNOT_END: '*/' { inAnnot = false; };
LINE_ANNOT_START: '//@' { inLineAnnot = true; };
/* --- '@' is skipped in annotation --- */
AT: '@' { if (inAnnot || inLineAnnot) Skip(); };
/* --- LINEEND cannot be skipped for line annotation --- */
LINEEND: [\r\n] {
if (inLineAnnot) inLineAnnot = false;
else Skip();
};
/* --- skip white spaces --- */
WS: [ \t\u000C] -> skip;