From 2d8f697f736e14289ad1b1949882770aae36b46a Mon Sep 17 00:00:00 2001 From: Martin Araneda Date: Tue, 8 Nov 2022 22:27:26 -0300 Subject: [PATCH] changes to parser --- src/parser.cpp | 127 +++++++++++++++++++++++++++++++++++++++++++++++++ src/parser.h | 6 +++ 2 files changed, 133 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index 9c783b5..22b2ef7 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -3,6 +3,9 @@ #include "ast/variable_expression_ast.h" #include "parser.h" +#include +#include + obelisk::Parser::Parser() { lexer_ = new obelisk::Lexer(); @@ -223,3 +226,127 @@ std::unique_ptr obelisk::Parser::parseExtern() getNextToken(); return parsePrototype(); } + +std::unique_ptr obelisk::Parser::parseAction() +{ + //action(is "dangerous" then "avoid" or "ignore"); + getNextToken(); + if (getCurrentToken() != '(') + { + // TODO: throw an error + } +} + +std::unique_ptr obelisk::Parser::parseRule() +{ + //rule("player" can "die" if "enemy1" is "dangerous"); + getNextToken(); + if (getCurrentToken() != '(') + { + // TODO: throw an error + } + while (true) //left side of Rule + { + getNextToken(); + if (getCurrentToken() != '"') + { + //TODO: throw an error + } + + /*if (getCurrentToken() == ')') // TODO: break if not string and not "and" + { + // TODO: save the verb + break; + }*/ + } + while (true) //right side of Ruke + { + getNextToken(); + if (getCurrentToken() != '"') + { + //TODO: throw an error + } + + if (getCurrentToken() == ')') + { + // TODO: save the verb + break; + } + } +} + +// fact("chris cromer" and "martin" and "Isabella" can "program" and "speak english"); +// fact("" and "martin") +std::unique_ptr obelisk::Parser::parseFact() +{ + std::stack syntax; + + getNextToken(); + if (getCurrentToken() != '(') + { + // TODO: throw an error + } + + syntax.push('('); + + // (" + + bool getEntity {true}; + std::vector leftEntities; + std::string entityName {""}; + getNextToken(); + while (true) //left side of fact + { + if (getEntity) + { + if (getCurrentToken() == '"') + { + if (syntax.top() != '"') + { + // open a double quote + syntax.push('"'); + } + else if (syntax.top() == '"') + { + // close a double quote + syntax.pop(); + leftEntities.push_back(entityName); + entityName = ""; + getEntity = false; + } + } + + if (syntax.top() == '"') + { + if (entityName != "") + { + entityName += " "; + } + entityName += getLexer()->getIdentifier(); + } + getNextToken(); + } + else + { + // and + } + + /*if (getCurrentToken() == ')') // TODO: break if not string and not "and" + { + // TODO: save the verb + break; + }*/ + } +} + +void handleAction() +{ +} + +void handleRule() +{ +} + +void handleFact() +{ +} diff --git a/src/parser.h b/src/parser.h index 2a00bbc..b2bf43b 100644 --- a/src/parser.h +++ b/src/parser.h @@ -32,6 +32,9 @@ namespace obelisk std::unique_ptr parseDefinition(); std::unique_ptr parseTopLevelExpression(); std::unique_ptr parseExtern(); + std::unique_ptr parseAction(); + std::unique_ptr parseRule(); + std::unique_ptr parseFact(); public: Parser(); @@ -47,6 +50,9 @@ namespace obelisk void handleDefinition(); void handleExtern(); void handleTopLevelExpression(); + void handleAction(); + void handleRule(); + void handleFact(); }; } // namespace obelisk