aboutsummaryrefslogtreecommitdiff
path: root/src/utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.cc')
-rw-r--r--src/utils.cc75
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();
}