This commit is contained in:
parent
52828a7f0b
commit
a74b520231
|
@ -81,11 +81,11 @@
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1,
|
"lastModified": 1,
|
||||||
"narHash": "sha256-8wkkYGr1dPSnX9oVMX8D6dTOROXKOYpBTKfriA0sEBI=",
|
"narHash": "sha256-8wkkYGr1dPSnX9oVMX8D6dTOROXKOYpBTKfriA0sEBI=",
|
||||||
"path": "/nix/store/7rlwm9hr4df367974cszjpbmjbd36jvn-source/flake.systems.nix",
|
"path": "/nix/store/7v3i06afpf7zfq4cwingjhfhmbc6vbqi-source/flake.systems.nix",
|
||||||
"type": "path"
|
"type": "path"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"path": "/nix/store/7rlwm9hr4df367974cszjpbmjbd36jvn-source/flake.systems.nix",
|
"path": "/nix/store/7v3i06afpf7zfq4cwingjhfhmbc6vbqi-source/flake.systems.nix",
|
||||||
"type": "path"
|
"type": "path"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
44
src/lib.rs
44
src/lib.rs
|
@ -94,7 +94,14 @@ impl Lexer {
|
||||||
} else if c == '/' && self.peek() == Some('/') {
|
} else if c == '/' && self.peek() == Some('/') {
|
||||||
tokens.push(self.consume_comment());
|
tokens.push(self.consume_comment());
|
||||||
} else {
|
} else {
|
||||||
tokens.push(self.consume_symbol());
|
match c {
|
||||||
|
'+' | '-' | '*' | '/' | '%' | '&' | '|' | '^' | '!' | '=' | '<' | '>' | '?' => {
|
||||||
|
tokens.push(self.consume_operator());
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
tokens.push(self.consume_symbol());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tokens.push(Token::EOF);
|
tokens.push(Token::EOF);
|
||||||
|
@ -176,6 +183,11 @@ impl Lexer {
|
||||||
self.advance();
|
self.advance();
|
||||||
Token::Symbol(symbol)
|
Token::Symbol(symbol)
|
||||||
}
|
}
|
||||||
|
fn consume_operator(&mut self) -> Token {
|
||||||
|
let operator = self.current_char.unwrap();
|
||||||
|
self.advance();
|
||||||
|
Token::Operator(operator.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
fn error(&self, message: &str) -> ! {
|
fn error(&self, message: &str) -> ! {
|
||||||
panic!("Lexer error at position {}: {}", self.position, message);
|
panic!("Lexer error at position {}: {}", self.position, message);
|
||||||
|
@ -266,6 +278,34 @@ mod tests {
|
||||||
assert_eq!(tokens, vec![Token::FloatLiteral(123.45), Token::EOF]);
|
assert_eq!(tokens, vec![Token::FloatLiteral(123.45), Token::EOF]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_operator() {
|
||||||
|
init();
|
||||||
|
let source = "+-*/%&|^!=<>?";
|
||||||
|
let mut lexer = Lexer::new(source);
|
||||||
|
let tokens = lexer.get_tokens();
|
||||||
|
info!("[Operator] Tokens: {:#?}", tokens);
|
||||||
|
assert_eq!(
|
||||||
|
tokens,
|
||||||
|
vec![
|
||||||
|
Token::Operator("+".to_string()),
|
||||||
|
Token::Operator("-".to_string()),
|
||||||
|
Token::Operator("*".to_string()),
|
||||||
|
Token::Operator("/".to_string()),
|
||||||
|
Token::Operator("%".to_string()),
|
||||||
|
Token::Operator("&".to_string()),
|
||||||
|
Token::Operator("|".to_string()),
|
||||||
|
Token::Operator("^".to_string()),
|
||||||
|
Token::Operator("!".to_string()),
|
||||||
|
Token::Operator("=".to_string()),
|
||||||
|
Token::Operator("<".to_string()),
|
||||||
|
Token::Operator(">".to_string()),
|
||||||
|
Token::Operator("?".to_string()),
|
||||||
|
Token::EOF,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_single_line_comment() {
|
fn test_single_line_comment() {
|
||||||
init();
|
init();
|
||||||
|
@ -317,7 +357,7 @@ mod tests {
|
||||||
Token::Whitespace,
|
Token::Whitespace,
|
||||||
Token::Identifier("gl_FragColor".to_string()),
|
Token::Identifier("gl_FragColor".to_string()),
|
||||||
Token::Whitespace,
|
Token::Whitespace,
|
||||||
Token::Symbol('='),
|
Token::Operator('='.to_string()),
|
||||||
Token::Whitespace,
|
Token::Whitespace,
|
||||||
Token::Identifier("vec4".to_string()),
|
Token::Identifier("vec4".to_string()),
|
||||||
Token::Symbol('('),
|
Token::Symbol('('),
|
||||||
|
|
Loading…
Reference in a new issue