Lemon Parser-Generator: не оцениваются ли нетерминалы? - PullRequest
1 голос
/ 23 октября 2010

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

1 Ответ

2 голосов
/ 23 октября 2010

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

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