Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - n00b

Pages: 1 2 [3] 4
31
I don't think so. The Software in this case is RCBasic interpreter and programs written in RCBasic dialect are not substantial portions of the Software (that would be important pieces of RCBasic interpreter source code), the same way as web page code is not a substantial portion of a browser and code written using Geany is not substantial portion of Geany. You're mixing two separate things here. One is a language as a design, syntax, logic etc. Second is the interpreter of this language. Just look at web browsers situation. The license a browser is distributed under has nothing to do with the license of the HTML/JavaScript code a browser is interpreting.

I kind of see your point.  The reason the MIT license concerned me was really that because it is worded so poorly it can be misinterpreted by anyone.  It is not a concern as long as I am the sole developer because I would be the only one who could enforce it but my hope is that like any other successful open source project, eventually more people contribute to it.  In such a case, new developers contribute code under its current license which means they can expect users to abide by the conditions outlined in the license agreement.  I want any future user to have clearly defined freedom to distribute there programs with the interpreter without the possibility of license infringement.  After reading the zlib license more carefully I think it is the best possible license for this project.

32
I can't believe I missed this. I thought MIT and zlib were identical so I just went with MIT because github had a template for it already.  Thanks.

33
General questions and discussions / Looking for a new License
« on: 05. May 2016, 08:17:15 »
I am getting ready to upload a new release later today with a lot of fixes and improvements.  I have been looking over my current license and I realize that it requires any program written in RCBasic to distribute a copy of the MIT License with it.  Is there a open source license that will allow my users to not have to distribute a license with there works?

34
I finally got a new version up along with linux support.  And I fixed a few bugs in the android port as well.  Check it out at http://www.rcbasic.com.  I am also still working on the BASIC dialect series and should have another video up this weekend.

35
About dialect development / Re: BASIC Dialect from scratch
« on: 23. April 2016, 19:59:03 »
I just uploaded video #4.  In this video I just add more stuff to the parser like AND, OR, XOR, NOT, SHL, SHR, and all the comparison operators.  Here is the link: https://youtu.be/pQs6t9RcI-Q

I could not post the code directly here because of the 20,000 character limit so for all future videos I will attach the source file.

36
About dialect development / Re: BASIC Dialect from scratch
« on: 20. April 2016, 22:19:29 »
I just posted video #3.  In this video I finally start going over getting the parser to parse math expressions as well as strings. Here is the link: https://youtu.be/NtpFWnmq3Do

And here is the final code from this video:
Code: [Select]
#include <iostream>
#include <string>
#include <sstream>
#include <string.h>

using namespace std;

string keywords[]=
{
    "IF",
    "THEN",
    "ELSE",
    "FOR",
    "NEXT",
    "STEP",
    "TO",
    "DO",
    "LOOP",
    "WHILE",
    "UNTIL",
    "WEND",
    "GOTO",
    "DEF",
    "PRINT",
    "INPUT",
    "REM",
    "END"
};

int keyword_count = sizeof(keywords)/sizeof(keywords[0]);

string spChars[]=
{
    "^",
    "&",
    "*",
    "(",
    ")",
    "-",
    "+",
    "=",
    "[",
    "]",
    "\"",
    "<",
    ">",
    ",",
    "/",
    " "
};

int spChar_count = sizeof(spChars)/sizeof(spChars[0]);

string tokens[100];
int token_count = 0;

string vm_asm[2000];
int vm_asm_count = 0;

unsigned char data_segment[5000];
unsigned char code_segment[5000];

int data_offset = 0;
int code_offset = 0;

int m_count = 0;
int s_count = 0;

int m_max = 0;
int s_max = 0;

bool isSpecialCharacter(string c)
{
    for(int i = 0; i < spChar_count; i++)
    {
        if(c.compare(spChars[i])==0)
            return true;
    }
    return false;
}

bool isNumber(string c)
{
    if(c.compare("0")==0 || c.compare("1")==0 || c.compare("2")==0 || c.compare("3")==0 || c.compare("4")==0 ||
       c.compare("5")==0 || c.compare("6")==0 || c.compare("7")==0 || c.compare("8")==0 || c.compare("9")==0)
        return true;
    return false;
}

bool tokenizer(string src_line)
{
    token_count = 0;
    src_line += " ";
    string src_token = "";
    for(int i = 0; i < src_line.length(); i++)
    {
        if(!isSpecialCharacter(src_line.substr(i,1)))
        {
            if(isNumber(src_line.substr(i,1)))
            {
                src_token = "<num>";
                int d = 0;
                for(; i < src_line.length(); i++)
                {
                    if(isNumber(src_line.substr(i,1)))
                    {
                        src_token += src_line.substr(i,1);
                    }
                    else if(src_line.substr(i,1).compare(".")==0)
                    {
                        if(d==0)
                        {
                            src_token += ".";
                            d++;
                        }
                        else
                        {
                            cout << "Can only have one decimal in a number" << endl;
                            return false;
                        }
                    }
                    else if(isSpecialCharacter(src_line.substr(i,1)))
                    {
                        break;
                    }
                    else
                    {
                        return false;
                    }
                }
                tokens[token_count] = src_token;
                token_count++;
                src_token = "";
                i--;
            }
            else
            {
                src_token = "<id>";
                for(; i < src_line.length(); i++)
                {
                    if(isSpecialCharacter(src_line.substr(i,1)))
                        break;
                    else
                        src_token += src_line.substr(i,1);
                }
                tokens[token_count] = src_token;
                token_count++;
                src_token = "";
                i--;
            }
        }
        else if(src_line.substr(i,1).compare("\"")==0)
        {
            //cout << "DEBUG: " << i << endl;
            bool str_close = false;
            src_token = "<string>";
            for(i=i+1; i < src_line.length(); i++)
            {
                if(src_line.substr(i,1).compare("\"")==0)
                {
                    //cout << "someting" << endl;
                    str_close = true;
                    break;
                }
                else
                    src_token += src_line.substr(i,1);
                //cout << "str: " << src_line.substr(i,1) << endl;
            }
            if(str_close == false)
            {
                cout << "Did not close string" << endl;
                return false;
            }
            tokens[token_count] = src_token;
            token_count++;
            src_token = "";
        }
        else if(src_line.substr(i,1).compare("+")==0)
        {
            tokens[token_count] = "<add>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("-")==0)
        {
            tokens[token_count] = "<sub>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("*")==0)
        {
            tokens[token_count] = "<mul>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("/")==0)
        {
            tokens[token_count] = "<div>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("^")==0)
        {
            tokens[token_count] = "<pow>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("(")==0)
        {
            tokens[token_count] = "<par_open>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare(")")==0)
        {
            tokens[token_count] = "<par_close>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("[")==0)
        {
            tokens[token_count] = "<square_open>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("]")==0)
        {
            tokens[token_count] = "<square_close>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("=")==0)
        {
            tokens[token_count] = "<equal>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("&")==0)
        {
            tokens[token_count] = "<amp>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare(",")==0)
        {
            tokens[token_count] = "<sep>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("<")==0)
        {
            tokens[token_count] = "<less>";
            if(src_line.substr(i).length() > 1)
            {
                if(src_line.substr(i,2).compare("<=")==0)
                {
                    tokens[token_count] = "<less_equal>";
                    i++;
                }
                else if(src_line.substr(i,2).compare("<>")==0)
                {
                    tokens[token_count] = "<not_equal>";
                    i++;
                }
            }
            token_count++;
        }
        else if(src_line.substr(i,1).compare(">")==0)
        {
            tokens[token_count] = "<greater>";
            if(src_line.substr(i).length() > 1)
            {
                if(src_line.substr(i,2).compare("<=")==0)
                {
                    tokens[token_count] = "<greater_equal>";
                    i++;
                }
            }
            token_count++;
        }
    }
    return true;
}

string NumToString(double a)
{
    stringstream ss;
    ss << a;
    string str = ss.str();
    return str;
}

bool parse_expression()
{
    for(int i = 0; i < token_count; i++)
    {
        if(tokens[i].substr(0,5).compare("<num>")==0)
        {
            vm_asm[vm_asm_count] = "mov m" + NumToString(m_count) + " " + tokens[i].substr(5);
            vm_asm_count++;
            tokens[i] = "<vm_var>m" + NumToString(m_count);
            m_count++;
        }
        else if(tokens[i].substr(0,8).compare("<string>")==0)
        {
            memcpy(&data_segment[data_offset], tokens[i].substr(8).c_str()+'\0', tokens[i].substr(8).length()+1);
            vm_asm[vm_asm_count] = "mov$ s" + NumToString(s_count) + " @" + NumToString(data_offset);
            vm_asm_count++;
            data_offset += tokens[i].substr(8).length() + 1;
            tokens[i] = "<vm_var>s" + NumToString(s_count);
            s_count++;
        }
    }

    bool parse_loop = true;
    int block_start = 0;
    int block_end = 0;
    int par = 0;
    string arg1 = "";
    string arg2 = "";
    int op_step = 0;
    int op_start = 0;
    int op_end = 0;

    while(parse_loop)
    {
        block_start = 0;
        block_end = 0;
        par = 0;
        for(int i = 0; i < token_count; i++)
        {
            if(tokens[i].compare("<par_open>")==0)
            {
                block_start = i;
                par = 1;
                tokens[i] = "";
            }
            else if(tokens[i].compare("<par_close>")==0)
            {
                if(par == 0)
                {
                    cout << "Cannot close a parenthesis without opening it" << endl;
                    return false;
                }
                par = 2;
                block_end = i;
                tokens[i] = "";
            }
        }
        cout << "ldfjl" << endl;
        if(par == 0)
        {
            block_start = 0;
            block_end = token_count;
            parse_loop = false;
        }
        else if(par == 1)
        {
            cout << "Must close parenthesis" << endl;
            return false;
        }

        //Exponents
        op_step = 0;
        arg1 = "";
        arg2 = "";
        op_start = 0;
        op_end = 0;
        for(int i = block_start; i < block_end; i++)
        {
            if(tokens[i].substr(0,8).compare("<vm_var>")==0)
            {
                if(op_step == 2 && tokens[i].substr(8,1).compare("m")!=0)
                {
                    cout << "Expected number in number expression" << endl;
                    return false;
                }

                if(tokens[i].substr(8,1).compare("m")==0)
                {
                    switch(op_step)
                    {
                        case 0:
                            op_start = i;
                            op_step = 1;
                            arg1 = tokens[i].substr(8);
                            break;
                        case 2:
                            op_end = i;
                            op_step = 3;
                            arg2 = tokens[i].substr(8);
                            break;
                    }
                }
            }
            else if(tokens[i].compare("<pow>")==0)
            {
                if(op_step != 1)
                {
                    cout << "Missing first number in number expression" << endl;
                    return false;
                }
                op_step = 2;
            }
            else if(tokens[i].compare("")!=0)
            {
                op_step = 0;
            }

            if(op_step == 3)
            {
                vm_asm[vm_asm_count] = "pow " + arg1 + " " + arg2;
                vm_asm_count++;

                for(int i = op_start; i <= op_end; i++)
                {
                    tokens[i] = "";
                }
                tokens[op_start] = "<vm_var>" + arg1;
                op_step = 0;
                i = block_start-1;
            }
        }

        //Multiplication and Division
        op_step = 0;
        arg1 = "";
        arg2 = "";
        op_start = 0;
        op_end = 0;
        for(int i = block_start; i < block_end; i++)
        {
            if(tokens[i].substr(0,8).compare("<vm_var>")==0)
            {
                if(op_step == 2 && tokens[i].substr(8,1).compare("m")!=0)
                {
                    cout << "Expected number in number expression" << endl;
                    return false;
                }

                if(tokens[i].substr(8,1).compare("m")==0)
                {
                    switch(op_step)
                    {
                        case 0:
                            op_start = i;
                            op_step = 1;
                            arg1 = tokens[i].substr(8);
                            break;
                        case 2:
                            op_end = i;
                            op_step = 3;
                            arg2 = tokens[i].substr(8);
                            break;
                    }
                }
            }
            else if(tokens[i].compare("<mul>")==0)
            {
                if(op_step != 1)
                {
                    cout << "Missing first number in number expression" << endl;
                    return false;
                }
                op_step = 2;
                vm_asm[vm_asm_count] = "mul ";
            }
            else if(tokens[i].compare("<div>")==0)
            {
                if(op_step != 1)
                {
                    cout << "Missing first number in number expression" << endl;
                    return false;
                }
                op_step = 2;
                vm_asm[vm_asm_count] = "div ";
            }
            else if(tokens[i].compare("")!=0)
            {
                op_step = 0;
            }

            if(op_step == 3)
            {
                vm_asm[vm_asm_count] += arg1 + " " + arg2;
                vm_asm_count++;

                for(int i = op_start; i <= op_end; i++)
                {
                    tokens[i] = "";
                }
                tokens[op_start] = "<vm_var>" + arg1;
                op_step = 0;
                i = block_start-1;
            }
        }

        //Addition and Subtraction
        op_step = 0;
        arg1 = "";
        arg2 = "";
        op_start = 0;
        op_end = 0;
        for(int i = block_start; i < block_end; i++)
        {
            if(tokens[i].substr(0,8).compare("<vm_var>")==0)
            {
                if(op_step == 2 && tokens[i].substr(8,1).compare("m")!=0)
                {
                    cout << "Expected number in number expression" << endl;
                    return false;
                }

                if(tokens[i].substr(8,1).compare("m")==0)
                {
                    switch(op_step)
                    {
                        case 0:
                            op_start = i;
                            op_step = 1;
                            arg1 = tokens[i].substr(8);
                            break;
                        case 2:
                            op_end = i;
                            op_step = 3;
                            arg2 = tokens[i].substr(8);
                            break;
                    }
                }
            }
            else if(tokens[i].compare("<add>")==0)
            {
                if(op_step != 1)
                {
                    cout << "Missing first number in number expression" << endl;
                    return false;
                }
                op_step = 2;
                vm_asm[vm_asm_count] = "add ";
            }
            else if(tokens[i].compare("<sub>")==0)
            {
                if(op_step != 1)
                {
                    cout << "Missing first number in number expression" << endl;
                    return false;
                }
                op_step = 2;
                vm_asm[vm_asm_count] = "sub ";
            }
            else if(tokens[i].compare("")!=0)
            {
                op_step = 0;
            }

            if(op_step == 3)
            {
                vm_asm[vm_asm_count] += arg1 + " " + arg2;
                vm_asm_count++;

                for(int i = op_start; i <= op_end; i++)
                {
                    tokens[i] = "";
                }
                tokens[op_start] = "<vm_var>" + arg1;
                op_step = 0;
                i = block_start-1;
            }
        }

        //Adding Strings
        op_step = 0;
        arg1 = "";
        arg2 = "";
        op_start = 0;
        op_end = 0;
        for(int i = block_start; i < block_end; i++)
        {
            if(tokens[i].substr(0,8).compare("<vm_var>")==0)
            {
                if(op_step == 2 && tokens[i].substr(8,1).compare("s")!=0)
                {
                    cout << "Expected string in string expression" << endl;
                    return false;
                }

                if(tokens[i].substr(8,1).compare("s")==0)
                {
                    switch(op_step)
                    {
                        case 0:
                            op_start = i;
                            op_step = 1;
                            arg1 = tokens[i].substr(8);
                            break;
                        case 2:
                            op_end = i;
                            op_step = 3;
                            arg2 = tokens[i].substr(8);
                            break;
                    }
                }
            }
            else if(tokens[i].compare("<amp>")==0)
            {
                if(op_step != 1)
                {
                    cout << "Missing first string in string expression" << endl;
                    return false;
                }
                op_step = 2;
            }
            else if(tokens[i].compare("")!=0)
            {
                op_step = 0;
            }

            if(op_step == 3)
            {
                vm_asm[vm_asm_count] = "add$ " + arg1 + " " + arg2;
                vm_asm_count++;

                for(int i = op_start; i <= op_end; i++)
                {
                    tokens[i] = "";
                }
                tokens[op_start] = "<vm_var>" + arg1;
                op_step = 0;
                i = block_start-1;
            }
        }
    }
    return true;
}

int main()
{
    string src_line = "";
    string test_option = "";
    while(src_line.compare("exit")!=0)
    {
        cout << "->";
        getline(cin, src_line);
        tokenizer(src_line);
        parse_expression();
        if(src_line.compare("vm_asm")==0)
            test_option = src_line;
        if(test_option.compare("vm_asm")==0)
        {
            cout << "[vm_asm_start]" << endl;
            for(int i = 0; i < vm_asm_count; i++)
                cout << vm_asm[i] << endl;
            cout << "[vm_asm_end]" << endl << endl;

            cout << "DATA:";
            for (int i = 0; i < data_offset; i ++)
                cout << data_segment[i];
            cout << endl;

        }
        else
        {
            for(int i = 0; i < token_count; i++)
                cout << tokens[i] << endl;
            cout << endl;
        }
    }
    return 0;
}

37
About dialect development / Re: BASIC Dialect from scratch
« on: 20. April 2016, 14:04:07 »
I can't tell what the error is from that screenshot.  That looks more like a run time error from the image but I need to see the entire error message to be sure.

38
About dialect development / Re: BASIC Dialect from scratch
« on: 20. April 2016, 11:32:28 »
I finally got the second video up.  Here is the link: https://youtu.be/hSLDiCWPvh0

And here is the final code from this video:
Code: [Select]
#include <iostream>
#include <string>
#include <sstream>
#include <string.h>

using namespace std;

string keywords[]=
{
    "IF",
    "THEN",
    "ELSE",
    "FOR",
    "NEXT",
    "STEP",
    "TO",
    "DO",
    "LOOP",
    "WHILE",
    "UNTIL",
    "WEND",
    "GOTO",
    "DEF",
    "PRINT",
    "INPUT",
    "REM",
    "END"
};

int keyword_count = sizeof(keywords)/sizeof(keywords[0]);

string spChars[]=
{
    "^",
    "&",
    "*",
    "(",
    ")",
    "-",
    "+",
    "=",
    "[",
    "]",
    "\"",
    "<",
    ">",
    ",",
    "/",
    " "
};

int spChar_count = sizeof(spChars)/sizeof(spChars[0]);

string tokens[100];
int token_count = 0;

string vm_asm[2000];
int vm_asm_count = 0;

unsigned char data_segment[5000];
unsigned char code_segment[5000];

int data_offset = 0;
int code_offset = 0;

int m_count = 0;
int s_count = 0;

int m_max = 0;
int s_max = 0;

bool isSpecialCharacter(string c)
{
    for(int i = 0; i < spChar_count; i++)
    {
        if(c.compare(spChars[i])==0)
            return true;
    }
    return false;
}

bool isNumber(string c)
{
    if(c.compare("0")==0 || c.compare("1")==0 || c.compare("2")==0 || c.compare("3")==0 || c.compare("4")==0 ||
       c.compare("5")==0 || c.compare("6")==0 || c.compare("7")==0 || c.compare("8")==0 || c.compare("9")==0)
        return true;
    return false;
}

bool tokenizer(string src_line)
{
    token_count = 0;
    src_line += " ";
    string src_token = "";
    for(int i = 0; i < src_line.length(); i++)
    {
        if(!isSpecialCharacter(src_line.substr(i,1)))
        {
            if(isNumber(src_line.substr(i,1)))
            {
                src_token = "<num>";
                int d = 0;
                for(; i < src_line.length(); i++)
                {
                    if(isNumber(src_line.substr(i,1)))
                    {
                        src_token += src_line.substr(i,1);
                    }
                    else if(src_line.substr(i,1).compare(".")==0)
                    {
                        if(d==0)
                        {
                            src_token += ".";
                            d++;
                        }
                        else
                        {
                            cout << "Can only have one decimal in a number" << endl;
                            return false;
                        }
                    }
                    else if(isSpecialCharacter(src_line.substr(i,1)))
                    {
                        break;
                    }
                    else
                    {
                        return false;
                    }
                }
                tokens[token_count] = src_token;
                token_count++;
                src_token = "";
                i--;
            }
            else
            {
                src_token = "<id>";
                for(; i < src_line.length(); i++)
                {
                    if(isSpecialCharacter(src_line.substr(i,1)))
                        break;
                    else
                        src_token += src_line.substr(i,1);
                }
                tokens[token_count] = src_token;
                token_count++;
                src_token = "";
                i--;
            }
        }
        else if(src_line.substr(i,1).compare("\"")==0)
        {
            //cout << "DEBUG: " << i << endl;
            bool str_close = false;
            src_token = "<string>";
            for(i=i+1; i < src_line.length(); i++)
            {
                if(src_line.substr(i,1).compare("\"")==0)
                {
                    //cout << "someting" << endl;
                    str_close = true;
                    break;
                }
                else
                    src_token += src_line.substr(i,1);
                //cout << "str: " << src_line.substr(i,1) << endl;
            }
            if(str_close == false)
            {
                cout << "Did not close string" << endl;
                return false;
            }
            tokens[token_count] = src_token;
            token_count++;
            src_token = "";
        }
        else if(src_line.substr(i,1).compare("+")==0)
        {
            tokens[token_count] = "<add>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("-")==0)
        {
            tokens[token_count] = "<sub>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("*")==0)
        {
            tokens[token_count] = "<mul>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("/")==0)
        {
            tokens[token_count] = "<div>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("^")==0)
        {
            tokens[token_count] = "<pow>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("(")==0)
        {
            tokens[token_count] = "<par_open>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare(")")==0)
        {
            tokens[token_count] = "<par_close>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("[")==0)
        {
            tokens[token_count] = "<square_open>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("]")==0)
        {
            tokens[token_count] = "<square_close>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("=")==0)
        {
            tokens[token_count] = "<equal>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("&")==0)
        {
            tokens[token_count] = "<amp>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare(",")==0)
        {
            tokens[token_count] = "<sep>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("<")==0)
        {
            tokens[token_count] = "<less>";
            if(src_line.substr(i).length() > 1)
            {
                if(src_line.substr(i,2).compare("<=")==0)
                {
                    tokens[token_count] = "<less_equal>";
                    i++;
                }
                else if(src_line.substr(i,2).compare("<>")==0)
                {
                    tokens[token_count] = "<not_equal>";
                    i++;
                }
            }
            token_count++;
        }
        else if(src_line.substr(i,1).compare(">")==0)
        {
            tokens[token_count] = "<greater>";
            if(src_line.substr(i).length() > 1)
            {
                if(src_line.substr(i,2).compare("<=")==0)
                {
                    tokens[token_count] = "<greater_equal>";
                    i++;
                }
            }
            token_count++;
        }
    }
    return true;
}

string NumToString(double a)
{
    stringstream ss;
    ss << a;
    string str = ss.str();
    return str;
}

bool parse_expression()
{
    for(int i = 0; i < token_count; i++)
    {
        if(tokens[i].substr(0,5).compare("<num>")==0)
        {
            vm_asm[vm_asm_count] = "mov m" + NumToString(m_count) + " " + tokens[i].substr(5);
            vm_asm_count++;
            tokens[i] = "<vm_var>m" + NumToString(m_count);
            m_count++;
        }
        else if(tokens[i].substr(0,8).compare("<string>")==0)
        {
            memcpy(&data_segment[data_offset], tokens[i].substr(8).c_str()+'\0', tokens[i].substr(8).length()+1);
            vm_asm[vm_asm_count] = "mov$ s" + NumToString(s_count) + " @" + NumToString(data_offset);
            vm_asm_count++;
            data_offset += tokens[i].substr(8).length() + 1;
            tokens[i] = "<vm_var>s" + NumToString(s_count);
            s_count++;
        }
    }
    return true;
}

int main()
{
    string src_line = "";
    string test_option = "";
    while(src_line.compare("exit")!=0)
    {
        cout << "->";
        getline(cin, src_line);
        tokenizer(src_line);
        parse_expression();
        if(src_line.compare("vm_asm")==0)
            test_option = src_line;
        if(test_option.compare("vm_asm")==0)
        {
            cout << "[vm_asm_start]" << endl;
            for(int i = 0; i < vm_asm_count; i++)
                cout << vm_asm[i] << endl;
            cout << "[vm_asm_end]" << endl << endl;

            cout << "DATA:";
            for (int i = 0; i < data_offset; i ++)
                cout << data_segment[i];
            cout << endl;

        }
        else
        {
            for(int i = 0; i < token_count; i++)
                cout << tokens[i] << endl;
            cout << endl;
        }
    }
    return 0;
}

39
About dialect development / Re: BASIC Dialect from scratch
« on: 19. April 2016, 15:24:14 »
I will be posting the next video in about 12 to 14 hours from now.  I don't know what timezone most people here are on so I just decided to put it in hours.

40
About dialect development / Re: BASIC Dialect from scratch
« on: 18. April 2016, 15:22:28 »
Thanks. I thought about editing all the mistakes I made out of the video but figured it would be better for viewers to watch how I go about finding and fixing bugs throughout the video.

41
About dialect development / BASIC Dialect from scratch
« on: 18. April 2016, 08:17:07 »
I am still at the video series, but someone from the sdlBasic forums wanted to know if I would make a video on creating a BASIC dialect so I decided to do it.  I am having to split it up into multiple videos as it is a lot of info to cover.  I have posted the first video here: https://youtu.be/vmN2HBBXK4Y.  Sorry for the bad quality but youtube can seem to keep this video at the quality I recorded it at.  Anyone who watches it let me know what you think.

Here is the code from the video:
Code: [Select]
#include <iostream>
#include <string>

using namespace std;

string keywords[]=
{
    "IF",
    "THEN",
    "ELSE",
    "FOR",
    "NEXT",
    "STEP",
    "TO",
    "DO",
    "LOOP",
    "WHILE",
    "UNTIL",
    "WEND",
    "GOTO",
    "DEF",
    "PRINT",
    "INPUT",
    "REM",
    "END"
};

int keyword_count = 18;

string spChars[]=
{
    "^",
    "&",
    "*",
    "(",
    ")",
    "-",
    "+",
    "=",
    "[",
    "]",
    "\"",
    "<",
    ">",
    ",",
    " "
};

int spChar_count = 15;

string tokens[100];
int token_count = 0;

bool isSpecialCharacter(string c)
{
    for(int i = 0; i < spChar_count; i++)
    {
        if(c.compare(spChars[i])==0)
            return true;
    }
    return false;
}

bool isNumber(string c)
{
    if(c.compare("0")==0 || c.compare("1")==0 || c.compare("2")==0 || c.compare("3")==0 || c.compare("4")==0 ||
       c.compare("5")==0 || c.compare("6")==0 || c.compare("7")==0 || c.compare("8")==0 || c.compare("9")==0)
        return true;
    return false;
}

bool tokenizer(string src_line)
{
    token_count = 0;
    src_line += " ";
    string src_token = "";
    for(int i = 0; i < src_line.length(); i++)
    {
        if(!isSpecialCharacter(src_line.substr(i,1)))
        {
            if(isNumber(src_line.substr(i,1)))
            {
                src_token = "<num>";
                int d = 0;
                for(; i < src_line.length(); i++)
                {
                    if(isNumber(src_line.substr(i,1)))
                    {
                        src_token += src_line.substr(i,1);
                    }
                    else if(src_line.substr(i,1).compare(".")==0)
                    {
                        if(d==0)
                            src_token += ".";
                        else
                        {
                            cout << "Can only have one decimal in a number" << endl;
                            return false;
                        }
                    }
                    else if(isSpecialCharacter(src_line.substr(i,1)))
                    {
                        break;
                    }
                    else
                    {
                        return false;
                    }
                }
                tokens[token_count] = src_token;
                token_count++;
                src_token = "";
                i--;
            }
            else
            {
                src_token = "<id>";
                for(; i < src_line.length(); i++)
                {
                    if(isSpecialCharacter(src_line.substr(i,1)))
                        break;
                    else
                        src_token += src_line.substr(i,1);
                }
                tokens[token_count] = src_token;
                token_count++;
                src_token = "";
                i--;
            }
        }
        else if(src_line.substr(i,1).compare("\"")==0)
        {
            //cout << "DEBUG: " << i << endl;
            bool str_close = false;
            src_token = "<string>";
            for(i=i+1; i < src_line.length(); i++)
            {
                if(src_line.substr(i,1).compare("\"")==0)
                {
                    //cout << "someting" << endl;
                    str_close = true;
                    break;
                }
                else
                    src_token += src_line.substr(i,1);
                //cout << "str: " << src_line.substr(i,1) << endl;
            }
            if(str_close == false)
            {
                cout << "Did not close string" << endl;
                return false;
            }
            tokens[token_count] = src_token;
            token_count++;
            src_token = "";
        }
        else if(src_line.substr(i,1).compare("+")==0)
        {
            tokens[token_count] = "<add>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("-")==0)
        {
            tokens[token_count] = "<sub>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("*")==0)
        {
            tokens[token_count] = "<mul>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("/")==0)
        {
            tokens[token_count] = "<div>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("^")==0)
        {
            tokens[token_count] = "<pow>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("(")==0)
        {
            tokens[token_count] = "<par_open>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare(")")==0)
        {
            tokens[token_count] = "<par_close>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("[")==0)
        {
            tokens[token_count] = "<square_open>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("]")==0)
        {
            tokens[token_count] = "<square_close>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("=")==0)
        {
            tokens[token_count] = "<equal>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("&")==0)
        {
            tokens[token_count] = "<amp>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare(",")==0)
        {
            tokens[token_count] = "<sep>";
            token_count++;
        }
        else if(src_line.substr(i,1).compare("<")==0)
        {
            tokens[token_count] = "<less>";
            if(src_line.substr(i).length() > 1)
            {
                if(src_line.substr(i,2).compare("<=")==0)
                    tokens[token_count] = "<less_equal>";
                else if(src_line.substr(i,2).compare("<>")==0)
                    tokens[token_count] = "<not_equal>";
            }
            token_count++;
        }
        else if(src_line.substr(i,1).compare(">")==0)
        {
            tokens[token_count] = "<greater>";
            if(src_line.substr(i).length() > 1)
            {
                if(src_line.substr(i,2).compare("<=")==0)
                    tokens[token_count] = "<greater_equal>";
            }
            token_count++;
        }
    }
    return true;
}

int main()
{
    string src_line = "";
    while(src_line.compare("exit")!=0)
    {
        cout << "->";
        getline(cin, src_line);
        tokenizer(src_line);
        for(int i = 0; i < token_count; i++)
            cout << tokens[i] << endl;
        cout << endl;
    }
    return 0;
}

42
Community news and announcements / Re: RC Basic Video Series
« on: 15. April 2016, 04:49:34 »
I actually wanted to add find/replace from the beginning.  I am still in the process of learning more about wxWidgets.  They are on my TODO list and I might be able to get some help with the editor so hopefully soon. :)

43
Community news and announcements / Re: RC Basic Video Series
« on: 14. April 2016, 08:51:01 »
I posted that demo I said I would post on the sdlbasic forum.

44
Community news and announcements / Re: RC Basic Video Series
« on: 14. April 2016, 08:20:06 »
I did not mean to imply I couldn't do it.  I was simply stating that as of right now my parser is not as advanced as some of the other BASIC dialects on this forum.  I fully intend to expand it in time.  Right now my sole focus is on porting to linux.  I have got it to compile but I have been getting a bunch of segmentation faults and other crazy bugs.  I think I can have it up in another month at the latest.

45
Community news and announcements / Re: RC Basic Video Series
« on: 13. April 2016, 21:20:54 »
Thanks for the feedback B+. I don't have single line IF THEN.  I wrote the parser completely from scratch myself so I didn't have an established BASIC parser to build on.  I think sdlbasic uses the parser from wxbasic so it has a more advanced parser that can handle parsing multiple lines on a single line.  But even with this limitation you can still do pretty much anything in RC Basic you can do with sdlbasic. I will post some sdlbasic demos I converted to show a comparison of the 2 dialects side by side when I get home.  The biggest difference between the 2 is that sdlbasic is a source code interpreter and RC Basic code must be compiled to byte code which is run by a virtual machine kinda like java does.

Pages: 1 2 [3] 4