diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/parser.hpp | 8 | ||||
-rw-r--r-- | src/parser.cpp | 63 |
2 files changed, 70 insertions, 1 deletions
diff --git a/src/include/parser.hpp b/src/include/parser.hpp index 7bc7997..1399943 100644 --- a/src/include/parser.hpp +++ b/src/include/parser.hpp @@ -5,12 +5,18 @@ * PrimeTerm --> (*|/)Term | Null * Factor --> -Expression | (Expression) | operand */ #pragma once +#include <string> #include "tokenizer.hpp" #include "syntax_tree.hpp" class Parser { private: + // Private attributes. + Tokenizer tokenizer = Tokenizer(); + Token **tokens; + Token *current_token; + // End of private attributes. // Private methods. void parseExpression(); void parsePrimeExpression(); @@ -20,5 +26,5 @@ private: // End of private methods. public: Parser(); - const SyntaxTree *parse(); + const SyntaxTree *parse(const std::string &input); }; diff --git a/src/parser.cpp b/src/parser.cpp new file mode 100644 index 0000000..68c2297 --- /dev/null +++ b/src/parser.cpp @@ -0,0 +1,63 @@ +#include <string> +#include "include/tokenizer.hpp" +#include "include/syntax_tree.hpp" +#include "include/parser.hpp" + +const SyntaxTree *Parser::parse(const std::string &input) { + tokens = tokenizer.tokenize(input); + current_token = tokens[0]; + + return nullptr; +} + +void Parser::parseExpression() { + parseTerm(); + parsePrimeExpression(); +} + +void Parser::parsePrimeExpression() { + if(current_token->type == nil) + return; + + if(current_token->type == sum || current_token->type == substraction) { + ++current_token; + parseExpression(); + } +} + +void Parser::parseTerm() { + parseFactor(); + parsePrimeTerm(); +} + +void Parser::parsePrimeTerm() { + if(current_token->type == nil) + return; + + if(current_token->type == multiplication || + current_token->value == division) { + ++current_token; + parseTerm(); + } +} + +void Parser::parseFactor() { + switch(current_token->type) { + case substraction: + ++current_token; + parseExpression(); + break; + case left_parens: + ++current_token; + parseExpression(); + if(current_token->type != right_parens) + return; + ++current_token; + break; + case operand: + ++current_token; + break; + default: + return; + } +} |