Payamvdn/NorthPersian_fa_wiki huggingface dataset:
یک ترکیب کننده تجزیه گر در برنامه نویسی رایانه ای، یک تابع مرتبه بالا است که چندین تجزیه کننده (یا پارسر) را به عنوان ورودی می پذیرد و یک پارسر جدید را به عنوان خروجی برمی گرداند. در این زمینه، یک پارسر تابعی است که رشته هایی را به عنوان ورودی می پذیرد و ساختارهایی را به عنوان خروجی برمی گرداند، به عبارتی پارسر یک درخت تجزیه یا مجموعه ای از شاخص هایی است که نمایانگر مکان هایی در رشته است که تجزیه آن با موفقیت متوقف شده است. ترکیب کننده های پارسر از استراتژی تجزیه کننده کاهشی بازگشتی استفاده می کنند که ساخت و آزمایش ماژولار را تسهیل می کند. به این تکنیک تجزیه، تجزیه کننده ترکیبی می گویند. پارسرهای ساخته شده با استفاده از ترکیب کننده ها، خوانا، ماژولار و ساختار یافته و همچنین ساده در مراحل ساخت و نگهداری هستند. از کاربردهای گسترده آن نمونه سازی کامپایلرها و پردازنده ها برای زبان های خاص دامنه (به انگلیسی: DSL) مانند واسط های زبان طبیعی به پایگاه داده ها، که در آن اقدامات معنایی پیچیده و متنوعی به همراه پردازش نحوی انجام می شوند، می باشد. در سال ۱۹۸۹، ریچارد فراست و جان لانچبروری نشان دادند که از ترکیب کننده های
تجزیه گر می توان برای ساختن مفسرهای زبان طبیعی استفاده کرد. همچنین گراهام هاتن در سال ۱۹۹۲ از توابع مرتبه بالا در تجزیه کننده های پایه استفاده کرد. به علاوه S.D. Swierstra جنبه های عملی ترکیب کنندهٔ تجزیه گر را در سال ۲۰۰۱ به نمایش گذاشت. در سال ۲۰۰۸، فراست، هافیز و کالاهان مجموعه ای از ترکیب کننده های تجزیه گر را در زبان هسکل که مشکل دیرینه تطابق بازگشت چپ را حل می کرد، و به عنوان یک ابزار کامل تجزیه کننده از بالا به پایین در زمان و فضای چند جمله ای کار می کرد را تعریف کردند. ایده اولیه. در هر زبان برنامه نویسی دارای توابع کلاس اول، می توان از ترکیب کننده های تجزیه گر با ترکیب پارسرهای پایه برای ساخت پارسرهایی با قوانین پیچیده تر استفاده کرد. به عنوان مثال، یک قاعده تولید از یک دستور زبان مستقل از متن (به انگلیسی: CFG) ممکن است یک یا چند جایگزین دیگر داشته باشد و هر جایگزین ممکن است شامل یک توالی از غیرپایانه(ها) و پایانه(ها) باشد یا این که می تواند یک غیرپایانه یا پایانه یا یک رشته خالی باشد. اگر یک پارسر ساده برای هر یک از این جایگزین ها وجود داشته باشد، می توان از یک ترکیب کنندهٔ تجزیه گر برای ترکیب هر ی
ک از این پارسرها استفاده کرد و یک پارسر جدید که می تواند هر جایگزینی را تشخیص دهد را برگرداند. در زبانهایی که از سربارگذاری عملگرها پشتیبانی می کنند، یک ترکیب کننده تجزیه گر می تواند به صورت یک عملگر میانود که برای به هم پیوستن چند پارسر مختلف که جهت ایجاد یک قانون کامل از آن استفاده می شود، به کار برود. بدین جهت ترکیب کننده های تجزیه گر پارسرها را به سبکی تعبیه شده، مشابه ساختار قواعد دستور زبان صوری تعریف می کنند. ترکیب کننده ها. برای ساده نگه داشتن بحث، ترکیب کننده های تجزیه گر را فقط به عنوان تشخیص دهنده ها بررسی می کنیم. اگر رشته ورودی از طول codice_1 و حرف های آن از طریق شاخص codice_2 قابل دسترسی باشند، تشخیص دهنده یک پارسر است که به عنوان خروجی مجموعه ای از شاخص هایی را برمی گرداند که نمایانگر موقعیت هایی هستند که پارسر دنباله ای از توکن ها را که از شاخص j شروع می شود را با موفقیت تشخیص داده است؛ بنابراین اگر خروجی یک مجموعهٔ خالی باشد، نشان می دهد که تشخیص دهنده نتوانسته هیچ دنباله ای را که از شاخص codice_2 شروع می شود، تشخیص دهد. در غیر این صورت خروجی نشان دهندهٔ آن است که تشخیص دهنده در موقعیت های م
تفاوت به پایان می رسد. باید در نظر گرفت که ممکن است چندین روش متمایز برای تجزیه یک رشته وجود داشته باشد به صورتی که به یک شاخص مشترک منتهی می شوند؛ این اتفاق نشان می دهد گرامر مبهم است. تشخیص دهنده های ساده این ابهامات را نمی توانند شناسایی کنند چون هر شاخص انتهایی احتمالی فقط یک بار می تواند در مجموعه نتایج خروجی ذکر شود؛ به همین دلیل برای داشتن نتایج کامل تر، باید یک ساختار پیچیده تر مانند یک درخت تجزیه به عنوان خروجی برگردانده شود. در ادامه دو ترکیب کننده تجزیه گر برای جایگزینی و توالی یابی تعریف کنیم، ابتدا فرض می کنیم codice_10 و codice_11 ، دو تشخیص دهنده پایه باشند: مثال. یک گرامر مستقل از متن مبهم را در نظر بگیرید، codice_18 . با استفاده از ترکیب کننده ای که بالاتر تعریف کردیم، می توانیم به صورت ماژولار، نمادهای اجرایی این دستور زبان را با استفاده از یک زبان کاربردی مدرن (مثلاً هسکل) به صورت codice_19 تعریف کنیم. وقتی که تشخیص دهنده codice_20 بر روی یک دنباله ورودی codice_21 در موقعیت codice_22 اعمال شود با توجه به تعاریف فوق، خروجی codice_23 را برمی گرداند. کاستی ها و راه حل ها. ترکیب کننده های تجزیه
گر، مانند همه تجزیه کننده های کاهشی بازگشتی، محدود به دستور زبان های مستقل از متن نیستند، بنابراین هیچ جستجوی سراسری برای ابهامات موجود در مجموعه Firstk و Followk در تجزیه کننده ال ال انجام نمی دهد؛ بنابراین، ابهامات فقط در زمان اجرا و زمانی که ورودی ها مقدار دهی می شوند، مشخص می شوند. در چنین مواردی، تجزیه کننده کاهشی بازگشتی می تواند به صورت پیش فرض (که ممکن است برای طراح گرامر ناشناخته باشد) به یکی از مسیرهای مبهم احتمالی منجر شود و باعث سردرگمی معنایی در استفاده از زبان شود. این موضوع باعث ایجاد اشکالاتی توسط کاربران زبان های برنامه نویسی مبهم می شود، که در زمان کامپایل گزارش نشده اند، و به عنوان خطای انسانی معرفی نمی شوند بلکه به عنوان دستور زبان مبهم معرفی می شوند. تنها راه حلی که این اشکالات را از بین می برد، رفع ابهامات و استفاده ازدستور زبان های مستقل از متن است. پیاده سازی های ساده ترکیب کننده های تجزیه گر دارای کاستی هایی هستند که در تجزیه کنندهٔ بالا به پایین هم رایج است. تجزیه کننده ترکیبی ساده (به انگلیسی: Naïve combinatory parsing)، هنگام تجزیهٔ دستور زبان مستقل از متن مبهم به زمان و فضای نمای
ی نیاز دارد. در سال ۱۹۹۶، فراست و Szydlowski نشان دادند که با مموایز کردن در استفاده از ترکیب کننده های تجزیه گر می توان پیچیدگی زمانی را به چند جمله ای کاهش داد. مدتی بعد فراست از مونادها برای ساخت ترکیب کننده ها در ریسه (به انگلیسی: thread)های قاعده دار و درست جدول یادداشت ها در طول محاسبه استفاده کرد. مانند هر تجزیه کننده کاهشی بازگشتی از بالا به پایین، ترکیب کننده های تجزیه گر معمولی (مانند ترکیب کننده های ذکر شده در بالا) در هنگام پردازش یک دستور زبان بازگشتی چپ خاتمه نمی یابند (به عنوان مثال codice_24). در سال ۲۰۰۶ یک الگوریتم تشخیص که دستور زبان مبهم را با قوانین مستقیم بازگشتی چپ تطبیق می داد ارائه شد. این الگوریتم تجزیه جداکننده بازگشتی چپ که نامتنهی است با تحمیل محدودیت های عمق، ساده کرد. در سال ۲۰۰۷، فراست، هفیز و کالاهااین الگوریتم را به یک الگوریتم تجزیه کننده کامل توسعه دادند، که در آن بازگشتی چپ غیرمستقیم مانند مستقیم در زمان چندجمله ای تطبیق می دهد، و هم چنین تعداد نمایی ای از درختان تجزیه برای گرامرهای مبهم را در فضای چندجمله ای و متراکم نمایش می دهد. این الگوریتم گسترش یافته، بازگشتی چپ غیرم
ستقیم را با مقایسه «متن محاسبه شده» با «متن فعلی»، مطابقت می دهد. همین نویسندگان همچنین پیاده سازی خود را در مورد مجموعه ای از ترکیب کننده های تجزیه گر که به زبان برنامه نویسی هسکل نوشته شده بودند رابر اساس همان الگوریتم توصیف کردند.
بهینه سازی حلقه در تئوری کامپایلر، فرایند افزایش سرعت اجرا و کاهش سربارهای مربوط به است. این فرایند نقش بسزایی در بهبود عملکرد حافظه نهان و استفاده مؤثر از قابلیت های پردازش موازی ایفا می کند. در واقع بیشترین زمان اجرای یک برنامه علمی در حلقه ها صرف می شود؛ و از این رو تکنیک های متعدد بهینه سازی کامپایلر برای اجرای سریعتر ایجاد شده اند. نمایش محاسبه ها و تبدیل ها. از آنجا که دستورالعمل های داخل حلقه ها می توانند به طور مکرر اجرا شوند، در اغلب موارد ارائهٔ یک کران برای تعداد اجراهای متأثر از بهینه سازی حلقه غیرممکن است. این مشکل بررسی به جا بودن و درستی بهینه سازی حلقه و مزایای آن را در سناریوهای مختلف، چالش برانگیز کرده است. بهینه سازی با انجام دنباله ای از تبدیل های حلقه. درعمل فرایند بهینه سازی حلقه را می توان اعمال دنباله ای از تبدیل های حلقه روی بازنمایی میانی دانست که هریک دارای محکی برای سنجش درستی و به جابودن هستند. یک تبدیل (یا دنباله ای از تبدیل ها) برای اینکه بتواند تضمین کند که کد حاصلش، نتیجهٔ کد اولیه را تولید خواهد کرد، به صورت کلی باید دنبالهٔ تمام وابستگی هایی که در ابتدا در کد بوده را حفظ کند
. علاوه بر آن بررسی مفید بودن یک تبدیل در این روش دشوار است چراکه ممکن است بکارگیری یک تبدیل نیازمند انجام چندین تبدیل دیگری باشد که خود آن ها سربار محاسباتی ایجاد کنند. در ادامه تبدیل های متداول حلقه به صورت فهرست وار آمده اند. چهارچوب تبدیل تکپیمانه ای. روش تبدیل تکپیمانه ای از یک ماتریس تک پیمانه ای برای توصیف نتیجهٔ اعمال دنباله ای از تبدیل های مذکور استفاده می کند. ایدهٔ اصلی این روش توصیف مجموعهٔ تمام اجراهای یک دستور در formula_1 حلقه به صورت یک مجموعه از نقاط با مختصات صحیح در فضای formula_1 بعدی است که این نقاط به ترتیب الفبایی اجرا می شوند. به عنوان مثال اجراهای یک گزاره که در دو حلقهٔ تودرتو با متغیر پیمایندهٔ بیرونی i و درونی j به صورت دوتاییformula_3 مدل می شود. یک تبدیل تک پیمانه ای متناظر با ضرب نقاط این فضا توسط ماتریس های تبدیل است. مثلاً ماتریس مربوط به جابه جایی حلقهٔ بیرونی با درونی formula_4 است. به صورت کلی یک تبدیل تک پیمانه ای زمانی صحیح است که تمام دنباله وابستگی های زمانی را حفظ کند. دشوارتر از آن، بررسی تأثیر تبدیل تک پیمانه ای را روی کارایی است. به این دلایل حلقه های تودرتوی معیوب
و تبدیل هایی مثل بخشبندی به راحتی در این چهارچوب قابل انجام نیستند. چهارچوب چندوجهی یا مبتنی بر شرط. مدل چندوجهی گسترهٔ وسیعتری از کدها و تبدیل ها را درمقایسه با چهارچوب تک پیمانه ای پوشش می دهد. در این چهارچوب مجموعه اجراهای یک دسته از دستورها داخل حلقه های تودرتوی معیوب به صورت اجتماعی از چندوجهی هایی مدل می شود که اجرای دستورها را نشان می دهند. در ادامه تبدیل های آفین، روی این چندوجهی ها اعمال می شود و توصیفی از ترتیب اجرای جدید بدست می آید. مرزهای چندوجهی ها، وابستگی های داده ای و تبدیل ها معمولاً توسط تعدادی شرط بیان می شوند و از این رو این چهارچوب را مبتنی بر شرط می نامند. برای مثال یک دستور در حلقهٔ تودرتو با حلقهٔ بیرونی " و حلقهٔ داخلی " را درنظر بگیرید که به ازای هر جفت formula_3 که formula_6 و formula_7 اجرا شود. مجدداً تکرارمی شود که یک تبدیل زمانی به جا است که دنبالهٔ زمانی وابستگی ها را حفظ کند. همچنین تخمین بهره وری یک تبدیل یا یافتن بهترین تبدیل برای یک مجموعه کد روی یک کامپیوترکماکان موضوع پژوهش های امروزه است (زمان نوشتار متن ۲۰۱۰).
در گراف های جهت دار، زمانی می گوییم گره formula_1 بر گره formula_2 غلبه می کند که به ازای هر گره formula_3 همه مسیر ها از formula_3 به formula_2، از گره formula_1 عبور کند. در نتیجه می توان گفت هر گره بر خودش غلبه می کند. با توجه به تعریف می توان برای هر گره مجموعه ای از گره های سلطه گر در نظر گرفت که بر این گره غلبه می کنند. همچنین می توان برای هر گراف یک درخت سلطه گر تعریف کرد که به ازای هر گره در گراف، اجداد این گره در درخت، گره های سلطه گر بر این گره در گراف هستند. بنابر تعریف می توان برای سلطه گری اکید نتیجه گرفت که نزدیک گره سلطه گر اکید برای هر گره یکتا بوده و یک گره برای آن وجود دارد. تاریخچه و کاربرد. تعریف گره سلطه گر یا غالب برای اولین بار توسط ریس پروسر در مقاله ای تحت عنوان کاربردهای ماتریس بولی برای تحلیل نمودارهای جریان ارائه شد. او در این مقاله الگوریتمی برای پیدا کردن گره های سلطه گر ارائه نکرد و صرفاً آن را تعریف کرده. اولین الگوریتم برای این مساله ده سال بعد توسط ادوارد لوری و مدلاک ارائه شد. از کاربرد های آن می توان به زمینه های بهینه سازی برنامه، تولید کد، تست مدار اشاره کرد. همچنین در کا
مپایلر ها از اطلاعات حاصل از سلطه گری گره ها استفاده زیادی می شود. برای مثال یک کاربرد آن در کامپایلر برای پیدا کردن حلقه ها در بهینه سازی کد به کمک بلوک های پایه است. الگوریتم پیدا کردن گره های سلطه گر. با توجه به تعریف برای هر گره formula_3 اگر formula_17 برابر با مجموعه گره های سلطه گر بر گره formula_3 در نظر بگیریم آنگاه رابطه زیر را خواهیم داشت. formula_19در اینجا formula_20 برابر است با مجموعه تمام گره هایی که وارد گره formula_3 می شوند یعنی یک یال از سمت آنها به formula_3 وجود دارد. همچنین برای گره شروع در گراف داریم formula_23 با داشتن این اطلاعات برای پیدا کردن گره های سلطه گر هر گره در گراف می توان الگوریتم زیر را پیاده سازی کرد. // n0 : start node for n in graph - {n0}: Dom[n] = graph changed = True while changed: changed = False for n in graph: new = [] for p in preds(n): new = intersection(new, Dom[p]) new = new + [n] if new != dom[n]: dom[n] = new changed = True این الگوریتم در زمان اجرای formula_24 تمام مجموعه های سلطه گر را می یابد که می توان با استفاده از داده ساختار های خاص زمان اجرا را بهتر
کرد. الگوریتم دیگری توسط رابرت تارجان و توماس لینگوار ارائه شده که به وسیله الگوریتم جستجوی اول عمق (الگوریتم dfs) در زمان تقریباً خطی این کار را انجام می دهد. الگوریتم پیدا کردن گره های سلطه گر مرزی. با توجه به تعریف برای گره سلطه گر مرزی می توان رابطه های زیر را بدست آورد. formula_25 که در اینجا formula_26 همان مجموعه گره های سلطه گر مرزی formula_2 است و formula_28 برابر مجموعه گره هایی است که formula_2 بر آن ها غلبه می کند و formula_30 برابر است با formula_31. همچنین برای formula_32 که formula_33 یک مجموعه است داریم formula_34 که اینجا formula_35 برای گره formula_36 برابر است مجموعه تمام گره هایی که از formula_36 به آنها در گراف جهت دار مسیر وجود دارد. با این رابطه ها می توان رابطه زیر را بدست آورد. formula_38 که در اینجا formula_39 فرزندان formula_2 در درخت سلطه گر اند. formula_41 برابر است با تمام formula_42 که formula_2 بر آنها را به صورت اکید غلبه نمی کند. formula_44 زیر مجموعه ای از formula_45 است که formula_2 بر آنها به صورت اکید غلبه نمی کند. با توجه به این رابطه الگوریتم زیر بدست می آید. def FindD
F(v): DF[v] = [] for w in children(v): FindDF(w) for u in DF[w]: if not strictly_dom(v,u): DF[v].append(u) for w in succ(v): if not strictly_dom(v,w): DF[v].append(w)
بافندهٔ جوانب ابزاری برای زبان های جنبه گرا هست که وظیفه دارد های برنامه را در ورودی بگیرد و کد نهایی را با استفاده از آنها تولید کند. بافنده با تلفیق جنبه ها و کلاس ها، ساختاری جدید به نام کلاس های بافته شده تولید می کند. استفاده این ابزار در مرحله پیش از کامپایل می باشد. دستورهای داده شده به بافنده ها نام دارند. این صوابدیدها با استفاده از ترکیبی از تعریف می شوند که تعیین می کنند کدام توابع باید توسط کد جنبه ها تکمیل شود. شیوهٔ دقیق تکمیل این توابع به خود جوانب برمیگردد. با این کار بافنده ها ابزاری ارزشمند برای ارتقای پودمانی هستند. انگیزه. زبان های متعدد وجود دارد که شناخته شده باشند اما انگیزه کافی برای طراحی و ساخت زبان های جنبه گرای جدید به علل اقتصادی وجود ندارد. استفاده از تکنولوژی کاملاً متفاوت نیاز به این دارد که شرکت ها برنامه نویسان جدید استخدام کنند، زنجیره ابزار های متفاوتی برای توسعه تهیه کنند و همچنین کدهای قبلی خود را رها کنند که همگی خرج های زیادی دربردارد. برای حل این معضلات در کنار داشتن برنامه نویسی جنبه گرا بافنده ها به ما این اجازه را می دهند که با اندکی تعمیم مانند از زبان پرکاربردی ما
نند جاوا استفاده کنیم. بجای طراحی یک زبان کاملاً جدید، بافنده پسوندهای تعریف شده توسط AspectJ را تفسیر می کند و کد جاوا را «می بافد» تا بتواند توسط هر جاوا کامپایلری استفاده شود. این تضمین می کند که هر کد شی گرا موجود، یک کد معتبر جنبه گرا نیز باشد و توسعه مانند روال عادی توسعه شیء گرا انجام شود. مثالی دیگر از اینگونه تعمیمات زبان است که تعمیمی جنبه گرا برای زبان ++C می باشد. پیاده سازی. همانطور که گفته شد، کار بافنده این است که با گرفتن دستورالعمل هایی از جنبه برنامه (همان صوابدید)، به صورت خودکار این دستورالعمل ها را در بین کلاس های موجود اعمال کند. در نتیجه کلاس هایی خواهیم داشت همنام کلاس های اصلی برنامه، اما با کدی متفاوت برای توابع. محل اضافه شدن این دستورالعمل ها توسط صوابدید تعیین می شود. در طی این عملیات بافنده ها اجازه اضافه شدن کدهایی را به برنامه می دهند که در غیر اینصورت به صورت اضافی در برنامه قرار می گرفتند. در نتیجه دیگر نیازی به دخالت برنامه نویس در پخش این کدها نیست. مثال. در کد AspectJ زیر، نقاط پیوست و کد کلاس شده جنبه، در قالبی شبیه کلاس جاوا پیاده شده اند. وظیفه بافنده این است که تنها یک
کلاس در انتها تولید کند که جنبه تعریف شده را در خود اعمال کرده باشد. مثال زده شده، قصد لاگ اندازی ورود به توابع را دارد. بدون وجود بافنده، برنامه نویس باید به صورت دستی تمام این لاگ ها را در توابع مورد نیاز قرار می داد، که مشخصا در یک برنامه ی واقعی امری به مراتب زمانگیر و کلافه کننده است. در هر تابع، با توجه به صوابدید کدی مختص آن تابع تولید می شود. برای افزایش کارایی کد، می توان آن را مستقیماً تبدیل به bytecode کرد، در واقع بافنده در نقش کامپایلر نیز عمل می کند. اما کار بافنده در این حالت پیچیده تر و زمانگیرتر می شود طبق انتظار. aspect Logging { pointcut method() : execution(* *(..)); before() : method() { System.out.println("Entering " + thisJoinPoint.getSignature().toString()); public class C { public void first() { System.out.println("Executing C.first()"); public void second() { System.out.println("Executing C.second()"); کد AspectJ بالا تبدیل به کد جاوای پایین می شود: public class C { public void first() { System.out.println("Entering C.first()"); System.out.println("Executing C.first()"); public void
second() { System.out.println("Entering C.second()"); System.out.println("Executing C.second()"); کارایی. عملکرد زمان کامپایل با استفاده بافنده ها به دلیل کار اضافی لازم برای پیدا کردن توابع مطابق با نقاط پیوست، به طور کلی از کامپایلر های سنتی معادل آنها بدتر است. یک مطالعه نشان داد که کامپایلر ajc که برای زبان AspectJ هست، حدود ۳۴٪ کندتر از کامپایلر Java 1.3 و حدود ۶۲٪ کندتر از کامپایلر جاوا ۱.۴ است.
گریندر د دوئال، شاعر و گردآورنده سه منظومه تاریخی «"منظومه انطاکیه"»، «"منظومه اورشلیم"» یا «فتح اورشلیم» و «"منظومه ناچیزان [اسیران مسیحی]"» است. از شرح حال وی اطلاع چندانی در دسترس نیست جز آن که وی در قرن ۱۲ میلادی و همزمان با لوئی هفتم، پادشاه فرانسه، زندگی می کرده و این سه منظومه بدو منسوب هستند. در واقع گریندر، اطلاعات بسیاری را از برخی وقایع نامه های جنگ صلیبی همچون "گشتا فرانکاروم" اقتباس نمود و در ویرایش. تدوین سه منظومهٔ مزبور به کار برد. همچنین، وی برخی از این اشعار حماسی را که به شکل شفاهی بر زبان مردم جاری بود، جمع آوری و مکتوب کرد و آنها را بازنگری نمود و به صورت متونی مدون درآورد که امروزه به "نخستین سیکل جنگ های صلیبی" معروف هستند. این سه اثر، شرح منظوم اعمال نخستین لشکرکشی صلیبیون به شرق هستند که عمدتاً با استفاده از اطلاعات و مشاهدات عینی سربازان صلیبی بازگشته به اروپا سروده شده اند.
گرامر صفت یک روش رسمی برای تعریف صفات متغیرها یا غیر پایانه های موجود در قواعد تولید یک دستور زبان رسمی می باشد، این صفات دامنه مقادیر غیر پایانه های قواعد تولید را تعیین می کنند. تعیین مقدار صفت در گره های درخت نحو تجزیه، هنگامی که زبان توسط برخی از تحلیلگرهای نحوی یا کامپایلر پردازش می شود، صورت می گیرد. این صفات دامنه مقادیر غیر پایانه های قواعد تولید را تعیین می کنند. بر اساس اینکه گره ها در درخت نحو از چه روشی برای گرفتن مقادیر خود استفاده می کنند، صفات به دو گروه ترکیبی و موروثی تقسیم می شوند. صفت های ترکیبی مقادیر خود را از مقدار صفات گره های فرزند خود می گیرند، در حالیکه صفت های موروثی مقادیر خود را از گره های والد یا گره های هم نیای خود دریافت می کنند. صفات ترکیبی اطلاعات معنایی را به گره های بالایی درخت تجزیه منتقل می کنند، در حالی که صفات موروثی به انتقال اطلاعات معنایی به گره های پایین و در سراسر آن کمک می کنند. به عنوان نمونه، هنگام ساختن یک ابزار ترجمه زبان، مانند کامپایلر، ممکن است برای اختصاص مقادیر معنایی به ساختارهای نحوی از این صفات استفاده شود. همچنین، می توان تحلیل معنایی دستور زبان را بر
رسی و مورد ارزیابی قرار داد. تحلیل معنایی گرامر زبان، قواعدی از زبان را نشان می دهد که به طور واضح با تعریف نحوی قابل بیان نمی باشد. از گرامر صفت نیز می توان به طور مستقیم برای ترجمه درخت نحو به کد برای برخی از زبان های میانی استفاده کرد. یکی از نقاط قوت دستور زبان صفت این است که آنها می توانند اطلاعات را به روشی کنترل شده و رسمی از هر کجای درخت نحو تجزیه به هر جای دیگر، منتقل کنند. تاریخچه. دستور زبان صفت توسط دونالد نوت (به انگلیسی: Donald Knuth) و پیتر وگنر (به انگلیسی: Pete Wegner) اختراع شده است. درحالیکه دونالد نوت مفهوم کلی گرامر صفت را مطرح کرده بود، پیتر وگنر مفهوم صفت موروثی را اختراع کرد. مثال. در ادامه یک گرامر مستقل از متن را مشاهده می کنید که زبان حاصل از آن، ضرب و جمع اعداد صحیح را توصیف کند. دستور زبان صفت زیر را می توان برای محاسبه نتیجه عبارتی که در دستور زبان نوشته شده است، استفاده کرد. توجه داشته باشید که این گرامر فقط از مقادیر صفات ترکیبی استفاده می کند و به همین دلیل به آن گرامر صفت S می گویند. صفت ترکیبی. یک صفت ترکیبی از مقادیر صفات گره های فرزندانش محاسبه می شود. از آنجا که ابتدا بای
د مقدار صفت گره های فرزند محاسبه شود، این فرایند به شکل پایین به بالا است. برای تعریف رسمی یک صفت ترکیبی، فرض کنید:formula_1 تعریف صوری یک دستور زبان باشد، تفسیر هر یک از نمادها به شرح زیر است: حال یک رشته از نمادهای غیر پایانه یا متغیرها(A) و یک صفت به نام a را در نظر بگیرید، A.a در صورت برقراری هر سه شرط زیر یک صفت ترکیبی است: صفت موروثی. صفت موروثی در یک گره درخت تجزیه با استفاده از مقادیر صفت در والدین یا خواهران و برادران بدست می آید. صفت های موروثی برای بررسی ساختار در یک زبان برنامه نویسی که در قالب قواعد تولید بیان شده است، مناسب می باشند. به عنوان مثال، می توانیم از یک صفت موروثی برای بررسی اینکه آیا یک شناسه در سمت چپ یا سمت راست یک رابطه نسبت دادن ظاهر می شود استفاده کنیم، تا تصمیم بگیریم که آیا آدرس یا ارزش شناسه لازم است یا خیر. برخلاف صفات ترکیبی، صفات موروثی می توانند مقادیر گره های والدین یا خواهران و برادران را بگیرند. برای مثال قاعدهٔ تولید زیر را در نظر بگیرید: در این قاعده، A می تواند مقادیر S ,B و C را بدست آورد، B می تواند مقادیر S ,A و C را بدست آورد. به همین ترتیب C می تواند مقادیر S ,
A و B را بگیرد.
در سال ۱۹۲۹ بورس اوراق بهادار نیویورک تنزل کرد. این تنزل، آغاز یک رکود اقتصادی بود که تا انتهای دهه ۱۹۳۰ ادامه داشت. خیلی زود، میلیون ها نفر بیکار شدند، بانک ها اعتبارات را محدود ساختند و بسیاری از مشاغل تعطیل شد. فاجعه ی کم وبیش همزمان و همپوشان و هم افزا با این بحران، خشکسالی طولانی و داست بول بود، که دشت بزرگ آمریکا را به آستانه ی نابودی کشاند و بیابان برهوت بزرگی از تگزاس تا داکوتای شمال و جنوبی ایجاد کرد. رکورد گسترده اقتصادی ایالات متحده در سال های ۱۹۳۵ تا ۱۹۴۳، فرانکلین دی. روزولت، رئیس جمهور آمریکا را ترغیب کرد تا از عملیات عکاسی فدرال حمایت مالی بکند تا دامنه ی کامل ویرانگری اقتصادی در ایالات متحده ثبت شود. او امیدوار بود که این تصاویر، حمایت وی از کشاورزان را تقویت نماید. چشمگیرترین نمونه ی این اقدامات به سال ۱۹۳۵ یعنی هنگامی که وزارت کشاورزی، روی استرایکر را برای بخش تاریخی اداره ی اسکان مجدد استخدام کرد برمی گردد. دو سال بعد، این عملیات تحت عنوان اداره حفاظت از مزارع یا FSA شناخته شد (FSA در سال 1942 به اداره ی اطلاعات جنگ یا OWI منتقل شد). استرایکر برنامه عکاسی را تا اکتبر ۱۹۴۳ رهبری کرد. عکاسانی
نظیر: واکر ایوانز، دوروتیا لنگ، راسل لی، بن شان، جان واشون، ماریون پست ولکات، کارل میدانز، گوردون پارکس، جان کالیر پسر و جک دلان در این فرایند مشغول به عکاسی مشغول بودند.
ریسترتو همان اسپرسو می باشد در حجم و اندازه کوچکتر و غلیظ تر مشابه اسپرسو می باشد که معنای اسپرسوی کوچک شده نیز تعبیر می شود. تلخی بیشتر از ویژگی های این نوشیدنی می باشد. یک فنجان ریسترتو ۲۰ میلی لیتر است. در واقع بزرگ ترین تفاوت اسپرسو و ریسترتو در حجم است. به طور کلی فرایند زمان عصاره گیری و حجم در ریسترتو کوتاه تر است. از نظر حجمی دو فنجان قهوه ریسترتو برابر یک فنجان اسپرسو می باشد. به عنوان مثال اگر میزان ۲۰ گرم پودر قهوه را درون پرتافیلتر دستگاه اسپرسو ساز بریزیم و عصاره گیری کنیم؛ اگر ۲۰ گرم عصاره بگیریم، ریسرتو به دست می آید، اگر ۴۰ گرم عصاره بگیریم، اسپرسو به دست می آید و اگر ۶۰ گرم عصاره بگیریم، لانگو به دست می آید.
پروتئین ۸ تثبیت کننده (قلاب کننده) کیناز آ () یک آنزیم است که در انسان توسط ژن «AKAP8» کُدگذاری می شود. این مولکول به بخش تنظیمی پروتئین کیناز آ می چسبد و آنرا وادار می کند تا در نواحی مجزایی از درون سلول باقی بماند. این پروتئین در مرحله اینترفاز در درون هسته سلول است و هنگام انجام میتوز به نقاط مشخصی منتقل می شود. این مولکول با MYCBP، تعامل پروتئین-پروتئین دارد.
لانگو یک نوع از انواع اسپرسو می باشد که نوشیدنی برخلاف ریسترتو و به میزان بیشتر نسبت به اسپرسو دارای عصاره گیری بیشتر و کافئین بیشتر در نتیجه حجم بیشتر می باشد.
پروتئین متصل شونده به C-myc () یک پروتئین است که در انسان توسط ژن «"MYCBP"» کُدگذاری می شود. این پروتئین به ریشه آمینی C-myc متصل می شود و رونویسی ژنتیکی وابسته به E box را در آن تحریک می کند.
زنجیره استفاده-تعریف یک ساختمان داده است که متشکل از استفاده یک متغیر و همه ی تعریف هایی از آن متغیر است که می تواند به آن استفاده بدون مداخله تعریف دیگری برسد. به طور کلی زنجیره استفاده-تعریف به معنی انتساب چند مقدار به یک متغیر است. همتای زنجیره استفاده-تعریف ، زنجیره ی تعریف-استفاده است که تشکیل شده است از یک تعریف یک متغیر و همه ی استفاده های آن که قابل دسترسی از آن استفاده بدون مداخله تعریف دیگری است. هر دوی زنجیره ی استفاده-تعریف و زنجیره ی تعریف-استفاده از یک فرم آنالیز ایستای برنامه به نام آنالیز جریان داده تشکیل شده اند. دانستن زنجیره های استفاده-تعریف و تعریف-استفاده برای یک برنامه یا زیربرنامه یک پیش نیاز برای چند بهینه سازی کامپایلر از جمله درهم کردن ثابت و حذف عبارت های مشترک است. هدف. درست کردن زنجیره ی استفاده-تعریف یا تعریف-استفاده یک گام برای تحلیل متغیر زنده است، که باعث می شود نمایش منطقی همه ی متغیرها شناخته شود و در کد ردیابی شود. تکه کد زیر را در نظر بگیرید: codice_1 که همانطور که در کد مشخص است متغیر x سه بار مقداردهی شده است.(در نقاط A, B, C) با این که در نقطه ای که با "1" مشخص شده است