المحلل اللغوي LL
المحلل اللغوي LL LL parser
محلل LL هو محلل من أعلى إلى أسفل تصميم أعلى أسفل وأسفل أعلى لمجموعة فرعية من قواعد السياق الحرcontext-free grammar]]s]] فإنه يقوم بتحليل المدخلات من اليسار إلى اليمين، ويبني الاستخلاص أقصى اليسار من الجملة (وبالتالي محلل LL، مقارنة مع محللLR). فئة القواعد التي تحلل على النحو هذا يقال عليه قواعد LL. 
ما تبقى من هذه المقالة يصف نوع الجدول الذي يستند إليه المحلل، والبديل هو محلل نزول تكراريالترميز التكراري النموذجي الذي يتم ترميزه عادة باليد (وإن لم يكن دائما، وانظر على سبيل المثال ANTLR لـ (*)LL مولد محلل نزول تكراري).
ويسمى محلل LL محلل (k) LL إذا كان يستخدم الرموز K للاستباق عند تحليل الجملة. إذا كان هذا المحلل موجود لقواعد معينة، ويمكنه تحليل جمل هذه القواعد بدون تراجع فهو يسمى قواعد LL(k). اللغة التي لديها قواعد LL(k) تسمى لغة LL(k). وهناك لغات LL(k+n) التي ليست لغات LL(k). [1] والنتيجة لذلك هو أن ليس كل لغات السياق الحر هي لغات LL(k).
قواعد [[LL (1) LL(grammars شعبية جدا لأن المحلل LL المقابل يحتاج فقط لإلقاء نظرة على الرمز التالي لاتخاذ قرارات التحليل. الغات التي تستند إلى قواعد مع قيمة مرتفعة من k اعتبرت تقليديا [who?] [من?] صعبة التحليل، رغم أن هذا يعتبر نوعا ما غير صحيح الآن، نظرا لتوافر والتوسع في نطاق الاستخدام [citation needed] لمولدات المحلل الذي يدعم قواعد LL(k) لـ k الأعتباطى.
ويسمى محلل LL محلل (*)LL محلل إذا لم يقتصر على الرموز K للاستباق، ولكن يمكنه اتخاذ قرارات التحليل عن طريق التعرف على ما إذا كانت الرموز التالية تنتمي إلى لغة عادية (على سبيل المثال عن طريق استخدام أوتوماتيكية محدودة القطعية.
و هناك خلاف بين "المدرسة الأوروبية" لتصميم اللغة، والذين يفضلون الاستناد على قواعد LL، وبين " مدرسة الولايات المتحدة "، الذين يفضلون في الغالب الاستناد على قواعد [[LR. [[citation needed]] وهذا يرجع إلى حد كبير لتقاليد التدريس وتفاصيل وصف أساليب وأدوات في بعض الكتب المدرسية ؛ التأثير الآخر قد يكون نيكلاوس ويرث في أي تي أتش زيوريخ في سويسرا، الذي بحوه وصف عدد من الطرق لتحسين لغات ومترجمينLL(1)..
المحلل يعمل على سلاسل من قواعد السياق الحر[[context-free grammar]].
المحلل يتكون من
المحلل يطبق الحكم الذي يجده في الجدول عن طريق مطابقة الرمز أعلى المكدس (صف) مع الرمز الحالي في تدفق المدخلات (العمود).
عندما يبدأ محلل، المكدس يحتوي بالفعل على رمزين :
[ S, $ ]
حيث '$' هو محطة طرفية خاصة للإشارة إلى أسفل المكدس ونهاية تدفق المدخلات، و'S' هو رمز البداية للقاعدة. المحلل سوف يحاول إعادة كتابة محتويات هذا المكدس على ما يراه على تدفق المدخلات. ومع ذلك، فإنه يحتفظ فقط في مكدس على ما هو ما زال بحاجة إلى إعادة صياغة.
لتفسير كيف يعمل، سوف ننظر للقاعدة الصغيرة التالية :ونقوم بتحليل المدخلات التالية :
جدول التحليل لهذه القواعد تبدو على النحو التالي :
في كل خطوة، المحلل يقرأ الرمز المتاحة التالي من تدفق المدخلات، وأعلى رمز من المكدس. إذا كان رمز المدخلات والرمز أعلى المكدس متطابقان، محلل سوف يتجاهلهم على حد سواء، ويبقي على الرموز التي لا متطابقة في تدفق المدخلات وعلى المكدس.
وهكذا، في الخطوة الأولى، المحلل يقرأ رمز الإدخال ')' والرمز أعلى المكدس'S'. تعليمات جدول التحليل تأتي من العمود الذي على رأسه رمز الإدخال ')' والصف الذي على رأسه المكدس الذي أعلاه 'S'؛ هذه الخلية تحتوي '2"الذي يوجه المحلل لتطبيق القاعدة (2) ويجب على المحلل إعادة كتابة. 'S' إلى '(S + F)' على المكدس ويكتب القاعدة رقم 2 على المخرجات والمكدس سوف يصبح هكذا :
حيث الرمز '(' من تدفق المدخلات لم يتطابق مع الرمز الأعلى، 'S'، من المكدس، لم يتم إزالته، ويبقى الرمز المتاح المقبل في المدخلات للخطوة التالية.
في الخطوة الثانية، المحلل يزيل ')' من تدفق مدخلاته ومن المكدس، نظرا لأنها متطابقة يصبح المكدس الآن :
الآن المحلل عنده 'a' على تدفق مدخلاته و's' في أعلى المكدس. جدول التحليل يرشد إلى تطبيق القاعدة (1) من قواعد اللغة وكتابة القاعدة رقم 1 إلى تدفق الإخراج. المكدس يصبح :
الآن المحلل عنده 'a' على تدفق مدخلاته و'f' في أعلى المكدس. جدول التحليل يرشد إلى تطبيق القاعدة (3) من قواعد اللغة وكتابة القاعدة رقم 3 إلى تدفق الإخراج. المكدس يصبح ::
في الخطوتان المقبلتان المحلل يقرأ 'a' و'+ من jدفق المدخلات و، نظرا لأنهما متطابقان فالبندين التاليين على المكدس، يزيلهما أيضاً من المكدس وهذا ينتج:
في الخطوات الثلاث القادمة سوف يقوم المحلل باستبدال ' F' على مكدس بـ ' a' ،و يكتب القاعدة رقم 3 إلى تدفق الإخراج وإزالة 'a' و')' من كلا من المكدس وتدفق المدخلات. وبذلك ينتهي المحلل بـ '$' على حد سواء في مكدس وتدفق المدخلات.
في هذه الحالة المحلل سوف يقوم بعمل التقرير إلى أنه وافق على سلسلة المدخلات ويكتب القائمة التالية من عدد القواعد إلى تدفق الإخراج :
هذا في الواقع هو قائمة من القواعد للاستخلاص أقصى اليسار[[leftmost derivation]] من سلسلة المدخلات، والتي هي كالتالي:
ما يلي يتبع تنفيذ C++ على أساس جدول محلل LL للغة في المثال التالي :
وكما يتبين من المثال أن المحلل اللغوي ينفذ ثلاثة أنواع من الخطوات اعتمادا على ما إذا كان الجزء العلوي من المكدس محطة غير طرفية أو طرفية أو رمز خاص $ :وتتكرر هذه الخطوات حتى يتوقف المحلل، وبعد ذلك سوف تكون النتيجة إما أن تحليل المدخلات تم ويكتب الاستنتاج أقصى اليسار إلى تدفق الإخراج أو سيفيد أن هناك خطأ حدث.
من أجل ملء جدول التحليل، يجب علينا ان نقرر القاعدة التي يجب أن يختارها المحلل إذا رأى المحطة الغير طرفية A أعى المكدس من ورمزa على تدفق المدخلات. فمن السهل أن نرى أن هذه القاعدة ينبغي أن تكون على شكل A → w واللغة الموافقة ل w يجب أن يكون لديها على الأقل سلسلة واحدة تبدءا من a لهذا الغرض نحدد أول مجموعة من w، كتبت هنا Fi(w)، كمجموعة من المحطات الطرفية التي يمكن العثور عليها في بداية أي سلسلة فيw، بإضافة ε إذا كانت السلسلة الفارغة أيضا تنتمي إلى w يعطى القواعد مع الأحكام A1 → w1..., An → wn، يمكننا حساب Fi(wi) وFi(Ai) لكل قاعدة كما يلي:
1. نبدأ كلFi(wi) وFi(Ai) مع المجموعة الفارغة
2. نضيف Fi(wi) على Fi(Ai) لأي حكم Ai → wi، حيث Fi يتم تعريفها على النحو التالي :
o Fi(a w') = { a } for every terminal a لكل محطة طرفية
o Fi(A w') = Fi(A) for every nonterminal A with ε not in Fi(A) لكل محطة طرفية a مع ε ليست في 
o Fi(A w') = Fi(A) \ { ε } ∪ Fi(w') for every nonterminal A with ε in Fi(A) لكل محطة غير طرفية aمع ε في
3. أضف Fi(wi) إلى Fi(Ai) لكل قاعدة Ai → wi
4. كرر الخطوات 2 و3 حتى كافة مجموعات Fi تبقى متساوية.
وللأسف، فإن المجموعات الأولى ليست كافية لحساب جدول التحليل، لأن الجزء اليمين w من القاعدة قد يكتب أخيراً لسلسلة فارغة. لذلك فإن المحلل ينبغي أن يستخدم القاعدة A → w إذا ε في Fi(w) وترا على تدفق الإدخال الرمز الذي يمكن أن يتبع a ولذلك نحن بحاجة أيضا المجموعة التابعة لـ A، تكتب هنا Fo(A)، التي تعرف على أنها مجموعة من المحطات الطرفية a ومن هذا القبيل هناك سلسلة من الرموز αAaβ التي يمكن استخلاصها من رمز البداية. ويمكن أن يتم احتساب المجموعات التابعة للمحطات الغير طرفية في القواعد على النحو التالي :
1. نبدأ كل Fo(Ai) مع المجموعة الفارغة
2. إذا كان هناك قاعدة للنموذج Aj → wAiw'، إذا
3. كرر الخطوة 2 حتى كل مجموعات Fo تبقى متساوية.
الآن يمكن أن نحدد بالضبط أي القواعد التي سوف ترد في جدول التحليل. إذا T[A, a] تشير إلى الدخول في الجدول لمحطة غير طرفية A وطرفية a، إذا
T[A،a]يحتوي على مادة A → w إذا وفقط إذا كانت
a في Fi(w) أو 
ε في Fi(w) وFo(A)
إذا كان الجدول يحتوي على قاعدة واحدة على أكثر في كل خلية من خلاياه ،إذا المحلل سوف يعرف دائما أي قاعدة يجب أن يستخدمها وبالتالي يمكن تحليل السلاسل بدون تراجع. في هذه الحالة على وجه التحديد القاعدة تسمى قاعدة LL(1).
حتى منتصف التسعينات، وكان يعتقد على نطاق واسع أن LL(k) تحليل لـ (k > 1) كان غير عملياً [citation needed]، إذ أن جدول التحليل سيكون حجمه هائل في k في أسوأ الأحوال. وهذا المفهوم تغيير تدريجيا بعد إصدار PCCTS في حوالي عام 1992، عندما اتضح أنه يمكن تحليل العديد من لغات البرمجة بكفاءة من خلال المحلل LL(k) من دون التسبب في أعمال أسوأ الحالات للمحلل اللغوي. وعلاوة على ذلك، في بعض حالات تحليل LL مجدية حتى مع الاستباق غير المحدود. على النقيض من ذلك، مولدات المحلل التقليدي، مثل [[ياك (برنامج)|yacc]] يستخدم جدول تحليل LALR(1) لبناء محلل LR المقيد مع استباق رمز ثابت واحد.
كما هو موضح في المقدمة، [[محللات]](1) LL تتعرف على اللغات ذات قواعد(1) LL، والتي هي حالة خاصة من قواعد السياق الحر (CFG's)؛ محللات(1) LL لا يمكن أن تتعرف على كل لغات السياق الحر. لغات(1) LLهي بالضبط تلك التي يتم التعرف عليها بتأكيدية التشغيل الذاتي التنازلى deterministic pushdown automata الذي يقتصر على حالة واحدة. من أجل [[CFG]] أن تكون قاعدة (1) LL، يجب أن لا تنشأ تعارضات معينة، التي وصفناها في هذا القسم.
لتكونA محطة غير طرفية. أولاً A (تعرف لتكون) مجموعة من المحطات الطرفية التي يمكن أن تظهر في المركز الأول لأي سلسلة مستمدة من A. يتبع (A) الاتحاد الفوقي أولاً (B) حيث B هي أي محطة غير طرفية التي تليA مباشرة في الجانب الأيمن من قاعدة الإنتاج.
هناك 3 أنواع من تعارضات LL(1) : 
أول مجموعات من تقاطع محطتين غير طرفيتين مختلفتين.
المجموعة الأولى والمجموعة التابعة للقواعد المتداخلة. مع ابسيلون في المجموعة الأولى وهو غير معروف أي بديل تختار.
مثال على تعارض LL(1):
المجموعة الأولى من A الآن { 'a' epsilon } والمجموعة التابعة { 'a' }.
و التكرار من اليسار سوف يسبب تعارض أول / أول مع جميع البدائل.
عامل يسار مشترك يكون خارج الحسبان مثل 3x + 3y = 3(x+y).
 A -> X | X Y Z
يصبح
يمكن تطبيقه عندما يبدأ بديلين بنفس الرمز مثل تعارض أول/أول
استبدال قاعدة مكان قاعدة أخرى لإزالة غير مباشرة أو تعارض الأولى / التالي. لاحظ أن هذا قد يؤدي إلى تعارض الأول/ أول.
مثال بسيط لإزالة التكرار من اليسار قاعدة الإنتاج التالية تركت التكرار على E
هذه القاعدة ليست سوى مجموعة من الـ T منفصلة بـ '+' في شكل تعبير عادي T ('+' T)* لذا يمكن إعادة كتابة الحكم هكذا
الآن لا يوجد أي تكرار من اليسار ولا تعارضات على أي من القواعد.
ومع ذلك، ليس كل CFGs لديها قواعد مساوية لـقواعد LL(k)، على سبيل المثال :
ويمكن أن نتبين أن ليس هناك أي قاعدة LL(k)، تقبل اللغة المولدة بهذه القاعدة.
[[تصنيف:توزيع الخوارزميات]]
[[تصنيف:علم الحاسوب]]
[[تصنيف:نظرية المترجم]]