diff options
| author | Miquel Sabaté Solà <mikisabate@gmail.com> | 2025-01-16 14:12:11 +0100 |
|---|---|---|
| committer | Miquel Sabaté Solà <mikisabate@gmail.com> | 2025-01-16 14:12:11 +0100 |
| commit | 9261588dcaa10aac0a9b8b7a81ff70a621cf1551 (patch) | |
| tree | 2f58d0889a3bc84c6fd6829ef1fce56f880d8791 /lib/xixanta/src/parser.rs | |
| parent | e7d815c73701377ad3f370e5e5e2b3296627a7ae (diff) | |
| download | tools.nes-9261588dcaa10aac0a9b8b7a81ff70a621cf1551.tar.gz tools.nes-9261588dcaa10aac0a9b8b7a81ff70a621cf1551.zip | |
Add boolean operators
Allow for expressions that evaluate to a boolean expression. This in
turn mean that the value is just set to 0 or 1 depending on the given
condition. As with other assemblers, only a value of 0 evaluates to 0,
and others go to 1. So, something like "1 && 2" evaluates to 1 even if
it doesn't make much sense at first glance (as an assembler we just
assume that the programmer knows what it's doing).
Signed-off-by: Miquel Sabaté Solà <mikisabate@gmail.com>
Diffstat (limited to 'lib/xixanta/src/parser.rs')
| -rw-r--r-- | lib/xixanta/src/parser.rs | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/lib/xixanta/src/parser.rs b/lib/xixanta/src/parser.rs index a91ce8f..5bac127 100644 --- a/lib/xixanta/src/parser.rs +++ b/lib/xixanta/src/parser.rs @@ -1032,6 +1032,7 @@ impl Parser { '~' => Some(NodeType::Operation(OperationType::BitwiseNot)), '<' => Some(NodeType::Operation(OperationType::LoByte)), '>' => Some(NodeType::Operation(OperationType::HiByte)), + '!' => Some(NodeType::Operation(OperationType::LogicalNot)), _ => None, } } @@ -1050,15 +1051,32 @@ impl Parser { '*' => Ok((Some(NodeType::Operation(OperationType::Mul)), 1)), '/' => Ok((Some(NodeType::Operation(OperationType::Div)), 1)), '^' => Ok((Some(NodeType::Operation(OperationType::Xor)), 1)), - '|' => Ok((Some(NodeType::Operation(OperationType::Or)), 1)), - '&' => Ok((Some(NodeType::Operation(OperationType::And)), 1)), + '|' => match second { + '|' => Ok((Some(NodeType::Operation(OperationType::LogicalOr)), 2)), + _ => Ok((Some(NodeType::Operation(OperationType::Or)), 1)), + }, + '&' => match second { + '&' => Ok((Some(NodeType::Operation(OperationType::LogicalAnd)), 2)), + _ => Ok((Some(NodeType::Operation(OperationType::And)), 1)), + }, '<' => match second { '<' => Ok((Some(NodeType::Operation(OperationType::Lshift)), 2)), - _ => Err(self.parser_error(format!("unknown operator '<{}'", second).as_str())), + '>' => Ok((Some(NodeType::Operation(OperationType::NotEqual)), 2)), + '=' => Ok((Some(NodeType::Operation(OperationType::LessEqual)), 2)), + _ => Ok((Some(NodeType::Operation(OperationType::Less)), 1)), }, '>' => match second { '>' => Ok((Some(NodeType::Operation(OperationType::Rshift)), 2)), - _ => Err(self.parser_error(format!("unknown operator '>{}'", second).as_str())), + '=' => Ok((Some(NodeType::Operation(OperationType::GreaterEqual)), 2)), + _ => Ok((Some(NodeType::Operation(OperationType::Greater)), 1)), + }, + '=' => match second { + '=' => Ok((Some(NodeType::Operation(OperationType::Equal)), 2)), + _ => Err(self.parser_error(format!("unknown operator '={}'", second).as_str())), + }, + '!' => match second { + '=' => Ok((Some(NodeType::Operation(OperationType::NotEqual)), 2)), + _ => Err(self.parser_error(format!("unknown operator '!{}'", second).as_str())), }, _ => Ok((None, 0)), } |
