sencha-lang/Sencha-lang/main.cpp

146 lines
3.1 KiB
C++
Raw Permalink Normal View History

2012-12-10 10:45:09 +00:00
#include <fstream>
#include <iostream>
2012-12-10 10:45:09 +00:00
#include <string>
#include <math.h>
#include "Token.h"
#include "Lexer.h"
#include "Parser.h"
#include "Tests/TestLexer.h"
#include "ContextManager.h"
#include "ASTInspector.h"
2012-12-22 11:20:23 +00:00
#include "Tests/tests.h"
2013-01-13 16:36:38 +00:00
#include "basic_native_functions.h"
2012-12-22 11:20:23 +00:00
#include <unistd.h>
using namespace std;
2013-01-13 16:36:38 +00:00
//Helper functions
void register_functions(ContextManager & context_manager)
2012-12-10 10:45:09 +00:00
{
2013-01-13 16:36:38 +00:00
context_manager.context("global")->register_function("print", print);
context_manager.context("global")->register_function("println", println);
context_manager.context("global")->register_function("sin", s_sin);
context_manager.context("global")->register_function("cos", s_cos);
context_manager.context("global")->register_function("tan", s_tan);
context_manager.context("global")->register_function("sleep", sleep);
context_manager.context("global")->register_function("len", len);
2012-12-10 10:45:09 +00:00
}
2013-01-13 16:36:38 +00:00
string compute_indentation(int depth_level)
{
2013-01-13 16:36:38 +00:00
string indent = "";
for(int i=0; i< depth_level; i++)
{
2013-01-13 16:36:38 +00:00
indent += " ";
}
2013-01-13 16:36:38 +00:00
return indent;
}
int how_depth_change(vector<Token> tokens)
{
int change = 0;
2012-12-08 19:59:05 +00:00
for (unsigned int i = 0; i < tokens.size(); i++)
{
if(tokens[i].value == "{") change++;
else if(tokens[i].value == "}") change--;
}
return change;
}
void interactive()
{
2013-01-13 16:36:38 +00:00
//Initialization
Lexer lexer;
2012-12-08 19:59:05 +00:00
ContextManager context_manager;
2013-01-13 16:36:38 +00:00
register_functions(context_manager);
Parser parser(&context_manager);
ASTInspector inspector;
vector<Token> tokens;
2012-11-08 20:16:00 +00:00
string input;
int level_of_depth = 0;
string indentation = "";
2013-01-13 16:36:38 +00:00
//Main loop of interactive mode
2012-11-05 13:17:38 +00:00
while(true)
{
2012-11-08 20:16:00 +00:00
cout << ">> " + indentation;
getline(cin, input);
2012-11-05 13:17:38 +00:00
if(input == "quit()") break;
tokens = lexer.parse_line(input);
level_of_depth += how_depth_change(tokens);
indentation = compute_indentation(level_of_depth);
2012-11-08 20:16:00 +00:00
parser.add_tokens(tokens);
2013-01-13 16:36:38 +00:00
//It executes when statements and braces are closed
if(level_of_depth == 0) {
2012-11-08 20:16:00 +00:00
parser.interpret();
2012-12-09 11:57:51 +00:00
parser.program->execute_last();
inspector.visit(parser.tree.root);
2013-01-10 15:15:43 +00:00
cout << context_manager.get_top()->debug() << endl;
//cout << parser.show_tokens();
cout << inspector.get_report();
inspector.forget_everything();
2012-11-08 20:16:00 +00:00
}
}
}
2013-01-13 16:36:38 +00:00
void execute_script(std::string name )
{
Lexer lexer;
ContextManager context_manager;
register_functions(context_manager);
Parser parser(&context_manager);
vector<Token> tokens;
string line;
ifstream input_file (name);
if (input_file.is_open())
{
while ( input_file.good() )
{
getline (input_file,line);
tokens = lexer.parse_line(line);
parser.add_tokens(tokens);
}
input_file.close();
}
parser.interpret();
parser.program->execute();
}
/**
* Main function resolves in which mode user want to run program
* Modes are:
* Interactive - it is run when no arguments are provided
* Tests - "SenchaLang --test"
* Script execution - if path provided
*/
int main(int argc, char *argv[])
{
if(argc <= 1)
{
2013-01-13 16:36:38 +00:00
cout << "Sencha-lang interpreter, version 0.44" << endl;
interactive();
}
else
{
std::string argument1 = argv[1];
2013-01-13 16:36:38 +00:00
if(argument1 == "--test")
{
cout << "I'm running tests" << endl;
run_tests();
}
else {
2013-01-13 16:36:38 +00:00
execute_script(argument1);
}
}
return 0;
}