نقل قول: command برای تولید پارسر
کافیه شما کدی که برای پارسر نوشتید را با پسوند .y ذخیره کنید. و اونو توی پوشهای قرار بدید که فایل bison.exe اونجا هست.
بعد با cmd به همون مسیر برید و این دستور را تایپ کنید:
bison -d filename.y
فقط به جای filename اسم فایل خودتون را بذارید.
به این ترتیب یه فایل c ایجاد میشه که به راحتی می تونید اجراش کنید.
نقل قول: command برای تولید پارسر
ایجاد کردم همین فایلی که میگین بعد تو کد بلاکم ازش ران گرفتم ولی هرکاری کردم اجرا نمیشه !!!!!!
نقل قول: command برای تولید پارسر
آهان! بله حق با شماست. یه قسمت را فراموش کردم بگم، فقط قبلش اینو بگم که دستور قبلی توی یه قسمتش اشتباه شده، دستور صحیح اینه:
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
باز هم اگر مشکلی بود (و البته بلد بودم) در خدمتم :)
نقل قول: command برای تولید پارسر
فقط یک سوال اگه از devcpp استفاده کنم باز باید از همین دستوره gcc filename.tab.c lex.yy.c -o parser.exe استفاده کنم؟
از جواباتون بسیار ممنونم.
نقل قول: command برای تولید پارسر
بله! دقیقا. همین برنامه است که gcc را داره.
1 ضمیمه
نقل قول: command برای تولید پارسر
من اینجا نمونههای خیلی ساده از فایلهای .l و .y را قرار دادم.
با توجه به اینکه اسکنرتون به درستی کار میکرده، پس فایل .l را قطعا درست نوشته بودید ولی به این نکته توجه کنید که الان باید اسکنر و پارسر با هم لینک بشن، پس باید قسمتهایی را که احیانا توی فایل .l براشون printf نوشتید را به جای printf، الان return کنید و بعد توی فایل .y اونا را به عنوان token تعریف کنید.
برای اینکه بهتر متوجه بشید فایلی را هم که قبل از نوشتن پارسر به عنوان loghavi.l نوشته شده بوده را هم ضمیمه کردم، (فقط ممکنه یه سری تغییراتی توی اسم token ها هم ایجاد شده باشه که زیاد مهم نیست) میتونید اونو با فایل bnf.l که بعد از نوشتن پارسر نوشته شده، مقایسه کنید.
پینوشت:
توی فایل bnf.y برای تست به دلیل کمی وقت، فقط گرامر را پرینت کردم! ولی در اصل برای یک پارسر واقعی نباید اینطور باشه، و باید اون کار اصلی را انجام بده.
1 ضمیمه
نقل قول: command برای تولید پارسر