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
use crate::lexer::*;
use crate::source::buffer::*;
use crate::DiagnosticMessage;
use crate::{lex_states::*, LexState};
impl Lexer {
pub(crate) fn parse_atmark(&mut self, last_state: LexState) -> i32 {
let ptr = self.buffer.pcur;
let mut result: i32 = Self::tIVAR;
let mut c = self.nextc();
self.buffer.ptok = ptr - 1;
self.newtok();
self.tokadd(b'@');
if c == b'@' {
result = Self::tCVAR;
self.tokadd(b'@');
c = self.nextc()
}
self.lex_state.set(if last_state.is_some(EXPR_FNAME) {
EXPR_ENDFN
} else {
EXPR_END
});
if c.is_eof() || !self.is_identchar() {
self.buffer.pushback(c);
if result == Self::tIVAR {
self.compile_error(DiagnosticMessage::IvarWithoutId {}, self.current_loc());
} else {
self.compile_error(DiagnosticMessage::CvarWithoutId {}, self.current_loc());
}
self.lex_state.set(EXPR_END);
return result;
} else if c.is_digit() {
if result == Self::tIVAR {
self.compile_error(
DiagnosticMessage::InvalidIvarName {
c: c.expect("c is a digit"),
},
self.current_loc(),
);
} else {
self.compile_error(
DiagnosticMessage::InvalidCvarName {
c: c.expect("c is a digit"),
},
self.current_loc(),
);
}
self.lex_state.set(EXPR_END);
return result;
}
if self.tokadd_ident(c) {
return Self::END_OF_INPUT;
}
self.tokenize_ident();
result
}
}