معرفي دو ابزار توليد تحليلگر لغوي و تحليلگر نحوي
از هنگامي كه تحليگرهاي لغوي و تجزيهكنندهها با دست نوشته ميشدند ، ]كمكم و ناخودآگاه[ تحليلگرهاي لغوي و تجزيهكنندهها به طراحي يكساني رسيدند و طراحان فهميدند كه آنها را ميتوان با دادن شرحي از رفتار موردنظرشان ، به طور خودكار توليدكرد . نمونهاي از اين ابزارهاي خودكار كه برنامهنويسان را از كار خستهكنندهي نوشتن]دستي[ تحليلگر لغوي يا تجزيهكننده ، آسوده می کنند در زیر معرفی شده اند .
ابزار توليد کننده تحليلگر لغوي:
Lex :
Lex يك توليدكنندهي تحليلگر لغويست كه متن را براساس اطلاعات دادهشده در فايل مشخصه تحليل ميكند. اين مشخصهها كه در يك فايل ورودي متني براي Lexليست ميشوند ، عبارات باقاعدهاي را كه بايد تشخيص داده شوند ، تشريح ميكنند . اعمالي كه بايد روي موجوديتهاي تشخيصدادهشده اجرا شوند ، ميتوانند به فرم برنامههاي C ، به فايلمشخصه اضافهشوند . اين اعمال عيناً در برنامه C توليدشده توسط lex ، ثبتخواهدشد و ]بعد از[ يكبار كامپايل يك تحليلگرلغوي را براي فايلمشخصهي داده شده ، تشكيلخواهدداد . همهي كاراكترهاي تشخيصدادهنشده توسط تحليلگرلغوي ، عيناً در فايلِ خروجي كپي ميشود .
Lex تولیدکننده آنالیزهای لغوی است. خلاصه نحوه فراخوانی دستورات آن به شکل زیر است:
Lex [-tvnq] [file]
Lex برنامه هایی را تولید می کند که با استفاده از آن ها می توان تحلیل لغوی یک متن داده شده را انجام داد. برای این کار باید قوانین مربوط به یافتن اجزاء لغوی و انجام تحلیل را در قالب فایل هایی با قالب استاندارد به عنوان ورودی به Lex داد. این فایل ها در اصل مجموعه ای از action ها هستند که به زبان c می باشند و تعیین می کنند که Lex در قبال یافتن یک واحد لغوی تعریف شده و یا به عبارت دیگر یک عبارت (expression) باید چه عکس العملی نشان دهد.
در نهایت Lex یک برنامه به زبان C تولید می کند که این برنامه می تواند یک فایل نمونه را از ورودی دریافت نماید و با توجه به قوانین از پیش تعریف شده اجزاء مختلف را شناسایی می کند. این اجزاء یا در مجموعه قوانین تعریف شده برای Lex وجود دارند و یا نه. در صورت وجود عمل متناسب بررروی آن ها انجام می شود و در غیر این صورت عین جزء شناسایی شده به خروجی منتقل می گردد.
نکته ای که وجود دارد و باید به آن دقت شود این است که Lex تنها به شناسایی اجزاء لغوی و پردازش آن ها می پردازد و هیچ پردازشی را برروی الگوهای زنجیره های لغوی انجام نمی دهد.
ابزار توليد کننده تحليلگر نحوي :
از این ابزار ها میتوان به YACC و Bison اشاره کرد که Bison مورد بررسی قرار داده ایم .
Bison :
مقدمه :
Bison ، از يك گرامر ورودي ، يك برنامه C ميسازد كه بعد از كامپايل شدن ، يك تجزيهكننده توليد ميكند . اين تجزيهكننده ، زبان توصيف شده توسط گرامر را تشخيص ميدهد** . برنامهنويس بايد توسط Flex يك تحليلگرلغوي بسازد يا آن را به شكل دستي بنويسد . در فايل مشخصهي Bison ما ميتوانيم عملياتهايي به زبان C اضافه كنيم . هر زمان كه تطابقِ*** قاعدهيگرامري ]با دنبالهي توكنها[ تشخيص داده ميشود ، تجزيهكننده ، عمليات مربوط به آن قاعده را اجرا ميكند . با اين روش ميتوان يك كامپايلر كامل نوشت .
معمولاً تجزيهكنندههايي كه توسط Bison توليد ميشوند ، ساختار فايل ورودي را كه بايد از قواعدِگرامر داده شده به Bison پيروي كند ، بررسي ميكنند .
پس براي بكارگيري Bison يك فايلمشخصه]ي [Biosn بنويسيم . ساختار احتمالي فايل ورودي كه بايد تحليل شود ، ]شامل[ عملياتهايي كه بايد اجرا شود ، يك تحليلگر لغوي و اعلانات لازم ، خواهد بود .
Yacc در اصل برنامه ای است برای تولید پارسر ها. این برنامه یک syntax را به عنوان ورودی دریافت می کند و یک برنامه خروجی را تولید خواهد نمود که می تواند الگوهای زنجیره های لغوی را دریافت نموده و پردازش مناسب را برروی آن ها انجام دهد. این برنامه خروجی در اصل یک پارسر از نوع LALR است. عبارت LALR در اصل مخففی برای عبارت زیر است:
Look ahead, left to right, right most derivation producer with 1 look ahead token
در یک سلسه مراتب اجرا می توان گفت که ابتدا برنامه تولید شده توسط Lex اجزاء لغوی را شناسایی می نماید و سپس برنامه تولید شده توسط Yacc براساس اجزاء شناسایی شده نسبت به استخراج زنجیره های معنادار از این اجزاء شناخته شده اقدام می نماید.