Skip to content

Commit 4b8fe61

Browse files
committed
Implemented parsing differentiation between multiply/dereference and bitwise-and/address-of operators
1 parent e7febd0 commit 4b8fe61

File tree

5 files changed

+49
-34
lines changed

5 files changed

+49
-34
lines changed

Diff for: src/lexer/mod.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,10 @@ impl<T: Text + Send> Lexer<T> {
195195
'*' => {
196196
if self.characters.eat('=') {
197197
Has(TokenKind::MultiplyAssign.at(source))
198-
} else {
198+
} else if self.characters.peek().is_spacing() {
199199
Has(TokenKind::Multiply.at(source))
200+
} else {
201+
Has(TokenKind::Dereference.at(source))
200202
}
201203
}
202204
'/' => {
@@ -240,27 +242,29 @@ impl<T: Text + Send> Lexer<T> {
240242
'~' => Has(TokenKind::BitComplement.at(source)),
241243
'&' => {
242244
if self.characters.eat('=') {
243-
Has(TokenKind::AmpersandAssign.at(source))
245+
Has(TokenKind::BitAndAssign.at(source))
244246
} else if self.characters.eat('&') {
245247
Has(TokenKind::And.at(source))
248+
} else if self.characters.peek().is_spacing() {
249+
Has(TokenKind::BitAnd.at(source))
246250
} else {
247-
Has(TokenKind::Ampersand.at(source))
251+
Has(TokenKind::AddressOf.at(source))
248252
}
249253
}
250254
'|' => {
251255
if self.characters.eat('=') {
252-
Has(TokenKind::PipeAssign.at(source))
256+
Has(TokenKind::BitOrAssign.at(source))
253257
} else if self.characters.eat('|') {
254258
Has(TokenKind::Or.at(source))
255259
} else {
256-
Has(TokenKind::Pipe.at(source))
260+
Has(TokenKind::BitOr.at(source))
257261
}
258262
}
259263
'^' => {
260264
if self.characters.eat('=') {
261-
Has(TokenKind::CaretAssign.at(source))
265+
Has(TokenKind::BitXorAssign.at(source))
262266
} else {
263-
Has(TokenKind::Caret.at(source))
267+
Has(TokenKind::BitXor.at(source))
264268
}
265269
}
266270
',' => Has(TokenKind::Comma.at(source)),

Diff for: src/parser/parse_expr/primary/operator.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
4141
TokenKind::LessThanEq => BasicBinaryOperator::LessThanEq.into(),
4242
TokenKind::GreaterThan => BasicBinaryOperator::GreaterThan.into(),
4343
TokenKind::GreaterThanEq => BasicBinaryOperator::GreaterThanEq.into(),
44-
TokenKind::Ampersand => BasicBinaryOperator::BitwiseAnd.into(),
45-
TokenKind::Pipe => BasicBinaryOperator::BitwiseOr.into(),
46-
TokenKind::Caret => BasicBinaryOperator::BitwiseXor.into(),
44+
TokenKind::BitAnd => BasicBinaryOperator::BitwiseAnd.into(),
45+
TokenKind::BitOr => BasicBinaryOperator::BitwiseOr.into(),
46+
TokenKind::BitXor => BasicBinaryOperator::BitwiseXor.into(),
4747
TokenKind::LeftShift => BasicBinaryOperator::LeftShift.into(),
4848
TokenKind::LogicalLeftShift => BasicBinaryOperator::LogicalLeftShift.into(),
4949
TokenKind::RightShift => BasicBinaryOperator::RightShift.into(),

Diff for: src/parser/parse_stmt/parse_assignment.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
1616
TokenKind::MultiplyAssign => Some(BasicBinaryOperator::Multiply),
1717
TokenKind::DivideAssign => Some(BasicBinaryOperator::Divide),
1818
TokenKind::ModulusAssign => Some(BasicBinaryOperator::Modulus),
19-
TokenKind::AmpersandAssign => Some(BasicBinaryOperator::BitwiseAnd),
20-
TokenKind::PipeAssign => Some(BasicBinaryOperator::BitwiseOr),
21-
TokenKind::CaretAssign => Some(BasicBinaryOperator::BitwiseXor),
19+
TokenKind::BitAndAssign => Some(BasicBinaryOperator::BitwiseAnd),
20+
TokenKind::BitOrAssign => Some(BasicBinaryOperator::BitwiseOr),
21+
TokenKind::BitXorAssign => Some(BasicBinaryOperator::BitwiseXor),
2222
TokenKind::LeftShiftAssign => Some(BasicBinaryOperator::LeftShift),
2323
TokenKind::RightShiftAssign => Some(BasicBinaryOperator::RightShift),
2424
TokenKind::LogicalLeftShiftAssign => Some(BasicBinaryOperator::LogicalLeftShift),

Diff for: src/text/character.rs

+5
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ impl Character {
6161
matches!(self, Character::At('+' | '-', _))
6262
}
6363

64+
#[inline]
65+
pub fn is_spacing(&self) -> bool {
66+
matches!(self, Character::At(' ' | '\n' | '\t', _))
67+
}
68+
6469
#[inline]
6570
pub fn source(&self) -> Source {
6671
match self {

Diff for: src/token.rs

+27-21
Original file line numberDiff line numberDiff line change
@@ -96,25 +96,27 @@ pub enum TokenKind {
9696
Colon,
9797
Hash,
9898
Ellipsis,
99+
AddressOf,
100+
Dereference,
99101
DeclareAssign,
100102
Assign,
101103
AddAssign,
102104
SubtractAssign,
103105
MultiplyAssign,
104106
DivideAssign,
105107
ModulusAssign,
106-
AmpersandAssign,
107-
PipeAssign,
108-
CaretAssign,
108+
BitAndAssign,
109+
BitOrAssign,
110+
BitXorAssign,
109111
LeftShiftAssign,
110112
RightShiftAssign,
111113
LogicalLeftShiftAssign,
112114
LogicalRightShiftAssign,
113115
And,
114116
Or,
115-
Ampersand,
116-
Pipe,
117-
Caret,
117+
BitAnd,
118+
BitOr,
119+
BitXor,
118120
LeftShift,
119121
RightShift,
120122
LogicalLeftShift,
@@ -177,25 +179,27 @@ impl Display for TokenKind {
177179
TokenKind::Colon => f.write_str("':'"),
178180
TokenKind::Hash => f.write_str("'#'"),
179181
TokenKind::Ellipsis => f.write_str("'...'"),
182+
TokenKind::AddressOf => f.write_str("(address of) '&'"),
183+
TokenKind::Dereference => f.write_str("(dereference) '*'"),
180184
TokenKind::DeclareAssign => f.write_str("':='"),
181185
TokenKind::Assign => f.write_str("'='"),
182186
TokenKind::AddAssign => f.write_str("'+='"),
183187
TokenKind::SubtractAssign => f.write_str("'-='"),
184188
TokenKind::MultiplyAssign => f.write_str("'*='"),
185189
TokenKind::DivideAssign => f.write_str("'/='"),
186190
TokenKind::ModulusAssign => f.write_str("'%='"),
187-
TokenKind::AmpersandAssign => f.write_str("'&='"),
188-
TokenKind::PipeAssign => f.write_str("'|='"),
189-
TokenKind::CaretAssign => f.write_str("'^='"),
191+
TokenKind::BitAndAssign => f.write_str("'&='"),
192+
TokenKind::BitOrAssign => f.write_str("'|='"),
193+
TokenKind::BitXorAssign => f.write_str("'^='"),
190194
TokenKind::LeftShiftAssign => f.write_str("'<<='"),
191195
TokenKind::RightShiftAssign => f.write_str("'>>='"),
192196
TokenKind::LogicalLeftShiftAssign => f.write_str("'<<<='"),
193197
TokenKind::LogicalRightShiftAssign => f.write_str("'>>>='"),
194198
TokenKind::And => f.write_str("'&&'"),
195199
TokenKind::Or => f.write_str("'||'"),
196-
TokenKind::Ampersand => f.write_str("'&'"),
197-
TokenKind::Pipe => f.write_str("'|'"),
198-
TokenKind::Caret => f.write_str("'^'"),
200+
TokenKind::BitAnd => f.write_str("'&'"),
201+
TokenKind::BitOr => f.write_str("'|'"),
202+
TokenKind::BitXor => f.write_str("'^'"),
199203
TokenKind::LeftShift => f.write_str("'<<'"),
200204
TokenKind::RightShift => f.write_str("'>>'"),
201205
TokenKind::LogicalLeftShift => f.write_str("'<<<'"),
@@ -234,9 +238,9 @@ impl TokenKind {
234238
TokenKind::GreaterThanEq => 9,
235239
TokenKind::Equals => 8,
236240
TokenKind::NotEquals => 8,
237-
TokenKind::Ampersand => 7,
238-
TokenKind::Caret => 6,
239-
TokenKind::Pipe => 5,
241+
TokenKind::BitAnd => 7,
242+
TokenKind::BitXor => 6,
243+
TokenKind::BitOr => 5,
240244
TokenKind::And => 4,
241245
TokenKind::Or => 3,
242246
TokenKind::DeclareAssign
@@ -245,9 +249,9 @@ impl TokenKind {
245249
| TokenKind::MultiplyAssign
246250
| TokenKind::DivideAssign
247251
| TokenKind::ModulusAssign
248-
| TokenKind::AmpersandAssign
249-
| TokenKind::PipeAssign
250-
| TokenKind::CaretAssign
252+
| TokenKind::BitAndAssign
253+
| TokenKind::BitOrAssign
254+
| TokenKind::BitXorAssign
251255
| TokenKind::LeftShiftAssign
252256
| TokenKind::RightShiftAssign
253257
| TokenKind::LogicalLeftShiftAssign
@@ -286,6 +290,8 @@ impl TokenKind {
286290
| TokenKind::Colon
287291
| TokenKind::Hash
288292
| TokenKind::Ellipsis
293+
| TokenKind::AddressOf
294+
| TokenKind::Dereference
289295
| TokenKind::Namespace
290296
| TokenKind::Extend
291297
| TokenKind::FatArrow => 0,
@@ -300,9 +306,9 @@ impl TokenKind {
300306
| Self::MultiplyAssign
301307
| Self::DivideAssign
302308
| Self::ModulusAssign
303-
| Self::AmpersandAssign
304-
| Self::PipeAssign
305-
| Self::CaretAssign
309+
| Self::BitAndAssign
310+
| Self::BitOrAssign
311+
| Self::BitXorAssign
306312
| Self::LeftShiftAssign
307313
| Self::RightShiftAssign
308314
| Self::LogicalLeftShiftAssign

0 commit comments

Comments
 (0)