ورود

View Full Version : سوال: command برای تولید پارسر



BeginnerProgrammer
شنبه 29 تیر 1392, 10:57 صبح
سلام دوستان من کد پارسر و اسکنر کامپایلرمو نوشتم . اسکنرش خیلی راحت با استفاده از flex درست شد. تستشم جواب داد ولی نمیدونم چطوری کدی که برای پارسر نوشتمو ازش اجرا بگیرم( میخوام با استفاده از bison اینکارو انجام بدم). یعنی در واقع من این فایلا رو داریم:

symboltable.h, lex.yy.c , mygrammer.txt , myparsercode.txt, three.h

پیشاپیش از راهنماییهاتون ممنون.

hoseinpoo
شنبه 29 تیر 1392, 17:00 عصر
کافیه شما کدی که برای پارسر نوشتید را با پسوند .y ذخیره کنید. و اونو توی پوشه‌ای قرار بدید که فایل bison.exe اونجا هست.
بعد با cmd به همون مسیر برید و این دستور را تایپ کنید:
bison -d filename.y
فقط به جای filename اسم فایل خودتون را بذارید.
به این ترتیب یه فایل c ایجاد میشه که به راحتی می تونید اجراش کنید.

BeginnerProgrammer
شنبه 29 تیر 1392, 17:40 عصر
ایجاد کردم همین فایلی که میگین بعد تو کد بلاکم ازش ران گرفتم ولی هرکاری کردم اجرا نمیشه !!!!!!

hoseinpoo
شنبه 29 تیر 1392, 21:06 عصر
آهان! بله حق با شماست. یه قسمت را فراموش کردم بگم، فقط قبلش اینو بگم که دستور قبلی توی یه قسمتش اشتباه شده، دستور صحیح اینه:
bison -dy filename.y
با این دستور علاوه بر یه فایل c ، یه فایل .h هم ایجاد میشه.
حالا باید ابتدای فایل .l تون این فایل .h را include کنید و در پایان فایل هم یه main بنویسید و توی اون فقط تابعی به اسم ()yyparse را فراخوانی کنید و دوباره با flex از اول فایل lex.yy.c را ایجاد کنید.
تا اینجا شما دو تا فایل c دارید که یکیش با flex ایجاد شده و یکیش با bison.
حالا باید این دوتا را با هم لینک کنید و یک فایل اجرایی ازش در بیارید. می‌تونید از gcc استفاده کنید. من خودم از برنامه‌ی devcpp استفاده می‌کردم.
بعد از اینکه نصبش کردین فایل‌های .c و .h را تو پوشه‌ی bin اش کپی کنین و با cmd به اون مسیر برید و این دستور را تایپ کنید:
gcc filename.tab.c lex.yy.c -o parser.exe
فقط به جای filename بازم اسم فایل خودتونو بذارین.
حالا این parser.exe است که باید اجرا بشه و بهش ورودی بدین و خروجیشو را ببینین. میشه با همون cmd که توی اون مسیر هستید این کار را انجام بدین:
parser.exe <input.txt> output.txt

باز هم اگر مشکلی بود (و البته بلد بودم) در خدمتم :)

BeginnerProgrammer
شنبه 29 تیر 1392, 22:10 عصر
فقط یک سوال اگه از devcpp استفاده کنم باز باید از همین دستوره gcc filename.tab.c lex.yy.c -o parser.exe استفاده کنم؟
از جواباتون بسیار ممنونم.

hoseinpoo
شنبه 29 تیر 1392, 22:31 عصر
بله! دقیقا. همین برنامه است که gcc را داره.

hoseinpoo
شنبه 29 تیر 1392, 23:01 عصر
من اینجا نمونه‌های خیلی ساده از فایل‌های .l و .y را قرار دادم.
با توجه به اینکه اسکنرتون به درستی کار می‌کرده، پس فایل .l را قطعا درست نوشته بودید ولی به این نکته توجه کنید که الان باید اسکنر و پارسر با هم لینک بشن، پس باید قسمت‌هایی را که احیانا توی فایل .l براشون printf نوشتید را به جای printf، الان return کنید و بعد توی فایل .y اونا را به عنوان token تعریف کنید.
برای اینکه بهتر متوجه بشید فایلی را هم که قبل از نوشتن پارسر به عنوان loghavi.l نوشته شده بوده را هم ضمیمه کردم، (فقط ممکنه یه سری تغییراتی توی اسم token ها هم ایجاد شده باشه که زیاد مهم نیست) می‌تونید اونو با فایل bnf.l که بعد از نوشتن پارسر نوشته شده، مقایسه کنید.

پی‌نوشت:
توی فایل bnf.y برای تست به دلیل کمی وقت، فقط گرامر را پرینت کردم! ولی در اصل برای یک پارسر واقعی نباید اینطور باشه، و باید اون کار اصلی را انجام بده.

hoseinpoo
شنبه 29 تیر 1392, 23:04 عصر
این هم فایل loghavi.l