Je suis coincé avec cela depuis un moment maintenant. Je veux analyser quelque chose d'aussi simple que:Grammaire simple pour Lemon LALR Parser
aime: mot1 mot2 .. wordN DÉTESTE: mot1 mot2 .. wordN
J'utilise Lemon + Flex. Pour le moment ma Grammaire ressemble à ceci:
%left LIKES MOODS FROM HATES INFO.
%syntax_error {
std::cout << "Syntax error!" << std::endl;
}
final ::= likes_stmt.
final ::= hates_stmt.
likes_stmt ::= LIKES list(A). { Data *data=Data::getInstance();data->likes.push_back(A);}
hates_stmt ::= HATES list(A). { Data *data=Data::getInstance();data->hates.push_back(A);}
list ::= likes_stmt VALUE(A). { Data *data=Data::getInstance();data->likes.push_back(A);}
list ::= hates_stmt VALUE(A). { Data *data=Data::getInstance();data->hates.push_back(A); }
list(A) ::= VALUE(B). {A=B;}
Mais cela ne fonctionne que pour les 2 premiers mots. Clairement je fais quelque chose de mal, probablement dans la définition récursive? Toute tête haute est appréciée :)
Habituellement, la façon dont cela est fait est d'analyser d'abord, et le post-processus de l'arbre pour recueillir des informations dans diverses catégories. De cette façon, vous ne fausserez pas la grammaire avec des productions artificielles ("set_likes", etc.) dont le seul travail est de signaler aux actions "en-parsing". Dans des langages plus complexes, ces signaux ne font que créer du chagrin parce que l'encombrement de la grammaire et l'analyse de l'enchevêtrement avec le travail. Cependant, si c'est * tout * OP doit faire, alors cette réponse est bien. (Merci pour l'upvote!) –