استفاده از نشانه های غیر سمبولیک چیست؟

ساخت وبلاگ

نمادها در گرامرهای بیسون نشانگر طبقه بندی گرامری زبان هستند.

یک نماد ترمینال (همچنین به عنوان یک نوع توکن نیز شناخته می شود) یک کلاس از TOKENS از نظر نحوی را نشان می دهد. شما از نماد در قوانین دستور زبان استفاده می کنید به این معنی که یک نشانه در آن کلاس مجاز است. این نماد توسط یک کد عددی در تجزیهگر بیسون نشان داده شده است ، و عملکرد yylex یک کد نوع توکن را برمی گرداند تا نشان دهد چه نوع نشانه ای خوانده شده است. لازم نیست بدانید که مقدار کد چیست؟می توانید از نماد برای ایستادگی در آن استفاده کنید.

یک نماد غیرقانونی مخفف یک کلاس از گروه های معادل نحوی است. نام نماد در نوشتن قوانین گرامر استفاده می شود. طبق کنوانسیون ، باید همه مورد پایین باشد.

نام های نماد می توانند حاوی حروف ، تأکیدات ، دوره ها و رقم های غیر جیهی و خطوط باشند. Dashes in Name Symbol یک پسوند GNU است که با POSIX YACC ناسازگار است. دوره ها و داشها نام نمادها را برای استفاده از منابع نامگذاری شده راحت تر می کند ، که نیاز به براکت ها در اطراف چنین نام هایی دارند (به منابع نامگذاری شده مراجعه کنید). نمادهای ترمینال که حاوی دوره ها یا خطوط هستند ، معنی کمی ندارند: از آنجا که آنها نمادهای معتبری نیستند (در اکثر زبان های برنامه نویسی) به عنوان نام های نشانه صادر نمی شوند.

سه روش نوشتن نمادهای ترمینال در دستور زبان وجود دارد:

 

  • یک نوع توکن نامگذاری شده با یک شناسه ، مانند شناسه در C. توسط کنوانسیون ، نوشته شده است ، باید همه موارد بزرگ باشد. هر نام این اسم را باید با اعلامیه بیسون مانند ٪ توکن تعریف کرد. به نام های نوع توکن مراجعه کنید.
  • یک نوع نشانه شخصیت (یا نشانه شخصیت تحت اللفظی) با استفاده از همان نحوی مورد استفاده در C برای ثابت شخصیت در دستور زبان نوشته شده است. به عنوان مثال ، '+' یک نوع نشانه شخصیت است. یک نوع نشانه شخصیت نیازی به اعلام نیست مگر اینکه شما نیاز به مشخص کردن نوع داده ارزش معنایی آن داشته باشید (به انواع داده های معنایی مراجعه کنید) ، همبستگی یا تقدم (به Operedence Operator مراجعه کنید).

     

طبق کنوانسیون ، یک نوع نشانه شخصیت فقط برای نشان دادن نشانه ای که از آن شخصیت خاص تشکیل شده است استفاده می شود. بنابراین ، نوع " +" برای نشان دادن شخصیت " +" به عنوان یک نشانه استفاده می شود. هیچ چیز این کنوانسیون را تقویت نمی کند ، اما اگر از آن جدا شوید ، برنامه شما خوانندگان دیگر را گیج می کند.

تمام توالی های فرار معمول مورد استفاده در لفظات شخصیت در C می توانند در Bison نیز مورد استفاده قرار گیرند ، اما شما نباید از شخصیت تهی به عنوان یک شخصیت تحت اللفظی استفاده کنید زیرا کد عددی آن ، صفر ، نشانگر پایان ورودی است (به کنوانسیون فراخوانی Yylex مراجعه کنید). همچنین ، بر خلاف استاندارد C ، Trigraphs معنای خاصی در لفظات شخصیت بیسون ندارد ، و همچنین Backslash-Newline مجاز نیست.

شما می توانید با استفاده از اعلامیه ٪ توکن ، توکن رشته تحت اللفظی را با یک نام نمادین به عنوان یک نام مستعار مرتبط کنید (به نام های نوع توکن مراجعه کنید). اگر این کار را نکردید ، آنالایزر واژگانی مجبور است کد توکن را برای نشانه رشته تحت اللفظی از جدول yytname بازیابی کند (به کنوانسیون فراخوانی Yylex مراجعه کنید).

هشدار: نشانه های رشته تحت اللفظی در YACC کار نمی کنند.

طبق کنوانسیون ، یک نشانه رشته تحت اللفظی فقط برای نشان دادن نشانه ای که از آن رشته خاص تشکیل شده است استفاده می شود. بنابراین ، شما باید از نوع توکن استفاده کنید "

تمام توالی های فرار مورد استفاده در لفظات رشته ای در C می توانند در Bison نیز استفاده شوند ، به جز این که شما نباید از یک شخصیت تهی در یک رشته رشته استفاده کنید. همچنین ، بر خلاف استاندارد C ، Trigraphs در لفظات رشته های بیسون معنای خاصی ندارد و همچنین Backslash-Newline مجاز نیست. یک نشانه رشته تحت اللفظی باید حاوی دو یا چند کاراکتر باشد. برای یک نشانه حاوی فقط یک کاراکتر ، از یک نشانه کاراکتر استفاده کنید (به بالا مراجعه کنید).

نحوه انتخاب شما برای نوشتن یک نماد ترمینال هیچ تاثیری در معنای دستوری آن ندارد. این فقط به جایی است که در قوانین ظاهر می شود و چه زمانی عملکرد تجزیه کننده آن نماد را برمی گرداند.

مقدار برگردانده شده توسط Yylex همیشه یکی از نمادهای ترمینال است ، به جز این که یک مقدار صفر یا منفی نشانگر پایان ورودی است. به هر روشی که در قوانین گرامر نوع توکن را بنویسید ، آن را به همان روش در تعریف Yylex می نویسید. کد عددی برای یک نوع توکن کاراکتر به سادگی کد عددی مثبت کاراکتر است ، بنابراین Yylex می تواند از مقدار یکسان برای تولید کد لازم استفاده کند ، اگرچه ممکن است شما نیاز به تبدیل آن به کاراکتر بدون امضا داشته باشید تا از ثبت نام در میزبان ها در جایی که کاراکتر است جلوگیری کنیدامضا شده استهر نوع توکن نامگذاری شده به یک کلان C در پرونده اجرای تجزیه کننده تبدیل می شود ، بنابراین yylex می تواند از این نام برای ایستادن در کد استفاده کند.(به همین دلیل دوره ها در نمادهای ترمینال معنی ندارند.) به کنوانسیون فراخوانی yylex مراجعه کنید.

اگر yylex در یک پرونده جداگانه تعریف شده است ، باید ترتیب دهید که تعاریف نوع نشانه در آنجا در دسترس باشد. هنگام اجرای BISON از گزین ه-d استفاده کنید ، به طوری که این تعاریف را در یک نام پرونده هدر جداگانه بنویسید . tab. h که می توانید در پرونده های منبع دیگری که به آن نیاز دارند ، درج کنید. مراجعه به بیسون را ببینید.

اگر می خواهید گرامری بنویسید که برای هر میزبان C استاندارد قابل حمل باشد ، باید فقط از نشانه های شخصیت غیر طبیعی گرفته شده از مجموعه اصلی اجرای استاندارد C. استفاده کنید. این مجموعه شامل ده رقم ، 52 مورد پایین و بالا است. حروف انگلیسی ، و شخصیت های موجود در رشته C-language زیر:

عملکرد yylex و bison باید از یک مجموعه کاراکتر سازگار و رمزگذاری برای نشانه های کاراکتر استفاده کند. به عنوان مثال ، اگر Bison را در یک محیط ASCII اجرا کنید ، اما برنامه حاصل را در محیطی که از یک شخصیت ناسازگار مانند EBCDIC استفاده می کند ، کامپایل و اجرا کنید ، ممکن است برنامه حاصل کار نکند زیرا جداول تولید شده توسط Bison مقادیر عددی ASCII را برای آنها فرض می کندنشانه شخصیت. این یک روش استاندارد برای توزیع نرم افزار است که شامل پرونده های منبع C است که توسط BISON در یک محیط ASCII تولید شده اند ، بنابراین نصب کننده هایی روی سیستم عامل هایی که با ASCII ناسازگار هستند باید قبل از تهیه آنها ، آن پرونده ها را بازسازی کنند.

خطای نماد یک نماد ترمینال است که برای بازیابی خطا محفوظ است (به بازیابی خطا مراجعه کنید). شما نباید از آن برای هر منظور دیگری استفاده کنید. به طور خاص ، yylex هرگز نباید این مقدار را برگرداند. مقدار پیش فرض توکن خطا 256 است ، مگر اینکه صریحاً 256 را به یکی از نشانه های خود با بیانیه ٪ توکن اختصاص دهید.

فارکس کاران ایران...
ما را در سایت فارکس کاران ایران دنبال می کنید

برچسب : نویسنده : ديناروند فهيمه بازدید : <-PostHit-> تاريخ : جمعه 19 خرداد 1402 ساعت: 21:14