diff options
Diffstat (limited to 'src/utils.cc')
-rw-r--r-- | src/utils.cc | 75 |
1 files changed, 46 insertions, 29 deletions
diff --git a/src/utils.cc b/src/utils.cc index 112bc20..4e2ed91 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -1,36 +1,42 @@ #include "utils.h" +#include "tree.h" #include "exceptions.h" -#include "tree.h" +#include <cctype> namespace SimpleParser { TokenType getTokenType(char tmp) { - switch ( tmp ) { - case '-': - return TokenType::OPERATOR_PLUS; - case '+': - return TokenType::OPERATOR_MINUS; - case '/': - return TokenType::OPERATOR_DIVIDE; - case '*': - return TokenType::OPERATOR_MULTIPLY; - case '^': - return TokenType::OPERATOR_POWER; - case '(': - return TokenType::PARENTHESES_OPEN; - case ')': - return TokenType::PARENTHESES_CLOSE; - case ',': - return TokenType::VALUE_NUMBER; - default: - return TokenType::VALUE_NUMBER; + if ( std::isalpha(tmp) ) { + return TokenType::VALUE_IDENTIFIER; + } else { + switch ( tmp ) { + case '-': + return TokenType::OPERATOR_PLUS; + case '+': + return TokenType::OPERATOR_MINUS; + case '/': + return TokenType::OPERATOR_DIVIDE; + case '*': + return TokenType::OPERATOR_MULTIPLY; + case '^': + return TokenType::OPERATOR_POWER; + case '(': + return TokenType::PARENTHESES_OPEN; + case ')': + return TokenType::PARENTHESES_CLOSE; + case ',': + return TokenType::VALUE_NUMBER; + default: + return TokenType::VALUE_NUMBER; + } } } std::vector<std::string> lexer(std::string term) { std::string tmp; - std::string tmpNum; + std::string tmpNumber; + std::string tmpIdentifier; std::vector<std::string> output; TokenType token; TokenType lastToken; @@ -42,19 +48,28 @@ std::vector<std::string> lexer(std::string term) { termIter++ ) { token = getTokenType(*termIter); - if ( token == TokenType::VALUE_NUMBER || - ( token == TokenType::OPERATOR_MINUS && + if ( token == TokenType::VALUE_NUMBER || + token == TokenType::VALUE_IDENTIFIER || + ( token == TokenType::OPERATOR_MINUS && termIter == term.begin() ) ) { if ( level > 0 ) { tmp += *termIter; } else { - tmpNum += *termIter; + if ( token == TokenType::VALUE_NUMBER ) { + tmpNumber += *termIter; + } else if ( token == TokenType::VALUE_IDENTIFIER ) { + tmpIdentifier += *termIter; + } } } else { - if ( lastToken == TokenType::VALUE_NUMBER && - level == 0 ) { - output.push_back(tmpNum); - tmpNum.clear(); + if ( level == 0 ) { + if ( lastToken == TokenType::VALUE_NUMBER ) { + output.push_back(tmpNumber); + tmpNumber.clear(); + } else if ( lastToken == TokenType::VALUE_IDENTIFIER ) { + output.push_back(tmpIdentifier); + tmpIdentifier.clear(); + } } switch ( token ) { @@ -98,7 +113,9 @@ std::vector<std::string> lexer(std::string term) { } if ( lastToken == TokenType::VALUE_NUMBER ) { - output.push_back(tmpNum); + output.push_back(tmpNumber); + } else if ( lastToken == TokenType::VALUE_IDENTIFIER ) { + output.push_back(tmpIdentifier); } else if ( lastToken != TokenType::PARENTHESES_CLOSE ) { throw operator_exception(); } |