بررسی stack برای توابع تو در تو
۱۴۰۱ شهریور ۱۹, شنبه ساعت ۹:۲۸باید stack رو برای توابع تو در تو بررسی کنم ودلیل باگی که در آرایه به وجود میاد رو بفهمم
باید stack رو برای توابع تو در تو بررسی کنم ودلیل باگی که در آرایه به وجود میاد رو بفهمم
یک باگ خیلی عجیب و غریب داخل ایجاد تابع جدید برای کلاس آرایه دارم که باید اون رو برطرف کنم. خیلی داره اذیت میکنه و زمان زیادی داره میگیره ...
خب دیگه آرایه ها و آبجکت ها از یک نوع نیستن. مثلا کلاس ها الان نوع کلاس رو دارن و یا وقتی اونها رو new میکنیم هم نوع آبجکت رو دارن و آرایه ها فقط با [] قابل تعریف هستن. یا اینکه یک آرایه رو new کنیم ...
new Array
خب مثال regex رو در زیر میگذارم
main() {
let r = /^(\w+)\s*(\w+)\s*$/g.exec("this is test");
print( r );
}
فعلا خروجی تابع exec مقادیر match شده به صورت آرایه است.
بعدا match , replace, match all و ... رو هم اضافه میکنم به string class
دیگه نیازی به import کتابخونه برای regex نیست و مستقیم در بکند کار تعریف شده.
قبلا مثال های string رو قرار دادم. الان توسعه زبان خیلی راحت شده و میتونم اون رو برای array و object هم به صورت extension توسعه بدم.
خوبی اینکار این هست که با تغییر در extension و کامپال اون به صورت مجزا دیگه نیازی به کامپایل کل برنامه نیست ...
برای توسعه بهتر کلاس های پایه ای رو باید به صورت اکستنشن در بیارم.
regex رو هم با pcre2 نوشتم، فقط باید به صورت extension اون رو پیاده سازی کنم.
خب ternary رو هم اوکی کردم. البته یکم دیگه کار داره که اون رو هم به زودی تکمیل میکنم. shift left و shift right رو هم اوکی کردم.
چیزی تا بستن پروژه برای x86 باقی نمونده.
main() {
let a;
a = 20;
let b;
b = a < 30 ? 5 : 3;
print(b);
}
syntax مربوط به regex رو شبیه به js اضافه کردم و کلاسش رو هم اینطرف تعریف کردم و در c اون رو صدا زدم. اگر کلاسی اینطرف تعریف بشه در c هم میتونم اون رو صدا بزنم ...
import lib.regexp
main() {
print( /\w+\s/g );
}
کارهای پیش رو که باید انجام بدم
base64, encryption, big num, float, double, hex, regex
با انجام این کارها زبان تکمیل میشه ...
خب تا اینجای کار تونستم یک پردازش خیلی ساده انجام بدم :
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 );
}
ادامه کار هم بعد از بازگشت از کاشان ...
قرار بود که یک http server بنویسم و زبان رو دیباگ کنم. به این نتیجه رسیدم که یک json parser بنویسم و زبان رو دیباگ کنم. تا الان خیلی از مشکلاتش رو برطرف کردم و با پایان json parser خیلی از قسمت ها دیباگ میشه.
بعد از اون هم به سراغ نوشتن http server میرم.
بعد از اون به سراغ اعداد float میرم.
پیاده سازی کلاس در زبان c رو هم انجام دادم که روال اون رو راحتتر میکنم.