Bug with passing variables to funcitons resolved.

imports
Justyna Ilczuk 2013-01-01 23:38:10 +01:00
parent 7e4ac66f34
commit 0992a3a67d
15 changed files with 196 additions and 14 deletions

View File

@ -20,15 +20,17 @@ VariableExpression::~VariableExpression() {
SenchaObject VariableExpression::evaluate()
{
auto context = context_manager->get_top();
//std::cout << "I'm retrieving variable " + name + " from " + context->name << std::endl;
SenchaObject result = context->get(name);
//std::cout << "And it's: " + result.repr() << std::endl;
result.name = name;
return result;
}
SenchaObject VariableExpression::execute()
{
SenchaObject result = evaluate();
return result;
return evaluate();
}

View File

@ -35,6 +35,10 @@ SenchaObject ContextManager::execute_function(std::string name, std::vector<ASTE
else if(contexts["global"]->registered_sfunctions.count(name) == 1)
{
std::vector<SenchaObject> evaluated_arguments;
for(auto argument : arguments)
evaluated_arguments.push_back((argument->evaluate()));
SenchaFunction * function = contexts["global"]->registered_sfunctions[name];
std::string name_of_context = create_new_context()->name;
if( arguments.size() != function->names_of_arguments.size())
@ -42,9 +46,13 @@ SenchaObject ContextManager::execute_function(std::string name, std::vector<ASTE
result.type = SenchaObject::invalid;
return result;
}
for(unsigned int i = 0; i < function->names_of_arguments.size(); i++)
get_top()->add(function->names_of_arguments[i], arguments[i]->evaluate());
{
//std::cout << "I'm adding to context " + get_top()->name + " variable of name: " + function->names_of_arguments[i];
//std::cout << "Which should be equal " + evaluated_arguments[i].repr() << std::endl;
get_top()->add(function->names_of_arguments[i], evaluated_arguments[i]);
}
result = (*function)();
pop_context();
destroy_context(name_of_context);

View File

@ -0,0 +1,2 @@
if(true) print("I like bananas");
print(1*77-3);

View File

@ -0,0 +1,2 @@
I like bananas
74

View File

@ -0,0 +1,8 @@
x = 9;
if( x != 9) {
print("dda");
} else if (x == 11) {
print("Lubie banany");
} else {
print(9);
}

View File

@ -0,0 +1 @@
9

View File

@ -0,0 +1,8 @@
x = 1;
repeat(100)
{
print("sin(x) x= ", x, " ", sin(x));
x = x +1;
}
if(x == 101) print("Hurray, success!");

View File

@ -0,0 +1,101 @@
sin(x) x= 1 0.841471
sin(x) x= 2 0.909297
sin(x) x= 3 0.14112
sin(x) x= 4 -0.756802
sin(x) x= 5 -0.958924
sin(x) x= 6 -0.279415
sin(x) x= 7 0.656987
sin(x) x= 8 0.989358
sin(x) x= 9 0.412118
sin(x) x= 10 -0.544021
sin(x) x= 11 -0.99999
sin(x) x= 12 -0.536573
sin(x) x= 13 0.420167
sin(x) x= 14 0.990607
sin(x) x= 15 0.650288
sin(x) x= 16 -0.287903
sin(x) x= 17 -0.961397
sin(x) x= 18 -0.750987
sin(x) x= 19 0.149877
sin(x) x= 20 0.912945
sin(x) x= 21 0.836656
sin(x) x= 22 -0.00885131
sin(x) x= 23 -0.84622
sin(x) x= 24 -0.905578
sin(x) x= 25 -0.132352
sin(x) x= 26 0.762558
sin(x) x= 27 0.956376
sin(x) x= 28 0.270906
sin(x) x= 29 -0.663634
sin(x) x= 30 -0.988032
sin(x) x= 31 -0.404038
sin(x) x= 32 0.551427
sin(x) x= 33 0.999912
sin(x) x= 34 0.529083
sin(x) x= 35 -0.428183
sin(x) x= 36 -0.991779
sin(x) x= 37 -0.643538
sin(x) x= 38 0.296369
sin(x) x= 39 0.963795
sin(x) x= 40 0.745113
sin(x) x= 41 -0.158623
sin(x) x= 42 -0.916522
sin(x) x= 43 -0.831775
sin(x) x= 44 0.0177019
sin(x) x= 45 0.850904
sin(x) x= 46 0.901788
sin(x) x= 47 0.123573
sin(x) x= 48 -0.768255
sin(x) x= 49 -0.953753
sin(x) x= 50 -0.262375
sin(x) x= 51 0.670229
sin(x) x= 52 0.986628
sin(x) x= 53 0.395925
sin(x) x= 54 -0.558789
sin(x) x= 55 -0.999755
sin(x) x= 56 -0.521551
sin(x) x= 57 0.436165
sin(x) x= 58 0.992873
sin(x) x= 59 0.636738
sin(x) x= 60 -0.304811
sin(x) x= 61 -0.966118
sin(x) x= 62 -0.739181
sin(x) x= 63 0.167356
sin(x) x= 64 0.920026
sin(x) x= 65 0.826829
sin(x) x= 66 -0.0265512
sin(x) x= 67 -0.85552
sin(x) x= 68 -0.897928
sin(x) x= 69 -0.114785
sin(x) x= 70 0.773891
sin(x) x= 71 0.951055
sin(x) x= 72 0.253823
sin(x) x= 73 -0.676772
sin(x) x= 74 -0.985146
sin(x) x= 75 -0.387782
sin(x) x= 76 0.566108
sin(x) x= 77 0.99952
sin(x) x= 78 0.513978
sin(x) x= 79 -0.444113
sin(x) x= 80 -0.993889
sin(x) x= 81 -0.629888
sin(x) x= 82 0.313229
sin(x) x= 83 0.968364
sin(x) x= 84 0.73319
sin(x) x= 85 -0.176076
sin(x) x= 86 -0.923458
sin(x) x= 87 -0.821818
sin(x) x= 88 0.0353983
sin(x) x= 89 0.860069
sin(x) x= 90 0.893997
sin(x) x= 91 0.105988
sin(x) x= 92 -0.779466
sin(x) x= 93 -0.948282
sin(x) x= 94 -0.245252
sin(x) x= 95 0.683262
sin(x) x= 96 0.983588
sin(x) x= 97 0.379608
sin(x) x= 98 -0.573382
sin(x) x= 99 -0.999207
sin(x) x= 100 -0.506366
Hurray, success!

View File

@ -0,0 +1,11 @@
y = "I like bananas";
x = 10;
while(x != 20)
{
if(x /2 == 6)
{
print("Oh, it is close to 12 ", x);
}
else print("It is not 12");
x = x +1;
}

View File

@ -0,0 +1,10 @@
It is not 12
It is not 12
Oh, it is close to 12 12
Oh, it is close to 12 13
It is not 12
It is not 12
It is not 12
It is not 12
It is not 12
It is not 12

View File

@ -0,0 +1,17 @@
def compute(old, new, time)
{
return (new - old)/ time;
}
def easy(old) {
return old - 1;
}
old = 100;
new = 120;
time = 4;
println("Old was: ", old, " new is: ", new, " and it changed in: ", time, " seconds" );
println(easy(time));
println(compute(old, new, time));

View File

@ -41,7 +41,6 @@ std::string Lexer::unescape_string(string text)
replacement = 27;
break;
}
}
if(replacement != 0)
{
@ -52,8 +51,6 @@ std::string Lexer::unescape_string(string text)
result.replace(i + offset, 2, replacement_chars);
offset--;
}
}
return result;
}

View File

@ -74,6 +74,16 @@ void Parser::interpret()
bool Parser::peek(string s) {return tok_value == s;}
bool Parser::peek_one_ahead(string s)
{
if(position_in_stream < token_stream.size() - 1)
{
if(s == token_stream[position_in_stream].value)
return true;
}
return false;
}
bool Parser::accept(string s)
{
if(peek(s))
@ -251,11 +261,13 @@ ASTExpression * Parser::prim_expr()
ASTExpression * Parser::postfix_expr()
{
string name = tok_value;
if(is_function_name())
if(current_token.get_type() == t_symbol)
{
PostfixExpression * function_call = new PostfixExpression(name, context_manager);
if(accept("("))
{
if(peek_one_ahead("("))
{
read_next();
read_next();
PostfixExpression * function_call = new PostfixExpression(name, context_manager);
if(!accept(")"))
{
function_call->add_argument(expr());

View File

@ -36,7 +36,8 @@ class Parser
bool in_statement;
bool read_next();
bool peek(string s);
bool peek(string s);
bool peek_one_ahead(string s);
bool accept(string s);
bool expect(string s);
bool is_type();

View File

@ -200,7 +200,7 @@ void interactive()
parser.program->execute_last();
inspector.visit(parser.program);
//cout << parser.show_tokens();
cout << inspector.get_report();
//cout << inspector.get_report();
inspector.forget_everything();
}
}
@ -249,9 +249,11 @@ int main(int argc, char *argv[])
}
input_file.close();
}
ASTInspector inspector;
parser.interpret();
inspector.visit(parser.program);
parser.program->execute();
//cout << inspector.get_report()<< endl;
}
}