ببخش ولی تا من مثال دقیق نبینم , قانع نمیشم. تو کتابخانه های gcc هرچی گشتم یک چنین چیزی ندیدم. میتونی مثال واضح از یک زبان و کامپایلر معروف بیاری.
Printable View
ببخش ولی تا من مثال دقیق نبینم , قانع نمیشم. تو کتابخانه های gcc هرچی گشتم یک چنین چیزی ندیدم. میتونی مثال واضح از یک زبان و کامپایلر معروف بیاری.
خوب اگه شما می خواید دستورات پایه مون سطح بالا باشه، قبول، تجربه اش ضرر نداره.
در مورد کد سه آدرسه من هر چه قدر فکر می کنم مزیت روش قبلی رو نسبت به این حالت نمی فهمم:
Instruction FirstOperand , SecondOperand , ThirdOperand
:متفکر:
با اینکه خودم مایلم کار اصولی پیش بره ولی احساس میکنم این کد میانی یکم کارو طولانی میکنه. نظرتون چیه؟ کد مبدآ رو مستقیمآ به اسمبلی تبدیل نکنیم؟؟؟!!!!:متفکر:
خوب انواع ورودی و خروجی ها چی هستن؟
فکر میکنم اول باید به فکر ورودی خروجی ( خواندن و نوشتن ) در کنسول باشیم و بعد هم کار با فایل!
دقیـقـا...
ولی بهتره خواندن و نوشتن در کنسول با خواندن و نوشتن در فایل به نوعی یک پارچه باشن.
برای کار با فایل موافقم،
اما در مورد خوندن و نوشتن به نظرم مثل تابع و زیربرنامه باشن بهتره.
اصلا مثل C هر دو روش...!:لبخند:
OK!
ساختار معرفی کن.
Console.WriteLine ' minevise mire khatte payin
Console.Write ' faghat minevise
Console.ReadLine ' mikhoone ta yaroo enter ro bezane
Console.ReadCharacter ' faghat ye character mikhoone
...
این Console قبلشو چی کار کنیم...؟
یا:
use 'iostream'
use 'ScreenClass'
object obj01 : ScreenInterface ' An object from ScreenClass
obj01.WriteLine ...
obj01.ReadLine ...
' Note : ScreenClass written with iostream routines.
' bara in ke ghablesh console byad:
object Console : ScreenInterface
OK
ولی منظورم scanf من و cin شما بود!
چون scanf خیلی شبیه با زیربرنامه ها و توابعه و cout هم که نه!
اصلا زیاد مهم نیست، چون اگه یه چیزی مثل cout پیاده سازی کنیم که شبیه زیربرنامه ها نباشه، خیلی راحت می شه زیربرنامش هم نوشت دیگه...!
خوب حالا نظر شما برای ورودی و خروجی چیه؟
این که ورودی و خروجی Console و File ها شبیه هم باشن جالب بود اما چه طوری؟
مثل QBASIC باشه [تقریبا]؟!
نباید شبیه زبانی دیگه باشه؟
در ضمن همونطور که گفتم من فقط تا اواسط اسفند, وقت آزاد دارم. بعدش به خاطر درسهام نمیتونم فعلآ وقتم رو برای این کار بگذارم.:افسرده:
کی فکر می کنی وقتت آزاد می شه؟!
تا آخر ترم !
ولی متآسفانه تا همینجاش خیلی وقت و از دست دادیم.
شاید بتونم تا اون موقع تحلیلگر نحوی رو تکمیل کنم و باقی رو بذاریم برای بعد.
اعتماد به نفستون توی حلقم:لبخند:
صفحه 1 تایپیک بودم، اونجا بحث بود که ساختار لغات مشخص بشه! الان اومدم صفحه 29 می بینم که هنوز داره در مورد ساختار کلمات کلیدی و نحو برنامه بحث میشه!:لبخند:
کارتون قابل تحسین هست ولی فکر کنم حتی اگر بخواهید به یک نتیجه ساده برسید سال ها طول بکشه...
یک پیشنهاد:
چون پروژه تجاری نیست صرفا جنبه آموزشی داره به نظرم اول یک زبان ناقص طراحی کنید و اگر جواب داد بعد روی کامل کردنش تحت یک پروژه کاملا جدید و مستقل کار کنید...
مشکل وقته! وگرنه کار ادامه پیدا می کنه. کس دیگه هم غیر از جناب amin32 نیست که کارو سریع تر ادامه بدیم...
سلام بر دوستان عزیز
ضمن عرض تبریک سال نو میخواستم عرض کنم من هم تاپیک دارم دنبال میکنم ولی خبری نشد حالا که من میخوام یک پروژه تجاری اینجا ارائه بدم بلکه شما دوستان بتونید روی این موضوع کمکی به من بکنید شاید روش اجرا جنبه ایی آموزشی هم شد
من در حال نوشتن یک پلتفورم برای بازار فارکس هستم و میخوام با ساخت کامپلیر ساده بتونم اندیکاتورهای نوشته شده در این مورد به این پلتفرم اضافه کنم در زیز هم نمونه یکی از اندیکاتورها اضافه کردم حالا ضمن نوشته های قبلی دوستان هر کدوم از دوستان که توانایی دارن راهنمایی کنند(از همه دوستان تشکر میکنم)
//+------------------------------------------------------------------+
//| Heiken Ashi.mq4 |
//| Copyright c 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
//| For Heiken Ashi we recommend next chart settings ( press F8 or |
//| select on menu 'Charts'->'Properties...'): |
//| - On 'Color' Tab select 'Black' for 'Line Graph' |
//| - On 'Common' Tab disable 'Chart on Foreground' checkbox and |
//| select 'Line Chart' radiobutton |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Red
#property indicator_color4 White
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 3
#property indicator_width4 3
//----
extern color color1 = Red;
extern color color2 = White;
extern color color3 = Red;
extern color color4 = White;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//|------------------------------------------------------------------|
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_HISTOGRAM, 0, 1, color1);
SetIndexBuffer(0, ExtMapBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, color2);
SetIndexBuffer(1, ExtMapBuffer2);
SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, color3);
SetIndexBuffer(2, ExtMapBuffer3);
SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, color4);
SetIndexBuffer(3, ExtMapBuffer4);
//----
SetIndexDrawBegin(0,10);
SetIndexDrawBegin(1,10);
SetIndexDrawBegin(2,10);
SetIndexDrawBegin(3,10);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexBuffer(3,ExtMapBuffer4);
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
double haOpen, haHigh, haLow, haClose;
if(Bars<=10) return(0);
ExtCountedBars=IndicatorCounted();
//---- check for possible errors
if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
if (ExtCountedBars>0) ExtCountedBars--;
int pos=Bars-ExtCountedBars-1;
while(pos>=0)
{
haOpen=(ExtMapBuffer3[pos+1]+ExtMapBuffer4[pos+1])/2;
haClose=(Open[pos]+High[pos]+Low[pos]+Close[pos])/4;
haHigh=MathMax(High[pos], MathMax(haOpen, haClose));
haLow=MathMin(Low[pos], MathMin(haOpen, haClose));
if (haOpen<haClose)
{
ExtMapBuffer1[pos]=haLow;
ExtMapBuffer2[pos]=haHigh;
}
else
{
ExtMapBuffer1[pos]=haHigh;
ExtMapBuffer2[pos]=haLow;
}
ExtMapBuffer3[pos]=haOpen;
ExtMapBuffer4[pos]=haClose;
pos--;
}
//----
return(0);
}
//+------------------------------------------------------------------+
سلام من برگشتم.
خب بعد از این وقفه طولانی تصمیم گرفتم دوباره تا جایی که میتونم روی پروژه کار کنم. البته این رو بگم که باز هم بودنم در پروژه قطعی نیست و ممکنه به خاطر مشکلات شخصی زیادی که دارم پروژه رو رها کنم.همینجا از دوستان و اساتید دیگه هم دعوت میکنم که اگه در پروژه مشارکت کنند.بگذریم...
یک تغییر کوچیک مد نظرم هست و اون اینه که به خاطر جلوگیری از بعضی سوء استفاده های احتمالی تا زمان تکمیل شدن کامل پروژه کدهای اصلی فازها فقط در اختیار اعضای گروه قرار میگیره. البته بحث و تحلیل کدها و الگوریتم ها و مسائل دیگه به صورت عمومی انجام میشه.
یک سوالی هم برام پیش اومده .در مورد استفاده از اسمبلر FASM که ما اینقدر برای تکمیل پروژه روش حساب کردیم آیا مشکلی از لحاظ قانونی و کپی رایت نداره.
...سلام!
فکر می کنم مشکلی نباشه، این جا رو ببینید: www.bttr-software.de/forum/forum_entry.php?id=8727
خب پس مثل اینکه مشکلی از این بابت نیست.
میرسیم به ساخت EBNF زبان برای پیاده سازی تحلیلگر نحوی.
فکر می کنم قبلا یه کدی برای تحلیلگر لغوی نوشته بودین...
خوب برای ساختار EBNF یه ساحتار کلی پیشنهاد بدید، روش کار کنیم، یه سری چیزهای اصولی هم که در اکثر ساختار ها مشترکه،...
بله تحلیلگر لغوی تقریبآ کامله. در مورد ساختار نحوی هم که قبلآ در موردش بحث کردیم:
https://barnamenevis.org/showthread.p...=1#post1428198
و برای ساختار حلقه:
https://barnamenevis.org/showthread.p...=1#post1428655
فقط الان که دارم دقت میکنم با توجه به ساختار حلقه باید کلمه Check رو هم به کلمات کلیدی در تحلیلگر لغوی اضافه بشه که چیز مهمی نیست. الان باید با توجه به ساختاری که با مثال ایجاد کردیم EBNF رو بسازیم ولی باید دقت کنیم که گرامرها نباید ابهام یا بازگشتی چپ داشته باشند.
چون تا حالا یه گرامر درست و حسابی ننوشتم، اول یه نگاهی بندازیم به بقیه ی گرامر ها و روی اون ها کار کنیم و بعد گرامر خودمون رو بنویسیم...
این هم یه نمونه ی خوب: rosettacode.org/wiki/BNF_Grammar
سلام بر دوستان.
من همه پست های این تاپیک رو بررسی نکردم ولی تعداد زیادی از اون ها رو خوندم...
به دلیل علاقه ای که به طراحی کامپایلر ( و به شکل خاص تر parse کردن یک متن در نرم افزار خودم ) داشتم با کامپایلر و الگوریتم های طراحی اون آشنایی زیادی دارم...
دوستان... فراموش نکنید که تقریبا در اکثر کامپایلرهای دنیا (یا به عبارتی همه کامپایلرها) دو بخش اول یعنی تحلیلگر لغوی و تحلیلگر نحوی به هیچ عنوان دستی انجام نمی شه... یعنی برای نوشتن تحلیل گر لغوی و نحوی طراحان کامپایلر حتی شاید یک خط کد هم ننویسند... بلکه از ابزارهای آماده استفاده می کنند...
ابزارهای زیادی وجود داره...
به عنوان مثال برای طراحی تحلیلگر لغوی... وقتی زبان و واژگان زبان (توکن ها) رو طراحی کردیم... باید تحت یک فرمت مشخص این توکن ها رو به عنوان ورودی به ابزاری مثل LEX یا FLEX بدیم... خود این ابزار برای ما Scanner رو تولید می کنه و به ما یک کد و برنامه میده...
شما تصور کنید برای طراحی یک کامپایلر برای زبانی مثل C اگر بخوایم Scanner رو دستی طراحی کنیم چقدر کد وحشتناک می شه... DFD ما برای اسکنر مثلا شامل حدود 3000 state می شه... برای طراحی این states با جدول انتقال (Transition-Diagram) یا روش switch-case (دو روش طراحی scanner بدون ابزار) شاید نیاز بشه ماه ها وقت بزاریم... در نهایت هم احتمالا خطا و اشتباه به دلیل پیچیدگی وجود خواهد داشت و البته دو فاکتور مهم در مهندسی نرم افزار یعنی "وقت" و "هزینه" رو از دست میدیم... این رو میشه با ابزار در مدت زمان کوتاهی با دقت بسیار بالا انجام داد (اگر زبان و توکن ها طراحی شده باشه شاید کمتر از چند ساعت برای نوشتن و تولید scanner زمان نیاز باشه) و در عوض تمرکزمون رو روی بهینه سازی ها و تحلیل گر معنایی و سایر قسمت های مهم کامپایلر بزاریم...
برای طراحی parser یا تحلیل گر معنایی هم دقیقا همین طوره... دونستن مفاهیم پارسر مثل (SLR(1 یا گرامرهای (LL(1 یا (CLR(1 یا ... ضروری هست و باید بلد باشیم (چون به ما دید میده و گاهی اوقات حتی کمک هم میکنه) اما در عمل از هیچ کدوم از این ها استفاده نمی کنیم بلکه به عنوان مثال از ابزاری به نام YACC (مخفف Yet Another Compiler Compiler) استفاده می کنیم... ما به ابزار همه گرامر های زبان رو میدیم و ابزار به شکل اتوماتیک الگوریتم تحلیل پایین به بالا (LALR1) رو پیاده سازی می کنه و به ما مثلا کد C می ده.... در واقع تنها کاری که باید انجام بدیم طراحی همه گرامرهای زبان هست نه پیاده سازی parser مربوط به این گرامرها
فراموش نکنید طراحی تحلیل گر نحوی به شکل دستی کار بسیار دقیق و زمانبری هست و البته با وجود این ابزارهای خودکار و قدرتمند بیهوده... چون اگر صدها یا هزاران گرامر داشته باشیم باید برای تک تک گرامرها الگوریتمهای تحلیل نحوی (پایین به بالا یا بالا به پایین) مثلا (LALR(1 (یکی از قویترین الگوریتم های parser پایین به بالا) رو اعمال و پیاده سازی کنیم و چنین کاری با داشتن ابزار بیهوده است...
از این ابزارها و ابزارهای مشابه تقریبا همه شرکت های مشهور حتی طراحان جاوا یا مایکروسافت (برای طراحی کامپایلر) استفاده می کنند. بنابراین پیشنهاد می کنم از نرم افزارهای قدرتمند برای تولید حداقل این دو بخش از کامپایلر استفاده کنید...
موفق باشید...
سلام دوست عزیز،
البته توجه داشته باشیم فعلا این پروژه جنبه ی یادگیری و سرگرمی داره، نه جنبه ی تجاری...
اما پیشنهاد خوبیه... :متفکر:
سلام دوست عزیز.
من تا حدودی با حرفتون موافقم یعنی اینکه استفاده از Yacc و bison میتونه به تولید تحلیلگر نحوی سرعت ببخشه. البته فکر میکنم در مورد تحلیلگر لغوی فرق چندانی نداره و ما توستیم اون رو به راحتی به صورت دستی بسازیم. با توجه به تعداد حالتهای لغات:
https://barnamenevis.org/showthread.p...=1#post1433481
همونطور که دوستمون گفتن چون ما هدفمون بیشتر جنبه یادگیری داره فکر میکنم بهتر باشه به شکل دستی ساخته بشه.بازم ممنون از نظرتون. ازتون دعوت میکنم اگر مایل بودید در پروژه با ما همکاری کنید.
دو تا لینک خوب برای آشنایی بهتر با EBNF و گرامرها:
http://c.comsci.us/syntax/expression/ebnf.html
http://cs.lmu.edu/~ray/notes/syntax/
یه مشکلی در طراحی EBNF وجود داره.این گرامر رو نگاه کنید:
<program>::=<uses><imports><define><main><function s>
<Uses>::={<Use>{NEWLINE}+}*
<Use>::= <USE_KEY><STRING>
اینجا ما تو خط اول نحو کلی یک برنامه به زبانمون رو بیان کردیم. همونطور که میبینید برناممون با تعریف Use ها شروع میشه ( کتابخانه ها) . بعدش import ها رو داریم و همینطور تا آخر. ولی مشکل از خط دوم شروع میشه. ببینید ما متآسفانه از کاراکتر خط جدید به عنوان کاراکتر هماهنگ کننده ( جدا کننده دستورات ) استفاده کردیم. یعنی بین هر دستور مستقل باید یک یا چند کاراکتر خط جدید وجود داشته باشه (علامت "+" بعد از Newline به همین معنی هست ) . مشکل اینجاست که ممکنه مثلآ برنامه نویس بخواد یه برنامه که فقط از یک دستور فراخوانی کتابخانه (USE) تشکیل شده رو بنویسه و بعد از این دستور هم قاعدتآ نیازی به درج خط جدید نیست. این درحالیه که با توجه به این گرامر , تحلیلگر نحویمون از این برنامه ایراد میگیره.:متفکر:
خوب ببینید می شه از | استفاده کنیم، یعنی اون حالت رو هم داخل خط اول گرامر در نظر بگیریم.
use فقط include می کنه؟ اگه آره، پس بهتره کاری کنیم که use رو بشه در هر قسمتی از کد استفاده کنیم.
ضمنا در این صورت قبل این که این مراحل تحلیل شروع بشه، بهتر نیست که دنبال عبارت های use بگردیم و محتوای فایل مورد نظر رو جایگزین use کنیم؟ یه replace ساده... :متفکر:
لطفآ اگه امکانش هست گرامرش رو بنویس. اینطوری نمیشه متوجه شد.
به نظرت منطقی تر نیست که کتابخانه ها در ابتدای برنامه معرفی بشن؟
در این مورد باید بعدآ بیشتر تحقیق کنیم. چون این رفتار در مورد ماکروها اتفاق می افته. ولی از این مطمئنم که تا قبل از تحلیل برنامه اصلی نباید در کدهای نوشته شده توسط برنامه نویس دست برد چون ممکنه مثلآ دستور use نوشته شده از نظر نحوی اشباه باشه. از من میپرسی میگم که این کارها باید در مرحله تولید کد میانی انجام بشه.