اکستنشن کردن string, array, object, regex

برای توسعه بهتر کلاس های پایه ای رو باید به صورت اکستنشن در بیارم.

regex رو هم با pcre2 نوشتم، فقط باید به صورت extension اون رو پیاده سازی کنم.

ternary

خب ternary رو هم اوکی کردم. البته یکم دیگه کار داره که اون رو هم به زودی تکمیل میکنم. shift left و shift right رو هم اوکی کردم.

چیزی تا بستن پروژه برای x86 باقی نمونده.

main() {
    let a;
    a = 20;
    let b;
    b = a < 30 ? 5 : 3;
    print(b);
}

اضافه شدن regex

syntax مربوط به regex رو شبیه به js اضافه کردم و کلاسش رو هم اینطرف تعریف کردم و در c اون رو صدا زدم. اگر کلاسی اینطرف تعریف بشه در c هم میتونم اون رو صدا بزنم ...

import lib.regexp

main() {

    print( /\w+\s/g );

}

json parser

خب تا اینجای کار تونستم یک پردازش خیلی ساده انجام بدم :

class jsonParser {
    construct( a ) {
        this.str = a;
        this.i = 0;
        this.res = this.parse();

    }

    next() {
        this.i++;
        while( this.tok() == ' ' ) {
            this.i++;
        }   
    }

    tok() {
        return this.str[ this.i ];
    }

    parseObject() {

        this.next();
        let ret = [];
        while( this.tok() != '}' ) {
            let k = this.parse();

            this.next();

            let v = this.parse();

            ret[k] = v;

            if( this.tok() == ',' ) {
                this.next();
            }

        }
        this.next();

        return ret;
    }

    parseStr() {

        let a = "";

        this.next();    
        while( this.tok() != '"' ) {
            a = a + this.tok();
            this.next();
        }
        this.next();

        return a;
    }

    parseArray() {
        this.next();
        let ret = [];
        let i = 0;
        while( this.tok() != ']' ) {
            let k = i++;

            let v = this.parse();

            ret[k] = v;

            if( this.tok() == ',' ) {
                this.next();
            }
        }
        this.next();

        return ret;
    }

    init() {

    }

    parse() {
        let a = this.tok();
        if( a == "{" ) {
            return this.parseObject();
        } else if( a == '"' ) {
            return this.parseStr();
        } else if( a == '[' ) {
            return this.parseArray();
        }

    }
}

main() {

    let a = new jsonParser('{ "test" : "123" , "test1" : "321", "array" : [ "a", "b", "c", "d" ], "inner" : {"aa" : "11", "bb" : "22", "cc" : "33"} }');
    print( a.res );
    print( a.res.test );

}

ادامه کار هم بعد از بازگشت از کاشان ...

نوشتن یک json parser با dolang برای دیباگ زبان

قرار بود که یک http server بنویسم و زبان رو دیباگ کنم. به این نتیجه رسیدم که یک json parser بنویسم و زبان رو دیباگ کنم. تا الان خیلی از مشکلاتش رو برطرف کردم و با پایان json parser خیلی از قسمت ها دیباگ میشه.

بعد از اون هم به سراغ نوشتن http server میرم.

بعد از اون به سراغ اعداد float میرم.

پیاده سازی کلاس در زبان c رو هم انجام دادم که روال اون رو راحتتر میکنم.

تغییر اساسی در پیاده سازی

یه سری قسمت ها رو خیلی بد پیاده سازی کردم که باید حتما اصلاح کنم.

مثلا وقتی یک متغییر میخواد روش عملیاتی انجام بشه. اون متغییر میتونه هر چیزی باشه و فقط بار اول هست که باید مقدار اون رو بگیرم. در دفعات بعد نیازی به گرفتن مقدار اون نیست و مثلا پلاس پلاس کردن و ... رو باید بدون توجه به اینکه چی رو میخام پلاس پلاس کنم انجام بدم ...

prototype

خب یک تغییر اساسی در کلاس ها انجام دادم. از این به بعد متد ها به پراپرتی prototype به آبجکت اصلی کلاس اضافه میشن. و خواندن اون هم از prototype انجام میشه. مزیت اینکار استفاده کمتر از رم میشه که با ایجاد هر آبجکت جدید از کلاس ( new کردن کلاس ) دیگه کپی انجام نمیشه و رفرنس میشه به کلاس اصلی و با اضافه شدن متد به کلاس اصلی به تمامی آبجکت هایی که حتی از قبل هم ایجاد شدن اون متد اضافه میشه.

مثال :

class Test {
    a() {
        print("in a\n")
    }
}

main() {

    let y = {}
    y.o = func() {
        print("y o \n")
    }

    y.o();

    print( String )
    print( Array )
    print( Object )

    String.prototype.test = func() {
        return 2;
    }

    String.prototype.test1 = func() {
        return "test1";
    }

    let a = "Hello World"

    print( a.substr(1,4)+"\n" )

    print( a.length() )

    print("\n")

    print( a.test() )
    print("\n")
    print( a.test1() )
    print("\n")

    let g = new Test
    Test.prototype.b = func() {
        print("in b\n");
    }

    print( g );

    g.a();
    g.b();
}

حذف sym_stk و استفاده از var_stk در همه جا

تا قبل از اینجا توابع داخل sym_stk نگه داری میشدن ولی از این به بعد تصمیم دارم که همه چیز داخل var_stk نگه داری بشن. الان دیگه نمیشه کلاس و تابع هم نام داشت. ( قبلا میشد )

ترکیب php syntax و js syntax

یکی از قسمت های خوب زبان php باز و بسته شدن تگ هست. اما ایرادهایی مثل تعریف متغییر با $ sign و یا -> به جای . در زبان php و یا . به جای + برای concat string هست که به نظرم js syntax خیلی بهتر از اون هست.

شاید dolant تلفیقی ازا ین دو زبان بشه.

این رو به عنوان یک ایده بیان کردم