From e3efd57b090cd7fb71f918f7fd90f593c7ba41b7 Mon Sep 17 00:00:00 2001 From: Masato Imai Date: Tue, 23 Aug 2022 10:41:11 +0900 Subject: [PATCH] add CONJ and OR --- src/gpsl/grammar/GpslLexer.g4 | 1 + src/gpsl/grammar/GpslParser.g4 | 2 +- src/gpsl/node.rs | 10 ++++++---- src/gpsl/parser.rs | 4 ++++ src/gpsl/tokenizer.rs | 1 + src/gpsl/vm/gpsl.rs | 18 ++++++++++++++++++ 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/gpsl/grammar/GpslLexer.g4 b/src/gpsl/grammar/GpslLexer.g4 index 3af6968..bf87acd 100644 --- a/src/gpsl/grammar/GpslLexer.g4 +++ b/src/gpsl/grammar/GpslLexer.g4 @@ -13,6 +13,7 @@ MUL: '*' ; DIV: '/' ; CONJ: '&&' ; AND: '&' ; +OR: '||' ; EQ: '=' ; EQEQ: '==' ; NE: '!=' ; diff --git a/src/gpsl/grammar/GpslParser.g4 b/src/gpsl/grammar/GpslParser.g4 index 9de4a88..bc6577c 100644 --- a/src/gpsl/grammar/GpslParser.g4 +++ b/src/gpsl/grammar/GpslParser.g4 @@ -30,7 +30,7 @@ permission: DOLLER LPAREN ( IDENT LBRACKET ( IDENT COMMA? )* RBRACKET COMMA? )* expr: assign ; assign: equality (EQ assign)? ; -equality: relational (EQEQ relational | NE relational | CONJ)* ; +equality: relational (EQEQ relational | NE relational | OR relational | CONJ relational)* ; relational: add (LE add | LT add | BE add | BT add)* ; add: mul (ADD mul | SUB mul | SUB_ASSIGNMENT mul | ADD_ASSIGNMENT mul)* ; mul: unary (MUL unary | DIV unary | DIV_ASSIGNMENT unary | MUL_ASSIGNMENT unary)* ; diff --git a/src/gpsl/node.rs b/src/gpsl/node.rs index 4bab132..cad32cd 100644 --- a/src/gpsl/node.rs +++ b/src/gpsl/node.rs @@ -9,10 +9,12 @@ pub enum NodeKind { SUB, MUL, DIV, - EQ, // == - NE, // != - LT, // < - LE, // <= + CONJ, // && + OR, // || + EQ, // == + NE, // != + LT, // < + LE, // <= } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] diff --git a/src/gpsl/parser.rs b/src/gpsl/parser.rs index e60a55a..348630a 100644 --- a/src/gpsl/parser.rs +++ b/src/gpsl/parser.rs @@ -426,6 +426,10 @@ impl Parser { node = Node::new_node(NodeKind::EQ, node, self.relational()?); } else if self.tokenizer.consume(String::from("!=")) { node = Node::new_node(NodeKind::NE, node, self.relational()?); + } else if self.tokenizer.consume(String::from("&&")) { + node = Node::new_node(NodeKind::CONJ, node, self.relational()?); + } else if self.tokenizer.consume(String::from("||")) { + node = Node::new_node(NodeKind::OR, node, self.relational()?); } else { return Ok(node); } diff --git a/src/gpsl/tokenizer.rs b/src/gpsl/tokenizer.rs index 8bfd3c1..872038c 100644 --- a/src/gpsl/tokenizer.rs +++ b/src/gpsl/tokenizer.rs @@ -132,6 +132,7 @@ impl Tokenizer { String::from(")"), String::from("["), String::from("]"), + String::from("||"), String::from("=="), String::from("!="), String::from(">="), diff --git a/src/gpsl/vm/gpsl.rs b/src/gpsl/vm/gpsl.rs index 654492a..60a5cd3 100644 --- a/src/gpsl/vm/gpsl.rs +++ b/src/gpsl/vm/gpsl.rs @@ -465,6 +465,24 @@ impl GPSL { }, _ => Err("Cannot subtract non-number.".to_string()), }, + NodeKind::CONJ => { + if lhs.extract_number() == Some(1) + && rhs.extract_number() == Some(1) + { + Ok(Some(Variable::Number { value: 1 })) + } else { + Ok(Some(Variable::Number { value: 0 })) + } + } + NodeKind::OR => { + if lhs.extract_number() == Some(1) + || rhs.extract_number() == Some(1) + { + Ok(Some(Variable::Number { value: 1 })) + } else { + Ok(Some(Variable::Number { value: 0 })) + } + } NodeKind::EQ => { if lhs == rhs { Ok(Some(Variable::Number { value: 1 }))