aboutsummaryrefslogtreecommitdiff
path: root/lib/xixanta/src/parser.rs
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <mikisabate@gmail.com>2025-01-16 14:12:11 +0100
committerMiquel Sabaté Solà <mikisabate@gmail.com>2025-01-16 14:12:11 +0100
commit9261588dcaa10aac0a9b8b7a81ff70a621cf1551 (patch)
tree2f58d0889a3bc84c6fd6829ef1fce56f880d8791 /lib/xixanta/src/parser.rs
parente7d815c73701377ad3f370e5e5e2b3296627a7ae (diff)
downloadtools.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.rs26
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)),
}