2017-07-11 3 views
2

J'ai une question sur les actions sémantiques sur l'esprit de boost avec l'opérateurBoost actions sémantiques avec « > » opérateur

Je suis cette règle « > » qui fonctionne parfaitement ..

   ifelse = (iter_pos >> 
         nocaselit(L"if") >> expression >> nocaselit(L"then") >> 
          block_statements_eol >> -ifelse_ifelse >> nocaselit(L"end") >> nocaselit(L"if") >> 
         iter_pos) 
       [_val = construct<common_node>(type_cmd_ifelse,LOCATION(_1,_5), key_cond, _2, key_seq, _3, key_else, phoenix::bind(&makeOptNode, _4))]; 

Pour ajouter un peu gestion des erreurs J'ajoute aussi les trucs on_error à mon analyseur. Pour autant que je l'ai compris, je dois aussi ajouter des "points d'attente" pour que l'erreur soit correcte.

Donc je change la grammaire à celle-ci (remplacez le >> par>) pour donner des informations sur le retour arrière et signaler les erreurs.

   ifelse = (iter_pos >> 
         nocaselit(L"if") > expression > nocaselit(L"then") >> 
          block_statements_eol > -ifelse_ifelse > nocaselit(L"end") > nocaselit(L"if") >> 
         iter_pos) 
       [_val = construct<common_node>(type_cmd_ifelse,LOCATION(_1,_5), key_cond, _2, key_seq, _3, key_else, phoenix::bind(&makeOptNode, _4))]; 

A ce stade, je reçois le C++ erreur du compilateur index non valide pour _3 et _4 .. il semble donc que l'action sémantique doit être changé en quelque sorte, mais je ne sais pas comment.

Répondre

1

La priorité d'opérateur modifie la structure d'attribut synthétisée.

Par exemple, les deux int_ >> int_ >> int_ et int_ > int_ > int_ synthétisent un tuple<int, int, int> mais si vous mélangez les opérateurs de préséance différente, vous obtenez par ex. tuple<int, tuple<int, int> > ou tuple<tuple<int, int>, int>/

Maintenant, pour de nombreux scénarios de propagation d'attributs automatiques, cela ne ferait pas de mal. Mais pour les actions sémantiques, il change la syntaxe pour disséquer l'attribut (voir fusion::at_c<> et phoenix::at_c<>).

Il y a une chance que la sous-documentée

#define BOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT 

peut aider dans des circonstances spécifiques, mais autrement, traiter simplement avec elle.

En général, évitant les actions sémantiques est une bonne ligne directrice (Boost Spirit: "Semantic actions are evil"?).