J'essaie d'apprendre les parseurs. Parce que mes compétences C sont assez bas, j'ai googlé un PHP Lemon pour apprendre sth sur les générateurs d'analyseurs. Quoi qu'il en soit, le code ici devrait être lisible pour les amis normaux de citron, aussi.Lemon Parser-Generator: Les non-terminaux ne sont-ils pas évalués?
Comme toujours lors de la manipulation des questions d'analyse, je commence par essayer de produire une calculatrice simple en premier.
Ma première étape est simple:
start(A) ::= expr(B). {echo "======RESULT:".A.":".B.":=========".PHP_EOL;}
ce parse le premier test:
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;
... le résultat de:
======RESULT:13:=========
finished. yeah!
Donc, tout comme prévu. Maintenant, nous essayons de préparer une étape qui finalement nous permettra de gérer les opérations, le expression
:
start ::= expr(B). {echo "======RESULT:".B.":=========".PHP_EOL;}
expr ::= VALUE(B). {echo "got a value:".B.PHP_EOL;}
Quand je lance le même test maintenant, je me attends à la même sortie, plus une ligne disant got a value: 13
. Mais je viens d'obtenir ceci:
got a value:13
======RESULT::=========
finished. yeah!
Eh bien, que s'est-il passé? Pourquoi la ligne de résultat est-elle vide? Évidemment expr
évalue à un VALUE
de `13 '. Est-ce que Lemon ne se soucie pas d'évaluer? Est-ce que je dois le faire moi-même d'une manière ou d'une autre? Mais comment, si je n'ai rien sur ce point?
Ah, même dans les cas simples u doit dire clairement ce qu'il se passe, sinon il ne fonctionne tout simplement rien. D'accord. Merci! – erikbwork
Etrange n'est ce pas? Il est cohérent avec l'un des principaux objectifs de conception: faire moins d'erreur sujettes à écrire une grammaire. Dans un sens, ce choix de conception semble avoir échoué, quand vous lui dites de ne rien faire, il ne fait rien, quand vous ne voulez vraiment rien, vous voulez un A = B implicite (si vous savez ce que je veux dire). – doug65536