Я стараюсь учить парсеры. Поскольку мои навыки C довольно низки, я набрал в Google PHP Lemon , чтобы узнать о Parser Generators В любом случае, этот код должен быть читабелен и для обычных друзей-лимонов.
Как всегда при обработке вопросов разбора, я сначала пытаюсь создать простой калькулятор.
Итак, мой первый шаг просто такой:
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. Лемон не заботится об оценке? Должен ли я сделать это сам как-нибудь? Но как, если я ничего не получу в этом пункте?