Я пытаюсь узнать парсеры. Потому что мои навыки 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 '. Лимон не заботится об оценке? Должен ли я сам это делать? Но как, если я ничего не получу в этом вопросе?
Ах, так что даже в простых случаях и должно сказать ясно, что должно случится, иначе он просто ничего не делает. Хорошо. Благодаря! – erikbwork
Странный не так ли? Это согласуется с одной из основных целей дизайна: сделать его менее склонным к ошибкам писать грамматику. В каком-то смысле этот дизайн-дизайн, похоже, имел неприятные последствия, когда вы говорите ему ничего не делать, он ничего не делает, когда вам редко ничего не нужно, вам нужен неявный A = B (если вы знаете, что я имею в виду). – doug65536