مولد محلل الليمون: هل لم يتم تقييم غير المحطات؟

StackOverflow https://stackoverflow.com/questions/4003137

  •  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;}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top