Logical and and or is ready to use now.

functions
Justyna Ilczuk 2012-12-22 17:56:32 +01:00
parent 4b8baa58e6
commit 6721f24be8
5 changed files with 99 additions and 13 deletions

View File

@ -2,14 +2,14 @@
Lexer::Lexer()
{
string keys[] = {"function", "class", "for", "while", "if", "else", "true", "false"};
keywords.assign(keys, keys+8);
string keys[] = {"function", "class", "for", "while", "if", "else", "true", "false", "and", "or"};
keywords.assign(keys, keys+10);
char punct[] = {'.', ',', ';', '{', '}', '[', ']', '(', ')'};
punctuation.assign(punct, punct+9);
string oper[] = {"<", ">", "+", "-", "/", "*", "%", "&", "|", "=", ":", "==", "+=", "-=", "<=", ">=", "!=", "&&", "||"};
operators.assign(oper, oper +19);
string oper[] = {"<", ">", "+", "-", "/", "*", "%", "&", "|", "=", ":", "==", "+=", "-=", "<=", ">=", "!="};
operators.assign(oper, oper +17);
}
Lexer::~Lexer()

View File

@ -367,8 +367,7 @@ ASTExpression * Parser::mul_expr(ASTNode * expression)
}
be->set_right_operand(mul_expr(be));
}
if(be->get_operator() == "")
else
{
ASTExpression * ae;
ae = static_cast<ASTExpression *>(be->children[0]);
@ -398,8 +397,7 @@ ASTExpression * Parser::add_expr(ASTNode * expression)
}
be->set_right_operand(add_expr(be));
}
if(be->get_operator() == "")
else
{
ASTExpression * ae;
ae = static_cast<ASTExpression *>(be->children[0]);
@ -429,8 +427,7 @@ ASTExpression * Parser::rel_expr(ASTNode * expression)
}
be->set_right_operand(rel_expr(be));
}
if(be->get_operator() == "")
else
{
ASTExpression * ae;
ae = static_cast<ASTExpression *>(be->children[0]);
@ -461,8 +458,7 @@ ASTExpression * Parser::eq_expr(ASTNode * expression)
}
be->set_right_operand(eq_expr(be));
}
if(be->get_operator() == "")
else
{
ASTExpression * ae;
ae = static_cast<ASTExpression *>(be->children[0]);
@ -472,13 +468,43 @@ ASTExpression * Parser::eq_expr(ASTNode * expression)
}
return be;
}
ASTExpression * Parser::log_expr(ASTNode * expression)
{
BasicExpression * be = new BasicExpression(expression);
be->set_left_operand(eq_expr(be));
if(peek("and") || peek("or"))
{
if(accept("and"))
{
be->set_operator("&&");
}
else if(accept("or"))
{
be->set_operator("||");
}
be->set_right_operand(log_expr(be));
}
else
{
ASTExpression * ae;
ae = static_cast<ASTExpression *>(be->children[0]);
ae->parent = expression;
delete be;
return ae;
}
return be;
}
ASTExpression * Parser::expr(ASTNode * expression)
{
Assignment * assignment = new Assignment(expression, context);
auto name = tok_value;
ASTExpression * left = eq_expr(assignment);
ASTExpression * left = log_expr(assignment);
if(accept("="))
{

View File

@ -46,6 +46,7 @@ class Parser
ASTStatement * statement(ASTNode * node);
ASTExpression * log_expr(ASTNode * node);
ASTExpression * mul_expr(ASTNode * node);
ASTExpression * add_expr(ASTNode * node);
ASTExpression * prim_expr(ASTNode * node);

View File

@ -0,0 +1,18 @@
/*
* TestParser.cpp
*
* Created on: Dec 22, 2012
* Author: att
*/
#include "TestParser.h"
TestParser::TestParser() {
// TODO Auto-generated constructor stub
}
TestParser::~TestParser() {
// TODO Auto-generated destructor stub
}

View File

@ -0,0 +1,41 @@
/*
* TestParser.h
*
* Created on: Dec 22, 2012
* Author: att
*/
#ifndef TESTPARSER_H_
#define TESTPARSER_H_
#include "TestSuite.h"
class TestParser: public TestSuite {
public:
TestParser();
virtual ~TestParser();
};
#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);
>> }
*/