Skip to content

Commit 0c6e380

Browse files
committed
Added % operator
1 parent ae1a681 commit 0c6e380

File tree

4 files changed

+30
-10
lines changed

4 files changed

+30
-10
lines changed

framec/src/frame_c/ast.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2734,6 +2734,8 @@ pub enum OperatorType {
27342734
LogicalOr,
27352735
LogicalXor,
27362736
Negated,
2737+
Percent,
2738+
Unknown,
27372739
}
27382740

27392741
impl NodeElement for OperatorType {
@@ -2764,7 +2766,8 @@ impl OperatorType {
27642766
TokenType::LogicalAnd => OperatorType::LogicalAnd,
27652767
TokenType::PipePipe => OperatorType::LogicalOr,
27662768
TokenType::LogicalXor => OperatorType::LogicalXor,
2767-
_ => panic!("Invalid token for operator."),
2769+
TokenType::Percent => OperatorType::Percent,
2770+
_ => OperatorType::Unknown,
27682771
}
27692772
}
27702773
}

framec/src/frame_c/parser.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4949,7 +4949,7 @@ impl<'a> Parser<'a> {
49494949
while self.match_token(&[TokenType::BangEqual, TokenType::EqualEqual]) {
49504950
// let line = self.previous().line;
49514951
let operator_token = self.previous();
4952-
let op_type = OperatorType::get_operator_type(&operator_token.token_type);
4952+
let op_type = self.get_operator_type(&operator_token.clone());
49534953
let r_value = match self.comparison() {
49544954
Ok(Some(expr_type)) => expr_type,
49554955
Ok(None) => return Ok(None),
@@ -4988,7 +4988,7 @@ impl<'a> Parser<'a> {
49884988
TokenType::LessEqual,
49894989
]) {
49904990
let operator_token = self.previous();
4991-
let op_type = OperatorType::get_operator_type(&operator_token.token_type);
4991+
let op_type = self.get_operator_type(&operator_token.clone());
49924992
let r_value = match self.term() {
49934993
Ok(Some(expr_type)) => expr_type,
49944994
Ok(None) => return Ok(None),
@@ -5020,9 +5020,9 @@ impl<'a> Parser<'a> {
50205020
Err(parse_error) => return Err(parse_error),
50215021
};
50225022

5023-
while self.match_token(&[TokenType::Dash, TokenType::Plus]) {
5023+
while self.match_token(&[TokenType::Dash, TokenType::Plus, TokenType::Percent]) {
50245024
let operator_token = self.previous().clone();
5025-
let op_type = OperatorType::get_operator_type(&operator_token.token_type);
5025+
let op_type = self.get_operator_type(&operator_token.clone());
50265026
let r_value = match self.factor() {
50275027
Ok(Some(expr_type)) => expr_type,
50285028
Ok(None) => {
@@ -5065,7 +5065,7 @@ impl<'a> Parser<'a> {
50655065

50665066
while self.match_token(&[TokenType::ForwardSlash, TokenType::Star]) {
50675067
let operator_token = self.previous();
5068-
let op_type = OperatorType::get_operator_type(&operator_token.token_type);
5068+
let op_type = self.get_operator_type(&operator_token.clone());
50695069
let r_value = match self.logical_xor() {
50705070
Ok(Some(expr_type)) => expr_type,
50715071
Ok(None) => return Ok(None),
@@ -5090,7 +5090,7 @@ impl<'a> Parser<'a> {
50905090

50915091
while self.match_token(&[TokenType::LogicalXor]) {
50925092
let operator_token = self.previous();
5093-
let op_type = OperatorType::get_operator_type(&operator_token.token_type);
5093+
let op_type = self.get_operator_type(&operator_token.clone());
50945094
let r_value = match self.logical_or() {
50955095
Ok(Some(expr_type)) => expr_type,
50965096
Ok(None) => return Ok(None),
@@ -5124,7 +5124,7 @@ impl<'a> Parser<'a> {
51245124

51255125
while self.match_token(&[TokenType::PipePipe]) {
51265126
let operator_token = self.previous();
5127-
let op_type = OperatorType::get_operator_type(&operator_token.token_type);
5127+
let op_type = self.get_operator_type(&operator_token.clone());
51285128
let r_value = match self.logical_and() {
51295129
Ok(Some(expr_type)) => expr_type,
51305130
Ok(None) => return Ok(None),
@@ -5158,7 +5158,7 @@ impl<'a> Parser<'a> {
51585158

51595159
while self.match_token(&[TokenType::LogicalAnd]) {
51605160
let operator_token = self.previous();
5161-
let op_type = OperatorType::get_operator_type(&operator_token.token_type);
5161+
let op_type = self.get_operator_type(&operator_token.clone());
51625162
let r_value = match self.unary_expression() {
51635163
Ok(Some(expr_type)) => expr_type,
51645164
Ok(None) => return Ok(None),
@@ -5331,7 +5331,7 @@ impl<'a> Parser<'a> {
53315331
fn unary_expression(&mut self) -> Result<Option<ExprType>, ParseError> {
53325332
if self.match_token(&[TokenType::Bang, TokenType::Dash]) {
53335333
let token = self.previous();
5334-
let mut operator_type = OperatorType::get_operator_type(&token.token_type);
5334+
let mut operator_type = self.get_operator_type(&token.clone());
53355335
if operator_type == OperatorType::Minus {
53365336
// change this so the code gen doesn't have a space between the - and ID
53375337
// -x rather than - x
@@ -8072,4 +8072,15 @@ impl<'a> Parser<'a> {
80728072
Ok(())
80738073
}
80748074
}
8075+
8076+
// ------------------------------------------------------------------ */
8077+
pub fn get_operator_type(&mut self, operator_token: &Token) -> OperatorType {
8078+
let op_type = OperatorType::get_operator_type(&operator_token.token_type);
8079+
if op_type == OperatorType::Unknown {
8080+
let err_msg = &format!("Unknown operator {}", operator_token.lexeme);
8081+
self.error_at_current(err_msg);
8082+
}
8083+
8084+
op_type
8085+
}
80758086
}

framec/src/frame_c/scanner.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ impl Scanner {
388388
self.add_token(TokenType::Dot);
389389
}
390390
}
391+
'%' => self.add_token(TokenType::Percent),
391392
',' => self.add_token(TokenType::Comma),
392393
_ => {
393394
if self.is_digit(c) {
@@ -708,6 +709,7 @@ pub enum TokenType {
708709
GreaterEqual, // >=
709710
LessEqual, // <=
710711
LT, // <
712+
Percent, // %
711713
// LTx2, // <<
712714
// LTx3, // <<<
713715
Ampersand, // &

framec/src/frame_c/visitors/python_visitor.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5380,6 +5380,8 @@ impl AstVisitor for PythonVisitor {
53805380
OperatorType::LogicalAnd => self.add_code(" and "),
53815381
OperatorType::LogicalOr => self.add_code(" or "),
53825382
OperatorType::LogicalXor => self.add_code(" ^ "),
5383+
OperatorType::Percent => self.add_code(" % "),
5384+
OperatorType::Unknown => self.add_code(" <Unknown> "),
53835385
}
53845386
}
53855387

@@ -5402,6 +5404,8 @@ impl AstVisitor for PythonVisitor {
54025404
OperatorType::LogicalAnd => output.push_str(" and "),
54035405
OperatorType::LogicalOr => output.push_str(" or "),
54045406
OperatorType::LogicalXor => output.push_str(" ^ "),
5407+
OperatorType::Percent => output.push_str(" % "),
5408+
OperatorType::Unknown => output.push_str(" <Unknown> "),
54055409
}
54065410
}
54075411
}

0 commit comments

Comments
 (0)