2010-10-23 3 views
1

Я пытаюсь узнать парсеры. Потому что мои навыки C довольно низки, я googled PHP Lemon, чтобы узнать о генераторах Parser. В любом случае, код здесь должен быть доступен для обычных друзей лимона.Лимонный анализатор-генератор: Нетерминалы не оцениваются?

Как всегда при обработке вопросов синтаксического анализа, я начинаю с попытки сначала произвести простой калькулятор.

Итак, мой первый шаг просто:

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 '. Лимон не заботится об оценке? Должен ли я сам это делать? Но как, если я ничего не получу в этом вопросе?

ответ

2

Вы не хотите что-то вроде:

expr(A) ::= VALUE(B). {A = B; echo "got a value:".B.PHP_EOL;} 
+0

Ах, так что даже в простых случаях и должно сказать ясно, что должно случится, иначе он просто ничего не делает. Хорошо. Благодаря! – erikbwork

+0

Странный не так ли? Это согласуется с одной из основных целей дизайна: сделать его менее склонным к ошибкам писать грамматику. В каком-то смысле этот дизайн-дизайн, похоже, имел неприятные последствия, когда вы говорите ему ничего не делать, он ничего не делает, когда вам редко ничего не нужно, вам нужен неявный A = B (если вы знаете, что я имею в виду). – doug65536

Смежные вопросы