Logical and and or is ready to use now.
parent
4b8baa58e6
commit
6721f24be8
|
@ -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()
|
||||
|
|
|
@ -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("="))
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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);
|
||||
>> }
|
||||
*/
|
Loading…
Reference in New Issue