diff --git a/Sencha-lang/AST/PostfixExpression.cpp b/Sencha-lang/AST/PostfixExpression.cpp index 5fac1dc..7e3c658 100644 --- a/Sencha-lang/AST/PostfixExpression.cpp +++ b/Sencha-lang/AST/PostfixExpression.cpp @@ -37,31 +37,7 @@ void PostfixExpression::add_argument(ASTExpression * expression) SenchaObject PostfixExpression::evaluate() { - SenchaObject result = SenchaObject(); - if(operation == "call") - return context_manager->execute_function(name, arguments); - else if(operation == "access") - { - SenchaObject called_value = context_manager->get_top()->get(name); - SenchaObject access_index = access_index_expr->execute(); - //std::cout << "index is: " << access_index.repr() << std::endl; - if(access_index.type == SenchaObject::integer_number) - { - if(called_value.type == SenchaObject::string_literal) - { - SenchaArray array(name, context_manager->get_top(), called_value.text); - return array.get(access_index.integer); - } - else - { - SenchaArray array(name, context_manager->get_top()); - return array.get(access_index.integer); - } - } - - } - result.type = SenchaObject::invalid; - return result; + return execute(); } SenchaObject PostfixExpression::execute() { @@ -76,7 +52,8 @@ SenchaObject PostfixExpression::execute() { { if(called_value.type == SenchaObject::string_literal) { - SenchaArray array(name, context_manager->get_top(), called_value.text); + called_value = context_manager->get_top()->get_updated_string(name); + SenchaArray array(name, context_manager, called_value.text); return array.get(access_index.integer); } } diff --git a/Sencha-lang/Elements/SenchaArray.cpp b/Sencha-lang/Elements/SenchaArray.cpp index 1bd004d..be69825 100644 --- a/Sencha-lang/Elements/SenchaArray.cpp +++ b/Sencha-lang/Elements/SenchaArray.cpp @@ -9,12 +9,12 @@ -SenchaArray::SenchaArray(std::string name, Context * context) { +SenchaArray::SenchaArray(std::string name, ContextManager * context_manager) { // TODO Auto-generated constructor stub max_index = 0; - this->context = context; + this->context_manager = context_manager; this->name = name; - context->add(name, SenchaObject()); + context_manager->get_top()->add(name, SenchaObject()); } SenchaArray::~SenchaArray() { @@ -22,10 +22,10 @@ SenchaArray::~SenchaArray() { } -SenchaArray::SenchaArray(std::string name, Context * context, std::string text) +SenchaArray::SenchaArray(std::string name, ContextManager * context_manager, std::string text) { max_index = 0; - this->context = context; + this->context_manager = context_manager; this->name = name; for(unsigned int i = 0; i < text.size(); i++) { @@ -33,7 +33,7 @@ SenchaArray::SenchaArray(std::string name, Context * context, std::string text) std::string letter_string = text.substr(i, 1) ; temp.text = letter_string; temp.type = SenchaObject::string_literal; - context->add("_" + name+ "_" + to_string(i), temp); + context_manager->get_top()->add("_" + name+ "_" + to_string(i), temp); //objects.push_back(temp); } max_index = text.size(); @@ -42,7 +42,7 @@ SenchaArray::SenchaArray(std::string name, Context * context, std::string text) SenchaObject SenchaArray::get(IndexNumber index) { - SenchaObject result = context->get("_" + name +"_" +to_string(index)); + SenchaObject result = context_manager->get_top()->get("_" + name +"_" +to_string(index)); result.name = "_" + name + "_" + to_string(index); return result; //return objects[index]; @@ -50,15 +50,14 @@ SenchaObject SenchaArray::get(IndexNumber index) SenchaArray::IndexNumber SenchaArray::add(SenchaObject value) { - context->add("_" + name+ "_" + to_string(max_index), value); + context_manager->get_top()->add("_" + name+ "_" + to_string(max_index), value); max_index++; - //objects.push_back(value); - max_index = objects.size(); + return max_index; } void SenchaArray::set(IndexNumber index, SenchaObject value) { //objects[index] = value; - context->add("_" + name +"_" +to_string(index), value); + context_manager->get_top()->add("_" + name +"_" +to_string(index), value); } diff --git a/Sencha-lang/Elements/SenchaArray.h b/Sencha-lang/Elements/SenchaArray.h index 43c97a2..d100553 100644 --- a/Sencha-lang/Elements/SenchaArray.h +++ b/Sencha-lang/Elements/SenchaArray.h @@ -9,13 +9,13 @@ #define SENCHAARRAY_H_ #include "SenchaObject.h" #include "Element.h" -#include "../Context.h" +#include "../ContextManager.h" class SenchaArray: public Element { public: - SenchaArray(std::string name, Context * context); - SenchaArray(std::string name, Context * context, std::string); - Context * context; + SenchaArray(std::string name, ContextManager * context_manager); + SenchaArray(std::string name, ContextManager * context_manager, std::string); + ContextManager * context_manager; std::string name; typedef int IndexNumber; diff --git a/Sencha-lang/Examples/example7.se b/Sencha-lang/Examples/example7.se new file mode 100644 index 0000000..f3a46f3 --- /dev/null +++ b/Sencha-lang/Examples/example7.se @@ -0,0 +1,14 @@ +println("I start program by assigning 0 to x"); +x = 0; +println("Then I declare a table, which is not obligatory"); +array t[100]; +println("After that I fill the table like that:"); +while (x < 100) +{ + print("Index: ", x); + t[x] = 3*x; + println(", value: ", t[x]); + x = x + 1; +} + +println("Pretty simple isn't it?"); \ No newline at end of file diff --git a/Sencha-lang/Examples/example8.se b/Sencha-lang/Examples/example8.se new file mode 100644 index 0000000..9274d14 --- /dev/null +++ b/Sencha-lang/Examples/example8.se @@ -0,0 +1,60 @@ +println("Some string manipulation"); + +text = "When I was young, everything was simpler."; + +println("Our text looks like that:"); +println(text); + +x = 0; +while(x < 4) +{ + print(text[x]); + x = x +1; +} + +print("\n"); + +println("We can replace some content of the text, for example \" whatever \" "); + +println("But first, let's try some simple replacement!"); + +text[5] = "M"; +text[3] = "K"; + +println("Now text is: ", text); + +println("Let's define some useful functions for us:"); + +def slice(text, from, to) +{ + bit = ""; + i = from; + while(i < to) + { + bit = bit + text[i]; + i = i + 1; + } + return bit; +} + +println("We defined slice, let\'s try it now!"); + +println(slice(text, 0, 8)); + +println("And some more: ", slice(text, 9, 14)); + +println("Sweet!"); +println("What about replace function?"); + +def replace(text, replacement, start_position, end_position) +{ + prefix = slice(text, 0, start_position); + suffix = slice(text, end_position, len(text)); + result = prefix + replacement + suffix; + return result; +} + +println("It looks pretty simple. Lets replace some text!"); + +println("Original: ", text); +println("After replacement: ", replace(text, "nice", 11, 16)); \ No newline at end of file diff --git a/Sencha-lang/Examples/example9.se b/Sencha-lang/Examples/example9.se new file mode 100644 index 0000000..396871e --- /dev/null +++ b/Sencha-lang/Examples/example9.se @@ -0,0 +1,9 @@ +#some comment +println("x = "); +x = 99; +println(x); +#another comment +println(" - Shouldn't comments be useful?"); #why? + +#If not, what's the point in writing them? +println(" - Aren't they?"); \ No newline at end of file diff --git a/Sencha-lang/Lexer.cpp b/Sencha-lang/Lexer.cpp index 5c8f42c..4c7327b 100644 --- a/Sencha-lang/Lexer.cpp +++ b/Sencha-lang/Lexer.cpp @@ -37,6 +37,12 @@ std::string Lexer::unescape_string(string text) case 't': replacement = '\t'; break; + case '\"': + replacement = '\"'; + break; + case 39: + replacement = '\''; + break; case '[': replacement = 27; break; @@ -103,7 +109,14 @@ pair Lexer::parse_token(string line) for(i=0; i< line.size(); i++) - { + { + if(line[i] == '#') + { + i++; + while(line[i] != '\n' && i < line.size()) i++; + break; + } + if(token_value == "" && isspace(line[i])) continue; if(isdigit(line[i]) || line[i] == '-')