مولد محلل الليمون: هل لم يتم تقييم غير المحطات؟
-
25-09-2019 - |
سؤال
أحاول أن أتعلم المحللين. لأن مهاراتي C منخفضة جدًا ، فأنا غوغل الليمون PHP لتعلم STH عن مولدات المحلل. على أي حال ، يجب أن يكون الكود هنا قابلاً للقراءة لأصدقاء الليمون العاديين أيضًا.
كما هو الحال دائمًا عند التعامل مع الأسئلة المتوفرة ، أبدأ بمحاولة إنتاج آلة حاسبة بسيطة أولاً.
لذا فإن خطوتي الأولى هي ببساطة:
start(A) ::= expr(B). {echo "======RESULT:".A.":".B.":=========".PHP_EOL;}
ما يخلص الاختبار الأول:
include "mysimple.php"; //include the generated Parser
$P = new ParseParser(); //create a Parser object
$P->Parse(ParseParser::VALUE,"13"); // here is the simple test, just understand the Number 13, pls
$P->Parse(0,0); //input is finished, parse!
echo "finished. yeah!".PHP_EOL;
... إلى نتيجة:
======RESULT:13:=========
finished. yeah!
لذلك ، كل شيء كما هو متوقع. الآن نحاول إعداد خطوة تسمح لنا أخيرًا بالتعامل مع العمليات ، expression
:
start ::= expr(B). {echo "======RESULT:".B.":=========".PHP_EOL;}
expr ::= VALUE(B). {echo "got a value:".B.PHP_EOL;}
عندما أقوم بإجراء نفس الاختبار الآن ، أتوقع أن أرى نفس الإخراج ، بالإضافة إلى سطر واحد got a value: 13
. لكنني فقط أحصل على هذا:
got a value:13
======RESULT::=========
finished. yeah!
حسنا ماذا حدث؟ لماذا خط النتيجة فارغ؟ بشكل ملحوظ expr
يقيم إلى أ VALUE
من "13". هل الليمون لا يهتم بالتقييم؟ هل علي أن أفعل ذلك بنفسي بطريقة ما؟ ولكن كيف ، إذا لم أحصل على شيء في هذه النقطة؟
المحلول
هل لا تريد شيئا مثل:
expr(A) ::= VALUE(B). {A = B; echo "got a value:".B.PHP_EOL;}