-
-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathOpenScadLexer.g4
87 lines (67 loc) · 1.44 KB
/
OpenScadLexer.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
lexer grammar OpenScadLexer;
INCLUDE: 'include' [\t ]* '<' -> pushMode(FILE_IMPORT_MODE);
USE: 'use' [\t ]* '<' -> pushMode(FILE_IMPORT_MODE);
ASSERT: 'assert';
ECHO: 'echo';
// operators
ADD : '+';
SUBTRACT : '-';
MULTIPLY : '*';
DIVIDE : '/';
MODULUS : '%';
NOT : '!';
EXPONENTIATE : '^';
EQUAL : '==';
NOT_EQUAL : '!=';
LESS_THAN : '<';
LESS_THAN_OR_EQUAL : '<=';
GREATER_THAN : '>';
GREATER_THAN_OR_EQUAL : '>=';
AND : '&&';
OR : '||';
TERNARY: '?';
COLON: ':';
DOT: '.';
STATEMENT_TERMINATOR: ';';
ASSIGNMENT_OPERATOR: '=';
BLOCK_START: '{';
BLOCK_END: '}';
VECTOR_START: '[' ;
VECTOR_END: ']' ;
OPEN_PAREN: '(';
CLOSE_PAREN: ')';
COMMA: ',';
HASH: '#';
// keywords
BOOLEAN : ('true' | 'false');
UNDEF: 'undef';
IF: 'if';
ELSE: 'else';
FUNCTION: 'function';
MODULE: 'module';
FOR: 'for';
LET: 'let';
EACH: 'each';
INTERSECTION_FOR: 'intersection_for';
IDENTIFIER: '$'?[a-zA-Z_][a-zA-Z0-9_]*;
WS : (' '|'\t'|'\r'|'\n')+ -> skip;
STRING : '"' (~["\\] | EscapeSequence)* '"';
fragment EscapeSequence
: '\\' [btnfr"'\\]
| '\\' ([0-3]? [0-7])? [0-7]
| '\\' 'u'+ HexDigit HexDigit HexDigit HexDigit
;
fragment HexDigit
: [0-9a-fA-F]
;
NUMBER
: ( [0-9]* '.' )? [0-9]+ (( 'e' | 'E' ) ( '+' | '-' )? [0-9]+)?;
BLOCK_COMMENT
: '/*' .*? '*/' -> channel(2)
;
LINE_COMMENT
: '//' ~[\r\n]* -> channel(2)
;
mode FILE_IMPORT_MODE;
END_IMPORT: '>' -> popMode, skip;
PATH_STRING: ~[>]+;