From a90cb6dcf56683d7d72ac17bebcc9817b5d0615a Mon Sep 17 00:00:00 2001
From: Jan Travnicek <jan.travnicek@.fit.cvut.cz>
Date: Fri, 22 Nov 2019 12:50:41 +0100
Subject: [PATCH] operators Lexing redesign

---
 alib2cli/src/lexer/Lexer.cpp | 158 ++++++++++++++++++++++++++++++++---
 alib2cli/src/lexer/Lexer.h   |  34 ++++++--
 2 files changed, 177 insertions(+), 15 deletions(-)

diff --git a/alib2cli/src/lexer/Lexer.cpp b/alib2cli/src/lexer/Lexer.cpp
index 732a3b97b0..79c758ac46 100644
--- a/alib2cli/src/lexer/Lexer.cpp
+++ b/alib2cli/src/lexer/Lexer.cpp
@@ -33,13 +33,13 @@ q0:	if ( m_source.getCharacter ( ) == EOF ) {
 		res.m_raw += m_source.getCharacter ( );
 		m_source.advance ( readNextLine );
 		res.m_type = TokenType::LESS_SIGN;
-		return res;
+		goto q10;
 	}
 	if ( m_source.getCharacter ( ) == '>' ) {
 		res.m_raw += m_source.getCharacter ( );
 		m_source.advance ( readNextLine );
 		res.m_type = TokenType::MORE_SIGN;
-		return res;
+		goto q11;
 	}
 	if ( m_source.getCharacter ( ) == '(' ) {
 		res.m_raw += m_source.getCharacter ( );
@@ -93,13 +93,13 @@ q0:	if ( m_source.getCharacter ( ) == EOF ) {
 		res.m_raw += m_source.getCharacter ( );
 		m_source.advance ( readNextLine );
 		res.m_type = TokenType::AMPERSAND_SIGN;
-		return res;
+		goto q8;
 	}
 	if ( m_source.getCharacter ( ) == '|' ) {
 		res.m_raw += m_source.getCharacter ( );
 		m_source.advance ( readNextLine );
 		res.m_type = TokenType::PIPE_SIGN;
-		return res;
+		goto q9;
 	}
 	if ( m_source.getCharacter ( ) == '^' ) {
 		res.m_raw += m_source.getCharacter ( );
@@ -122,8 +122,8 @@ q0:	if ( m_source.getCharacter ( ) == EOF ) {
 	if ( m_source.getCharacter ( ) == '=' ) {
 		res.m_raw += m_source.getCharacter ( );
 		m_source.advance ( readNextLine );
-		res.m_type = TokenType::EQUAL_SIGN;
-		return res;
+		res.m_type = TokenType::ASSIGN_OPERATOR;
+		goto q12;
 	}
 	if ( m_source.getCharacter ( ) == '#' ) {
 		res.m_raw += m_source.getCharacter ( );
@@ -147,7 +147,7 @@ q0:	if ( m_source.getCharacter ( ) == EOF ) {
 		res.m_raw += m_source.getCharacter ( );
 		m_source.advance ( readNextLine );
 		res.m_type = TokenType::PLUS_SIGN;
-		return res;
+		goto q7;
 	}
 	if ( m_source.getCharacter ( ) == '/' ) {
 		res.m_raw += m_source.getCharacter ( );
@@ -171,7 +171,7 @@ q0:	if ( m_source.getCharacter ( ) == EOF ) {
 		res.m_raw += m_source.getCharacter ( );
 		m_source.advance ( readNextLine );
 		res.m_type = TokenType::EXCLAMATION_SIGN;
-		return res;
+		goto q13;
 	}
 	if ( m_source.getCharacter ( ) == '%' ) {
 		res.m_raw += m_source.getCharacter ( );
@@ -230,12 +230,18 @@ q1:	if ( m_source.getCharacter ( ) == '\0' ) {
 		res.m_type = TokenType::INTEGER;
 		return res;
 	}
-
-q2:	if ( m_source.getCharacter ( ) == '\0' ) {
+q2:
+	if ( m_source.getCharacter ( ) == '\0' ) {
 		res.m_value = "";
 		res.m_type = TokenType::MINUS_SIGN;
 		return res;
 	}
+	if ( m_source.getCharacter ( ) == '-' ) {
+		res.m_raw += m_source.getCharacter ( );
+		res.m_value += m_source.getCharacter ( );
+		m_source.advance ( readNextLine );
+		goto q2Prime;
+	}
 	if ( ( m_source.getCharacter ( ) >= '0' && m_source.getCharacter ( ) <= '9' ) ) {
 		res.m_raw += m_source.getCharacter ( );
 		res.m_value += m_source.getCharacter ( );
@@ -260,6 +266,36 @@ q2:	if ( m_source.getCharacter ( ) == '\0' ) {
 	res.m_type = TokenType::MINUS_SIGN;
 	return res;
 
+q2Prime:
+	if ( m_source.getCharacter ( ) == '\0' ) {
+		res.m_value = "";
+		res.m_type = TokenType::DEC_OPERATOR;
+		return res;
+	}
+	if ( ( m_source.getCharacter ( ) >= '0' && m_source.getCharacter ( ) <= '9' ) ) {
+		res.m_raw += m_source.getCharacter ( );
+		res.m_value += m_source.getCharacter ( );
+		m_source.advance ( readNextLine );
+		goto q1;
+	}
+
+	if ( ( m_source.getCharacter ( ) >= 'a' && m_source.getCharacter ( ) <= 'z' )
+	  || ( m_source.getCharacter ( ) >= 'A' && m_source.getCharacter ( ) <= 'Z' )
+	  || ( m_source.getCharacter ( ) == ':' ) ) {
+		res.m_raw += m_source.getCharacter ( );
+		res.m_value += m_source.getCharacter ( );
+		m_source.advance ( readNextLine );
+		goto q3;
+	} else if ( m_source.getCharacter ( ) == '\\' ) {
+		res.m_raw += m_source.getCharacter ( );
+		m_source.advance ( true );
+		goto q3Escape;
+	}
+
+	res.m_value = "";
+	res.m_type = TokenType::DEC_OPERATOR;
+	return res;
+
 q3:	if ( m_source.getCharacter ( ) == '\0' ) {
 		res.m_type = is_kw ( res.m_value );
 		return res;
@@ -350,6 +386,108 @@ q6:	if ( m_source.getCharacter ( ) == '\0' ) {
 		return res;
 	}
 
+q7: if ( m_source.getCharacter ( ) == EOF ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '\0' ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '+' ) {
+		res.m_raw += m_source.getCharacter ( );
+		m_source.advance ( readNextLine );
+		res.m_type = TokenType::INC_OPERATOR;
+	} else {
+		return res;
+	}
+
+q8: if ( m_source.getCharacter ( ) == EOF ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '\0' ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '&' ) {
+		res.m_raw += m_source.getCharacter ( );
+		m_source.advance ( readNextLine );
+		res.m_type = TokenType::AND_OPERATOR;
+	} else {
+		return res;
+	}
+
+q9: if ( m_source.getCharacter ( ) == EOF ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '\0' ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '|' ) {
+		res.m_raw += m_source.getCharacter ( );
+		m_source.advance ( readNextLine );
+		res.m_type = TokenType::OR_OPERATOR;
+	} else {
+		return res;
+	}
+
+q10:
+	if ( m_source.getCharacter ( ) == EOF ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '\0' ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '=' ) {
+		res.m_raw += m_source.getCharacter ( );
+		m_source.advance ( readNextLine );
+		res.m_type = TokenType::LESS_OR_EQUAL_OPERATOR;
+	} else {
+		return res;
+	}
+
+q11:
+	if ( m_source.getCharacter ( ) == EOF ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '\0' ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '=' ) {
+		res.m_raw += m_source.getCharacter ( );
+		m_source.advance ( readNextLine );
+		res.m_type = TokenType::MORE_OR_EQUAL_OPERATOR;
+	} else {
+		return res;
+	}
+
+q12:
+	if ( m_source.getCharacter ( ) == EOF ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '\0' ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '=' ) {
+		res.m_raw += m_source.getCharacter ( );
+		m_source.advance ( readNextLine );
+		res.m_type = TokenType::EQUAL_OPERATOR;
+	} else {
+		return res;
+	}
+
+q13:
+	if ( m_source.getCharacter ( ) == EOF ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '\0' ) {
+		return res;
+	}
+	if ( m_source.getCharacter ( ) == '=' ) {
+		res.m_raw += m_source.getCharacter ( );
+		m_source.advance ( readNextLine );
+		res.m_type = TokenType::NOT_EQUAL_OPERATOR;
+	} else {
+		return res;
+	}
+
 qFile:
 	if ( m_source.getCharacter ( ) == EOF ) {
 		res.m_type = TokenType::EOT;
diff --git a/alib2cli/src/lexer/Lexer.h b/alib2cli/src/lexer/Lexer.h
index 3e796624ec..d373532db9 100644
--- a/alib2cli/src/lexer/Lexer.h
+++ b/alib2cli/src/lexer/Lexer.h
@@ -31,7 +31,9 @@ public:
 		INTEGER,
 		STRING,
 		LESS_SIGN,
+		LESS_OR_EQUAL_OPERATOR,
 		MORE_SIGN,
+		MORE_OR_EQUAL_OPERATOR,
 		LEFT_PAREN,
 		RIGHT_PAREN,
 		LEFT_BRACE,
@@ -41,18 +43,24 @@ public:
 		DOLAR_SIGN,
 		AT_SIGN,
 		AMPERSAND_SIGN,
+		AND_OPERATOR,
 		PIPE_SIGN,
+		OR_OPERATOR,
 		CARET_SIGN,
 		COLON_SIGN,
 		SEMICOLON_SIGN,
 		MINUS_SIGN,
+		DEC_OPERATOR,
 		PLUS_SIGN,
+		INC_OPERATOR,
 		SLASH_SIGN,
 		STAR_SIGN,
 		TYLDE_SIGN,
 		EXCLAMATION_SIGN,
 		PERCENTAGE_SIGN,
-		EQUAL_SIGN,
+		ASSIGN_OPERATOR,
+		EQUAL_OPERATOR,
+		NOT_EQUAL_OPERATOR,
 		HASH_SIGN,
 		COMMA,
 		DOT,
@@ -76,9 +84,13 @@ public:
 		case TokenType::STRING :
 			return "string";
 		case TokenType::LESS_SIGN :
-			return "in_redirect";
+			return "less_sign";
+		case TokenType::LESS_OR_EQUAL_OPERATOR :
+			return "less_or_equal_operator";
 		case TokenType::MORE_SIGN :
-			return "out_redirect";
+			return "more_sign";
+		case TokenType::MORE_OR_EQUAL_OPERATOR :
+			return "more_or_equal_operator";
 		case TokenType::LEFT_PAREN :
 			return "left_paren";
 		case TokenType::RIGHT_PAREN :
@@ -97,8 +109,12 @@ public:
 			return "dolar_sign";
 		case TokenType::AMPERSAND_SIGN :
 			return "ampersand_sign";
+		case TokenType::AND_OPERATOR :
+			return "and_operator";
 		case TokenType::PIPE_SIGN :
 			return "pipe_sign";
+		case TokenType::OR_OPERATOR :
+			return "or_operator";
 		case TokenType::CARET_SIGN :
 			return "caret_sign";
 		case TokenType::COLON_SIGN :
@@ -107,8 +123,12 @@ public:
 			return "semicolon_sign";
 		case TokenType::MINUS_SIGN :
 			return "minus_sign";
+		case TokenType::DEC_OPERATOR :
+			return "dec_operator";
 		case TokenType::PLUS_SIGN :
 			return "plus_sign";
+		case TokenType::INC_OPERATOR :
+			return "inc_operator";
 		case TokenType::SLASH_SIGN :
 			return "slash_sign";
 		case TokenType::STAR_SIGN :
@@ -119,8 +139,12 @@ public:
 			return "exclemation_sign";
 		case TokenType::PERCENTAGE_SIGN :
 			return "percentage_sign";
-		case TokenType::EQUAL_SIGN :
-			return "equal_sign";
+		case TokenType::ASSIGN_OPERATOR :
+			return "assign_operator";
+		case TokenType::EQUAL_OPERATOR :
+			return "equal_operator";
+		case TokenType::NOT_EQUAL_OPERATOR :
+			return "not_equal_operator";
 		case TokenType::HASH_SIGN :
 			return "hash_sign";
 		case TokenType::COMMA :
-- 
GitLab