aboutsummaryrefslogtreecommitdiff
path: root/src/utils.cc
diff options
context:
space:
mode:
authorAdrian Kummerländer2013-10-20 00:10:54 +0200
committerAdrian Kummerländer2013-10-20 00:10:54 +0200
commitcf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7 (patch)
tree02eda2354acb6462977cf9c6babcbd62b446d0e2 /src/utils.cc
parent2b5ed18ae11439897a64708a434e5d7a6edac91e (diff)
downloadSimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar
SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar.gz
SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar.bz2
SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar.lz
SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar.xz
SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar.zst
SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.zip
Implemented constant identifier functionality
* SimpleParser optionally acceps a pointer to an ConstantMap containing string keys mapping to values * Constants are handled in their own ConstantNode class derived from the standard Node class * Operator precedence is now determined separated from the TokenType using a new PrecedenceLevel enum ** Conversion between tokens and their PrecedenceLevel is possible using the new utility function getPrecedence * Added additional test cases for constant identifier resolutions
Diffstat (limited to 'src/utils.cc')
-rw-r--r--src/utils.cc34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/utils.cc b/src/utils.cc
index 4e2ed91..9a081f3 100644
--- a/src/utils.cc
+++ b/src/utils.cc
@@ -12,9 +12,9 @@ TokenType getTokenType(char tmp) {
} else {
switch ( tmp ) {
case '-':
- return TokenType::OPERATOR_PLUS;
- case '+':
return TokenType::OPERATOR_MINUS;
+ case '+':
+ return TokenType::OPERATOR_PLUS;
case '/':
return TokenType::OPERATOR_DIVIDE;
case '*':
@@ -33,6 +33,33 @@ TokenType getTokenType(char tmp) {
}
}
+PrecedenceLevel getPrecedence(TokenType token) {
+ switch ( token ) {
+ case TokenType::VALUE_NUMBER:
+ case TokenType::VALUE_IDENTIFIER: {
+ return PrecedenceLevel::FIRST;
+ }
+ case TokenType::OPERATOR_MINUS:
+ case TokenType::OPERATOR_PLUS: {
+ return PrecedenceLevel::SECOND;
+ }
+ case TokenType::OPERATOR_DIVIDE:
+ case TokenType::OPERATOR_MULTIPLY: {
+ return PrecedenceLevel::THIRD;
+ }
+ case TokenType::OPERATOR_POWER: {
+ return PrecedenceLevel::FOURTH;
+ }
+ case TokenType::PARENTHESES_OPEN:
+ case TokenType::PARENTHESES_CLOSE: {
+ return PrecedenceLevel::FIFTH;
+ }
+ default: {
+ return PrecedenceLevel::FIRST;
+ }
+ }
+}
+
std::vector<std::string> lexer(std::string term) {
std::string tmp;
std::string tmpNumber;
@@ -55,7 +82,8 @@ std::vector<std::string> lexer(std::string term) {
if ( level > 0 ) {
tmp += *termIter;
} else {
- if ( token == TokenType::VALUE_NUMBER ) {
+ if ( token == TokenType::VALUE_NUMBER ||
+ token == TokenType::OPERATOR_MINUS ) {
tmpNumber += *termIter;
} else if ( token == TokenType::VALUE_IDENTIFIER ) {
tmpIdentifier += *termIter;