I do tests for evaluating logical expressions. Sadly I enountered
segmentation fault :(.functions
parent
6721f24be8
commit
8ef1eb14c5
|
@ -20,6 +20,7 @@ public:
|
||||||
|
|
||||||
virtual void accept(Visitor * visitor){ visitor->visit(this); };
|
virtual void accept(Visitor * visitor){ visitor->visit(this); };
|
||||||
|
|
||||||
|
virtual SenchaObject evaluate() = 0;
|
||||||
virtual std::string debug() = 0;
|
virtual std::string debug() = 0;
|
||||||
virtual void execute() = 0;
|
virtual void execute() = 0;
|
||||||
virtual ~ASTNode();
|
virtual ~ASTNode();
|
||||||
|
|
|
@ -13,6 +13,7 @@ class ASTStatement : public ASTNode {
|
||||||
public:
|
public:
|
||||||
ASTStatement();
|
ASTStatement();
|
||||||
virtual void execute() = 0;
|
virtual void execute() = 0;
|
||||||
|
virtual SenchaObject evaluate() { return SenchaObject(); }
|
||||||
virtual ~ASTStatement();
|
virtual ~ASTStatement();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,11 @@ void BasicStatement::execute()
|
||||||
child->execute() ;
|
child->execute() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SenchaObject BasicStatement::evaluate()
|
||||||
|
{
|
||||||
|
return children[children.size() - 1]->evaluate();
|
||||||
|
}
|
||||||
|
|
||||||
void BasicStatement::accept(Visitor * visitor)
|
void BasicStatement::accept(Visitor * visitor)
|
||||||
{
|
{
|
||||||
visitor->visit(this);
|
visitor->visit(this);
|
||||||
|
|
|
@ -17,6 +17,7 @@ public:
|
||||||
BasicStatement(ASTNode * parent);
|
BasicStatement(ASTNode * parent);
|
||||||
virtual std::string debug();
|
virtual std::string debug();
|
||||||
void add_expression(ASTExpression * expr);
|
void add_expression(ASTExpression * expr);
|
||||||
|
virtual SenchaObject evaluate();
|
||||||
virtual void execute();
|
virtual void execute();
|
||||||
virtual void accept(Visitor * vistitor);
|
virtual void accept(Visitor * vistitor);
|
||||||
virtual ~BasicStatement();
|
virtual ~BasicStatement();
|
||||||
|
|
|
@ -36,6 +36,11 @@ void ProgramNode::execute_last()
|
||||||
children[children.size() - 1]->execute();
|
children[children.size() - 1]->execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SenchaObject ProgramNode::evaluate_last()
|
||||||
|
{
|
||||||
|
return static_cast<ASTStatement * >(children[children.size() - 1])->evaluate();
|
||||||
|
}
|
||||||
|
|
||||||
std::string ProgramNode::debug()
|
std::string ProgramNode::debug()
|
||||||
{
|
{
|
||||||
std::string debug_note = "Program started debugging\n";
|
std::string debug_note = "Program started debugging\n";
|
||||||
|
|
|
@ -19,6 +19,8 @@ public:
|
||||||
virtual ~ProgramNode();
|
virtual ~ProgramNode();
|
||||||
virtual void execute();
|
virtual void execute();
|
||||||
virtual void execute_last();
|
virtual void execute_last();
|
||||||
|
virtual SenchaObject evaluate() { return evaluate_last(); }
|
||||||
|
SenchaObject evaluate_last();
|
||||||
virtual void accept(Visitor * visitor);
|
virtual void accept(Visitor * visitor);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -16,3 +16,61 @@ TestParser::~TestParser() {
|
||||||
// TODO Auto-generated destructor stub
|
// TODO Auto-generated destructor stub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string TestParser::test_parsing_and_evaluating_logical_expressions()
|
||||||
|
{
|
||||||
|
std::string test_report = "";
|
||||||
|
std::vector<InputOutputPair> logical_inputs = prepare_logical_input();
|
||||||
|
Lexer lexer;
|
||||||
|
Context context;
|
||||||
|
Parser parser(&context);
|
||||||
|
for(auto logical_case : logical_inputs)
|
||||||
|
{
|
||||||
|
auto tokens = lexer.parse_line(logical_case.first);
|
||||||
|
parser.add_tokens(tokens);
|
||||||
|
auto value = parser.program->evaluate();
|
||||||
|
parser.erase_all();
|
||||||
|
muu_assert("Logical value isn't correct", value.truthy == logical_case.second);
|
||||||
|
}
|
||||||
|
return test_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<TestParser::InputOutputPair> TestParser::prepare_logical_input()
|
||||||
|
{
|
||||||
|
std::vector<InputOutputPair> logical_inputs;
|
||||||
|
logical_inputs.push_back(InputOutputPair("false and false", false));
|
||||||
|
logical_inputs.push_back(InputOutputPair("false and true", false));
|
||||||
|
logical_inputs.push_back(InputOutputPair("true and false", false));
|
||||||
|
logical_inputs.push_back(InputOutputPair("true and true", true));
|
||||||
|
logical_inputs.push_back(InputOutputPair("false or false", false));
|
||||||
|
logical_inputs.push_back(InputOutputPair("false or true", true));
|
||||||
|
logical_inputs.push_back(InputOutputPair("true or false", true));
|
||||||
|
logical_inputs.push_back(InputOutputPair("true or true", true));
|
||||||
|
logical_inputs.push_back(InputOutputPair("(true or false) and (true or false)", true));
|
||||||
|
logical_inputs.push_back(InputOutputPair("7 + 2 > 55 or 4-5 == -1", true));
|
||||||
|
|
||||||
|
return logical_inputs;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string TestParser::all_tests()
|
||||||
|
{
|
||||||
|
std::string test_report = "";
|
||||||
|
|
||||||
|
mu_run_test(test_parsing_and_evaluating_logical_expressions);
|
||||||
|
|
||||||
|
|
||||||
|
return test_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*TODO
|
||||||
|
* write test of evaluating logical expression
|
||||||
|
* possible input:
|
||||||
|
*
|
||||||
|
* some variable == "g" and other != "a"
|
||||||
|
*
|
||||||
|
* some easy expression like:
|
||||||
|
* if("aaa" != "bbb" and 2 < 5) {
|
||||||
|
>> print(1);
|
||||||
|
>> } else {
|
||||||
|
>> print(0);
|
||||||
|
>> }
|
||||||
|
*/
|
||||||
|
|
|
@ -9,33 +9,26 @@
|
||||||
#define TESTPARSER_H_
|
#define TESTPARSER_H_
|
||||||
|
|
||||||
#include "TestSuite.h"
|
#include "TestSuite.h"
|
||||||
|
#include "../Lexer.h"
|
||||||
|
#include "../Parser.h"
|
||||||
|
#include "../ASTInspector.h"
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TestParser: public TestSuite {
|
class TestParser: public TestSuite {
|
||||||
public:
|
public:
|
||||||
TestParser();
|
TestParser();
|
||||||
virtual ~TestParser();
|
virtual ~TestParser();
|
||||||
|
typedef std::pair<std::string, bool> InputOutputPair;
|
||||||
|
private:
|
||||||
|
std::string test_parsing_and_evaluating_logical_expressions();
|
||||||
|
|
||||||
|
std::vector<InputOutputPair> prepare_logical_input();
|
||||||
|
|
||||||
|
virtual std::string all_tests();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* TESTPARSER_H_ */
|
#endif /* TESTPARSER_H_ */
|
||||||
|
|
||||||
/*TODO
|
|
||||||
* write test of evaluating logical expression
|
|
||||||
* possible input:
|
|
||||||
* false and false
|
|
||||||
* false and true
|
|
||||||
* true and false
|
|
||||||
* true and true
|
|
||||||
* false or false
|
|
||||||
* false or true
|
|
||||||
* true or false
|
|
||||||
* true or true
|
|
||||||
* 7 + 2 > 55 or 4-5 == -1
|
|
||||||
* some variable == "g" and other != "a"
|
|
||||||
*
|
|
||||||
* some easy expression like:
|
|
||||||
* if("aaa" != "bbb" and 2 < 5) {
|
|
||||||
>> print(1);
|
|
||||||
>> } else {
|
|
||||||
>> print(0);
|
|
||||||
>> }
|
|
||||||
*/
|
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "TestLexer.h"
|
#include "TestLexer.h"
|
||||||
#include "TestASTInspector.h"
|
#include "TestASTInspector.h"
|
||||||
|
#include "TestParser.h"
|
||||||
#include "../Lexer.h"
|
#include "../Lexer.h"
|
||||||
#include "../Parser.h"
|
#include "../Parser.h"
|
||||||
|
|
||||||
|
@ -68,7 +69,8 @@ void run_test_suites()
|
||||||
TestASTInspector test_inspector;
|
TestASTInspector test_inspector;
|
||||||
test_inspector.run_tests();
|
test_inspector.run_tests();
|
||||||
|
|
||||||
|
TestParser test_parser;
|
||||||
|
test_parser.run_tests();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue