diff options
author | Adrian Kummerländer | 2013-10-20 00:10:54 +0200 |
---|---|---|
committer | Adrian Kummerländer | 2013-10-20 00:10:54 +0200 |
commit | cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7 (patch) | |
tree | 02eda2354acb6462977cf9c6babcbd62b446d0e2 /src/utils.cc | |
parent | 2b5ed18ae11439897a64708a434e5d7a6edac91e (diff) | |
download | SimpleParser-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.cc | 34 |
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; |