aboutsummaryrefslogtreecommitdiff
path: root/src/utils.cc
diff options
context:
space:
mode:
authorAdrian Kummerländer2013-10-19 19:35:16 +0200
committerAdrian Kummerländer2013-10-19 19:35:16 +0200
commit754cc721222ccb01acc4d93ffd8f88f172a0cdd0 (patch)
treef386f8bbf9c6909c6d7a965bdb66ddd2b99ac65f /src/utils.cc
parentaca18e1803b3d54e6c9d7444e8b9c1bf09d12f52 (diff)
downloadSimpleParser-754cc721222ccb01acc4d93ffd8f88f172a0cdd0.tar
SimpleParser-754cc721222ccb01acc4d93ffd8f88f172a0cdd0.tar.gz
SimpleParser-754cc721222ccb01acc4d93ffd8f88f172a0cdd0.tar.bz2
SimpleParser-754cc721222ccb01acc4d93ffd8f88f172a0cdd0.tar.lz
SimpleParser-754cc721222ccb01acc4d93ffd8f88f172a0cdd0.tar.xz
SimpleParser-754cc721222ccb01acc4d93ffd8f88f172a0cdd0.tar.zst
SimpleParser-754cc721222ccb01acc4d93ffd8f88f172a0cdd0.zip
POC: alphabetic constants
* New priority for alphabetic characters * Overloaded OperandNode constructor * Currently not usable, only basic proof of concept
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 7457ae2..8914166 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 {
int8_t getPriority(char tmp) {
- switch ( tmp ) {
- case '-':
- return 10;
- case '+':
- return 10;
- case '/':
- return 20;
- case '*':
- return 20;
- case '^':
- return 30;
- case '(':
- return 90;
- case ')':
- return 90;
- case ',':
- return -1;
- default:
- return -1;
+ if ( std::isalpha(tmp) ) {
+ return 100;
+ } else {
+ switch ( tmp ) {
+ case '-':
+ return 10;
+ case '+':
+ return 10;
+ case '/':
+ return 20;
+ case '*':
+ return 20;
+ case '^':
+ return 30;
+ case '(':
+ return 90;
+ case ')':
+ return 90;
+ case ',':
+ return -1;
+ default:
+ return -1;
+ }
}
}
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;
int8_t priority = 0;
@@ -42,17 +48,26 @@ std::vector<std::string> lexer(std::string term) {
termIter++ ) {
priority = getPriority(*termIter);
- if ( priority == -1 || ( termIter == term.begin() &&
- priority == 10 ) ) {
+ if ( priority == -1 || priority == 100 || ( termIter == term.begin() &&
+ priority == 10 ) ) {
if ( level > 0 ) {
tmp += *termIter;
} else {
- tmpNum += *termIter;
+ if ( priority == -1 ) {
+ tmpNumber += *termIter;
+ } else if ( priority == 100 ) {
+ tmpIdentifier += *termIter;
+ }
}
} else {
- if ( lastPriority == -1 && level == 0 ) {
- output.push_back(tmpNum);
- tmpNum.clear();
+ if ( level == 0 ) {
+ if ( lastPriority == -1 ) {
+ output.push_back(tmpNumber);
+ tmpNumber.clear();
+ } else if ( lastPriority == 100 ) {
+ output.push_back(tmpIdentifier);
+ tmpIdentifier.clear();
+ }
}
switch ( *termIter ) {
@@ -96,12 +111,14 @@ std::vector<std::string> lexer(std::string term) {
}
if ( lastPriority == -1 ) {
- output.push_back(tmpNum);
+ output.push_back(tmpNumber);
+ } else if ( lastPriority == 100 ) {
+ output.push_back(tmpIdentifier);
} else if ( lastPriority != 90 ) {
throw operator_exception();
}
- if (level != 0) {
+ if ( level != 0 ) {
throw parenthese_exception();
}