PDA

View Full Version : سوال در مورد کامپایلر



بیتافرهی
پنج شنبه 16 خرداد 1387, 19:19 عصر
سلام
من دارم یه کامپایلر برای پاسکال درست می کتم.(البته فقط یکی از فازهای کامپایلر را)
به یه مشکلی برخوردم واونم اینکه وقتی یه برنامه به زبان پاسکالرا نوشتم ،برنامه ای که من می ن.یسم باید بتواند بلاک های آشیانه ای را تشخیص دهد یعنی بنویسد که فلان متغیر در برنامه ی پاسکال به بلاک چندم تعلق دارد؟


BEGIN
X:INTEGET;
.
.
.
.

BEGIN
Y:FLOAT;
.
.
.
END


.
.
.
.END.

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

Nima_NF
جمعه 17 خرداد 1387, 00:04 صبح
یک راه به این شکل می تواند باشد که شما به ترتیب بلاک ها را شماره گذاری کنید و هنگام تعریف متغیر ها آن را در یک لیست پیوندی با توجه به شماره بلاک تعریف شده آن ذخیره کنید.
اگر هم داخل بلاکی بلاک دیگری قرار دارد به راحتی در همان node از لیست پیوندی، می تواند یک لیست پیوندی دیگر را تعریف کنید و همین طور لیست های پیوندی تو در تو در صورت نیاز.
مثلا در خانه 1 لیست که برای بلاک 1 هست متغیرهای x و y قرار گیرد و در خانه 2 نیز مثلا x دیگری تعریف شود و در خانه 3 لیست پیوندی دیگر که می تواند شامل چندین متغیر باشد و...

سپس در هنگام انجام عملیات ابتدا در این لیست چک کنید که بلاک کنونی شامل چه متغیر هایی هست و آن ها را با توجه به اولویت و بلاک استفاده کنید.

بیتافرهی
شنبه 18 خرداد 1387, 10:34 صبح
دوتا مشکل وجود دارد:
1-چه جوری بفهمه که اعلان داره یعنی:
integer :x;
float:y;
(منظورم اینه که نوع متغیر ها هم مهمه.ممکنه یکی اعشاری دیگری کاراکتری باشه...)(پس تشخیص نوع هم مهمه)
2-ممکنه جند متغیر هم نوع باشند و با هم اعلان شوند.
float:x,y,z;
(باید نوعشان را هم ذخیره کنم؟)

با تشکر فراوان از توجهتان.

Nima_NF
شنبه 18 خرداد 1387, 15:11 عصر
باید نوعشان را هم ذخیره کنم؟حتما.

شما در ازای هر متغیری که تعریف می شود و ذخیره می کنید باید یک فیلد نوع (Type) هم برایش در نظر بگیرید تا در هنگام فراخوانی بتوانید نوعش را نیز تشخیص دهید. (در پیاده سازی زبان ها به این کار می گویند تشکیل جدول نما)

اعلان را هم که به راحتی با دیدن کلمات کلیدی آن می توانید تشخیص دهید.

موفق باشید

ehsan13761
دوشنبه 20 خرداد 1387, 09:00 صبح
دوست عزیز شما باید ابتدا گرامر زبان پاسکال مورد نظر را پیاده سازی کرده تحلیلگر لغوی آن را نیز پیاده کنید تا کلمات کلیدی از شناسه ها شناخنه شوند بدین ترتیب نوع هر متغیر همراه شناسه مربوطه ذخیره می شود. برای شناسایی بلاک مربوطه نیز نیاز به طراحی تحلیلگر معنایی و parser دارید...
آسانترین راه برای این کارها استفاده از نرم افزار Lex می باشد. چون هرقدر هم خوب کد بنویسید باز هم محصول کار Lex خیلی بهتره. فقط کافیه گزامر به همراه Patternها و توکن هاشونو بهش بدی خودش کد فاز اول و دوم میده.